Skip to content

Commit f6d8c7d

Browse files
committed
Simplify ReactiveWebServerApplicationContext.ServerManager
Closes gh-21315
1 parent a688ac3 commit f6d8c7d

File tree

3 files changed

+113
-35
lines changed

3 files changed

+113
-35
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
/*
2+
* Copyright 2012-2020 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.actuate.autoconfigure.web.reactive;
18+
19+
import java.util.Map;
20+
21+
import org.springframework.boot.web.reactive.server.AbstractReactiveWebServerFactory;
22+
import org.springframework.boot.web.reactive.server.ReactiveWebServerFactory;
23+
import org.springframework.boot.web.server.WebServer;
24+
import org.springframework.boot.web.server.WebServerException;
25+
import org.springframework.http.server.reactive.HttpHandler;
26+
27+
import static org.mockito.Mockito.spy;
28+
29+
/**
30+
* Mock {@link ReactiveWebServerFactory}.
31+
*
32+
* @author Brian Clozel
33+
*/
34+
class MockReactiveWebServerFactory extends AbstractReactiveWebServerFactory {
35+
36+
private MockReactiveWebServer webServer;
37+
38+
@Override
39+
public WebServer getWebServer(HttpHandler httpHandler) {
40+
this.webServer = spy(new MockReactiveWebServer(httpHandler, getPort()));
41+
return this.webServer;
42+
}
43+
44+
MockReactiveWebServer getWebServer() {
45+
return this.webServer;
46+
}
47+
48+
static class MockReactiveWebServer implements WebServer {
49+
50+
private final int port;
51+
52+
private HttpHandler httpHandler;
53+
54+
private Map<String, HttpHandler> httpHandlerMap;
55+
56+
MockReactiveWebServer(HttpHandler httpHandler, int port) {
57+
this.httpHandler = httpHandler;
58+
this.port = port;
59+
}
60+
61+
MockReactiveWebServer(Map<String, HttpHandler> httpHandlerMap, int port) {
62+
this.httpHandlerMap = httpHandlerMap;
63+
this.port = port;
64+
}
65+
66+
HttpHandler getHttpHandler() {
67+
return this.httpHandler;
68+
}
69+
70+
Map<String, HttpHandler> getHttpHandlerMap() {
71+
return this.httpHandlerMap;
72+
}
73+
74+
@Override
75+
public void start() throws WebServerException {
76+
77+
}
78+
79+
@Override
80+
public void stop() throws WebServerException {
81+
82+
}
83+
84+
@Override
85+
public int getPort() {
86+
return this.port;
87+
}
88+
89+
}
90+
91+
}

spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/web/reactive/ReactiveManagementContextFactoryTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ static class ParentConfiguration {
6060

6161
@Bean
6262
ReactiveWebServerFactory reactiveWebServerFactory() {
63-
return mock(ReactiveWebServerFactory.class);
63+
return new MockReactiveWebServerFactory();
6464
}
6565

6666
@Bean

spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/reactive/context/ReactiveWebServerApplicationContext.java

Lines changed: 21 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.springframework.http.server.reactive.HttpHandler;
3232
import org.springframework.http.server.reactive.ServerHttpRequest;
3333
import org.springframework.http.server.reactive.ServerHttpResponse;
34+
import org.springframework.util.Assert;
3435
import org.springframework.util.StringUtils;
3536

3637
/**
@@ -90,7 +91,7 @@ private void createWebServer() {
9091
String webServerFactoryBeanName = getWebServerFactoryBeanName();
9192
ReactiveWebServerFactory webServerFactory = getWebServerFactory(webServerFactoryBeanName);
9293
boolean lazyInit = getBeanFactory().getBeanDefinition(webServerFactoryBeanName).isLazyInit();
93-
this.serverManager = ServerManager.get(webServerFactory, lazyInit);
94+
this.serverManager = new ServerManager(webServerFactory, lazyInit);
9495
}
9596
initPropertySources();
9697
}
@@ -124,8 +125,11 @@ protected void finishRefresh() {
124125

125126
private WebServer startReactiveWebServer() {
126127
ServerManager serverManager = this.serverManager;
127-
ServerManager.start(serverManager, this::getHttpHandler);
128-
return ServerManager.getWebServer(serverManager);
128+
if (serverManager != null) {
129+
serverManager.start(this::getHttpHandler);
130+
return serverManager.server;
131+
}
132+
return null;
129133
}
130134

131135
/**
@@ -166,11 +170,13 @@ protected void onClose() {
166170

167171
private void stopAndReleaseReactiveWebServer() {
168172
ServerManager serverManager = this.serverManager;
169-
try {
170-
ServerManager.stop(serverManager);
171-
}
172-
finally {
173-
this.serverManager = null;
173+
if (serverManager != null) {
174+
try {
175+
serverManager.server.stop();
176+
}
177+
finally {
178+
this.serverManager = null;
179+
}
174180
}
175181
}
176182

@@ -181,7 +187,8 @@ private void stopAndReleaseReactiveWebServer() {
181187
*/
182188
@Override
183189
public WebServer getWebServer() {
184-
return ServerManager.getWebServer(this.serverManager);
190+
ServerManager serverManager = this.serverManager;
191+
return (serverManager != null) ? serverManager.server : null;
185192
}
186193

187194
@Override
@@ -225,6 +232,7 @@ static final class ServerManager implements HttpHandler {
225232
private volatile HttpHandler handler;
226233

227234
private ServerManager(ReactiveWebServerFactory factory, boolean lazyInit) {
235+
Assert.notNull(factory, "ReactiveWebServerFactory must not be null");
228236
this.handler = this::handleUninitialized;
229237
this.server = factory.getWebServer(this);
230238
this.lazyInit = lazyInit;
@@ -243,31 +251,10 @@ HttpHandler getHandler() {
243251
return this.handler;
244252
}
245253

246-
static ServerManager get(ReactiveWebServerFactory factory, boolean lazyInit) {
247-
return new ServerManager(factory, lazyInit);
248-
}
249-
250-
static WebServer getWebServer(ServerManager manager) {
251-
return (manager != null) ? manager.server : null;
252-
}
253-
254-
static void start(ServerManager manager, Supplier<HttpHandler> handlerSupplier) {
255-
if (manager != null && manager.server != null) {
256-
manager.handler = manager.lazyInit ? new LazyHttpHandler(Mono.fromSupplier(handlerSupplier))
257-
: handlerSupplier.get();
258-
manager.server.start();
259-
}
260-
}
261-
262-
static void stop(ServerManager manager) {
263-
if (manager != null && manager.server != null) {
264-
try {
265-
manager.server.stop();
266-
}
267-
catch (Exception ex) {
268-
throw new IllegalStateException(ex);
269-
}
270-
}
254+
private void start(Supplier<HttpHandler> handlerSupplier) {
255+
this.handler = this.lazyInit ? new LazyHttpHandler(Mono.fromSupplier(handlerSupplier))
256+
: handlerSupplier.get();
257+
this.server.start();
271258
}
272259

273260
}

0 commit comments

Comments
 (0)