Skip to content

Commit 879f362

Browse files
committed
Merge branch '2.4.x'
Closes gh-26608
2 parents 66d0878 + 64e76ba commit 879f362

File tree

4 files changed

+51
-0
lines changed

4 files changed

+51
-0
lines changed

spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/embedded/jetty/JettyReactiveWebServerFactory.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ protected Server createJettyServer(JettyHttpHandlerAdapter servlet) {
172172
InetSocketAddress address = new InetSocketAddress(getAddress(), port);
173173
Server server = new Server(getThreadPool());
174174
server.addConnector(createConnector(address, server));
175+
server.setStopTimeout(0);
175176
ServletHolder servletHolder = new ServletHolder(servlet);
176177
servletHolder.setAsyncSupported(true);
177178
ServletContextHandler contextHandler = new ServletContextHandler(server, "/", false, false);

spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/embedded/jetty/JettyServletWebServerFactory.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ public WebServer getWebServer(ServletContextInitializer... initializers) {
173173
private Server createServer(InetSocketAddress address) {
174174
Server server = new Server(getThreadPool());
175175
server.setConnectors(new Connector[] { createConnector(address, server) });
176+
server.setStopTimeout(0);
176177
return server;
177178
}
178179

spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/reactive/server/AbstractReactiveWebServerFactoryTests.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,30 @@ void givenAnInflightRequestWhenTheServerIsStoppedThenGracefulShutdownCallbackIsC
431431
blockingHandler.completeOne();
432432
}
433433

434+
@Test
435+
void whenARequestIsActiveAfterGracefulShutdownEndsThenStopWillComplete() throws InterruptedException {
436+
AbstractReactiveWebServerFactory factory = getFactory();
437+
factory.setShutdown(Shutdown.GRACEFUL);
438+
BlockingHandler blockingHandler = new BlockingHandler();
439+
this.webServer = factory.getWebServer(blockingHandler);
440+
this.webServer.start();
441+
Mono<ResponseEntity<Void>> request = getWebClient(this.webServer.getPort()).build().get().retrieve()
442+
.toBodilessEntity();
443+
AtomicReference<ResponseEntity<Void>> responseReference = new AtomicReference<>();
444+
CountDownLatch responseLatch = new CountDownLatch(1);
445+
request.subscribe((response) -> {
446+
responseReference.set(response);
447+
responseLatch.countDown();
448+
});
449+
blockingHandler.awaitQueue();
450+
AtomicReference<GracefulShutdownResult> result = new AtomicReference<>();
451+
this.webServer.shutDownGracefully(result::set);
452+
this.webServer.stop();
453+
Awaitility.await().atMost(Duration.ofSeconds(30))
454+
.until(() -> GracefulShutdownResult.REQUESTS_ACTIVE == result.get());
455+
blockingHandler.completeOne();
456+
}
457+
434458
@Test
435459
void whenARequestIsActiveThenStopWillComplete() throws InterruptedException, BrokenBarrierException {
436460
AbstractReactiveWebServerFactory factory = getFactory();

spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/server/AbstractServletWebServerFactoryTests.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1159,6 +1159,31 @@ protected void whenHttp2IsEnabledAndSslIsDisabledThenHttp11CanStillBeUsed()
11591159
assertThat(getResponse("http://localhost:" + this.webServer.getPort() + "/hello")).isEqualTo("Hello World");
11601160
}
11611161

1162+
@Test
1163+
void whenARequestIsActiveAfterGracefulShutdownEndsThenStopWillComplete()
1164+
throws InterruptedException, BrokenBarrierException {
1165+
AbstractServletWebServerFactory factory = getFactory();
1166+
factory.setShutdown(Shutdown.GRACEFUL);
1167+
BlockingServlet blockingServlet = new BlockingServlet();
1168+
this.webServer = factory
1169+
.getWebServer((context) -> context.addServlet("blockingServlet", blockingServlet).addMapping("/"));
1170+
this.webServer.start();
1171+
int port = this.webServer.getPort();
1172+
initiateGetRequest(port, "/");
1173+
blockingServlet.awaitQueue();
1174+
AtomicReference<GracefulShutdownResult> result = new AtomicReference<>();
1175+
this.webServer.shutDownGracefully(result::set);
1176+
this.webServer.stop();
1177+
Awaitility.await().atMost(Duration.ofSeconds(30))
1178+
.until(() -> GracefulShutdownResult.REQUESTS_ACTIVE == result.get());
1179+
try {
1180+
blockingServlet.admitOne();
1181+
}
1182+
catch (RuntimeException ex) {
1183+
1184+
}
1185+
}
1186+
11621187
protected Future<Object> initiateGetRequest(int port, String path) {
11631188
return initiateGetRequest(HttpClients.createMinimal(), port, path);
11641189
}

0 commit comments

Comments
 (0)