@@ -42,9 +42,7 @@ public class ReactiveWebServerApplicationContext
42
42
extends GenericReactiveWebApplicationContext
43
43
implements ConfigurableWebServerApplicationContext {
44
44
45
- private volatile WebServer webServer ;
46
-
47
- private volatile DeferredHttpHandler httpHandler ;
45
+ private volatile ServerManager serverManager ;
48
46
49
47
private String serverNamespace ;
50
48
@@ -87,41 +85,13 @@ protected void onRefresh() {
87
85
}
88
86
89
87
private void createWebServer () {
90
- WebServer localServer = this .webServer ;
91
- if (localServer == null ) {
92
- DeferredHttpHandler localHandler = new DeferredHttpHandler (
93
- this ::getHttpHandler );
94
- this .webServer = getWebServerFactory ().getWebServer (localHandler );
95
- this .httpHandler = localHandler ;
88
+ ServerManager serverManager = this .serverManager ;
89
+ if (serverManager == null ) {
90
+ this .serverManager = ServerManager .get (getWebServerFactory ());
96
91
}
97
92
initPropertySources ();
98
93
}
99
94
100
- @ Override
101
- protected void finishRefresh () {
102
- super .finishRefresh ();
103
- WebServer localServer = startReactiveWebServer ();
104
- if (localServer != null ) {
105
- publishEvent (new ReactiveWebServerInitializedEvent (localServer , this ));
106
- }
107
- }
108
-
109
- @ Override
110
- protected void onClose () {
111
- super .onClose ();
112
- stopAndReleaseReactiveWebServer ();
113
- }
114
-
115
- /**
116
- * Returns the {@link WebServer} that was created by the context or {@code null} if
117
- * the server has not yet been created.
118
- * @return the web server
119
- */
120
- @ Override
121
- public WebServer getWebServer () {
122
- return this .webServer ;
123
- }
124
-
125
95
/**
126
96
* Return the {@link ReactiveWebServerFactory} that should be used to create the
127
97
* reactive web server. By default this method searches for a suitable bean in the
@@ -146,6 +116,21 @@ protected ReactiveWebServerFactory getWebServerFactory() {
146
116
return getBeanFactory ().getBean (beanNames [0 ], ReactiveWebServerFactory .class );
147
117
}
148
118
119
+ @ Override
120
+ protected void finishRefresh () {
121
+ super .finishRefresh ();
122
+ WebServer webServer = startReactiveWebServer ();
123
+ if (webServer != null ) {
124
+ publishEvent (new ReactiveWebServerInitializedEvent (webServer , this ));
125
+ }
126
+ }
127
+
128
+ private WebServer startReactiveWebServer () {
129
+ ServerManager serverManager = this .serverManager ;
130
+ ServerManager .start (serverManager , this ::getHttpHandler );
131
+ return ServerManager .getWebServer (serverManager );
132
+ }
133
+
149
134
/**
150
135
* Return the {@link HttpHandler} that should be used to process the reactive web
151
136
* server. By default this method searches for a suitable bean in the context itself.
@@ -166,32 +151,32 @@ protected HttpHandler getHttpHandler() {
166
151
return getBeanFactory ().getBean (beanNames [0 ], HttpHandler .class );
167
152
}
168
153
169
- private WebServer startReactiveWebServer () {
170
- WebServer localServer = this .webServer ;
171
- DeferredHttpHandler localHandler = this .httpHandler ;
172
- if (localServer != null ) {
173
- if (localHandler != null ) {
174
- localHandler .initialize ();
175
- this .httpHandler = null ;
176
- }
177
- localServer .start ();
178
- }
179
- return localServer ;
154
+ @ Override
155
+ protected void onClose () {
156
+ super .onClose ();
157
+ stopAndReleaseReactiveWebServer ();
180
158
}
181
159
182
160
private void stopAndReleaseReactiveWebServer () {
183
- WebServer localServer = this .webServer ;
184
- if (localServer != null ) {
185
- try {
186
- localServer .stop ();
187
- this .webServer = null ;
188
- }
189
- catch (Exception ex ) {
190
- throw new IllegalStateException (ex );
191
- }
161
+ ServerManager serverManager = this .serverManager ;
162
+ try {
163
+ ServerManager .stop (serverManager );
164
+ }
165
+ finally {
166
+ this .serverManager = null ;
192
167
}
193
168
}
194
169
170
+ /**
171
+ * Returns the {@link WebServer} that was created by the context or {@code null} if
172
+ * the server has not yet been created.
173
+ * @return the web server
174
+ */
175
+ @ Override
176
+ public WebServer getWebServer () {
177
+ return ServerManager .getWebServer (this .serverManager );
178
+ }
179
+
195
180
@ Override
196
181
public String getServerNamespace () {
197
182
return this .serverNamespace ;
@@ -203,22 +188,18 @@ public void setServerNamespace(String serverNamespace) {
203
188
}
204
189
205
190
/**
206
- * {@link HttpHandler} that defers to a supplied handler which is initialized only
207
- * when the server starts .
191
+ * Internal class used to manage the server and the {@link HttpHandler}, taking care
192
+ * not to initialize the hander too early .
208
193
*/
209
- static class DeferredHttpHandler implements HttpHandler {
194
+ static final class ServerManager implements HttpHandler {
210
195
211
- private Supplier < HttpHandler > factory ;
196
+ private final WebServer server ;
212
197
213
- private HttpHandler handler ;
198
+ private volatile HttpHandler handler ;
214
199
215
- DeferredHttpHandler (Supplier <HttpHandler > factory ) {
216
- this .factory = factory ;
200
+ private ServerManager (ReactiveWebServerFactory factory ) {
217
201
this .handler = this ::handleUninitialized ;
218
- }
219
-
220
- public void initialize () {
221
- this .handler = this .factory .get ();
202
+ this .server = factory .getWebServer (this );
222
203
}
223
204
224
205
private Mono <Void > handleUninitialized (ServerHttpRequest request ,
@@ -236,6 +217,33 @@ public HttpHandler getHandler() {
236
217
return this .handler ;
237
218
}
238
219
220
+ public static ServerManager get (ReactiveWebServerFactory factory ) {
221
+ return new ServerManager (factory );
222
+ }
223
+
224
+ public static WebServer getWebServer (ServerManager manager ) {
225
+ return (manager != null ) ? manager .server : null ;
226
+ }
227
+
228
+ public static void start (ServerManager manager ,
229
+ Supplier <HttpHandler > handlerSupplier ) {
230
+ if (manager != null ) {
231
+ manager .handler = handlerSupplier .get ();
232
+ manager .server .start ();
233
+ }
234
+ }
235
+
236
+ public static void stop (ServerManager manager ) {
237
+ if (manager != null ) {
238
+ try {
239
+ manager .server .stop ();
240
+ }
241
+ catch (Exception ex ) {
242
+ throw new IllegalStateException (ex );
243
+ }
244
+ }
245
+ }
246
+
239
247
}
240
248
241
249
}
0 commit comments