Skip to content

Commit e03cb94

Browse files
committed
Merge branch '2.2.x'
Closes gh-21327
2 parents 1bc41ec + 9ba78db commit e03cb94

File tree

4 files changed

+45
-1
lines changed

4 files changed

+45
-1
lines changed

spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/embedded/undertow/UndertowReactiveWebServerFactory.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ private Undertow.Builder createBuilder(int port) {
141141
else {
142142
builder.addHttpListener(port, getListenAddress());
143143
}
144+
builder.setServerOption(UndertowOptions.SHUTDOWN_TIMEOUT, 0);
144145
for (UndertowBuilderCustomizer customizer : this.builderCustomizers) {
145146
customizer.customize(builder);
146147
}

spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/embedded/undertow/UndertowServletWebServerFactory.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,7 @@ private Builder createBuilder(int port) {
241241
else {
242242
builder.addHttpListener(port, getListenAddress());
243243
}
244+
builder.setServerOption(UndertowOptions.SHUTDOWN_TIMEOUT, 0);
244245
for (UndertowBuilderCustomizer customizer : this.builderCustomizers) {
245246
customizer.customize(builder);
246247
}

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.util.Arrays;
2626
import java.util.concurrent.ArrayBlockingQueue;
2727
import java.util.concurrent.BlockingQueue;
28+
import java.util.concurrent.BrokenBarrierException;
2829
import java.util.concurrent.Callable;
2930
import java.util.concurrent.CountDownLatch;
3031
import java.util.concurrent.Future;
@@ -423,6 +424,25 @@ void whenARequestCompletesDuringGracePeriodThenShutDownGracefullyReturnsTrueBefo
423424
assertThat(responseLatch.await(5, TimeUnit.SECONDS)).isTrue();
424425
}
425426

427+
@Test
428+
void whenARequestIsActiveThenStopWillComplete() throws InterruptedException, BrokenBarrierException {
429+
AbstractReactiveWebServerFactory factory = getFactory();
430+
BlockingHandler blockingHandler = new BlockingHandler();
431+
this.webServer = factory.getWebServer(blockingHandler);
432+
this.webServer.start();
433+
Mono<ResponseEntity<Void>> request = getWebClient(this.webServer.getPort()).build().get().retrieve()
434+
.toBodilessEntity();
435+
AtomicReference<ResponseEntity<Void>> responseReference = new AtomicReference<>();
436+
CountDownLatch responseLatch = new CountDownLatch(1);
437+
request.subscribe((response) -> {
438+
responseReference.set(response);
439+
responseLatch.countDown();
440+
});
441+
blockingHandler.awaitQueue();
442+
this.webServer.stop();
443+
blockingHandler.completeOne();
444+
}
445+
426446
protected WebClient prepareCompressionTest() {
427447
Compression compression = new Compression();
428448
compression.setEnabled(true);

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

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1147,6 +1147,25 @@ void whenAnAsyncRequestCompletesAndTheConnectionIsClosedDuringGracePeriodThenShu
11471147
assertThat(request.get(30, TimeUnit.SECONDS)).isInstanceOf(HttpResponse.class);
11481148
}
11491149

1150+
@Test
1151+
void whenARequestIsActiveThenStopWillComplete() throws InterruptedException, BrokenBarrierException {
1152+
AbstractServletWebServerFactory factory = getFactory();
1153+
BlockingServlet blockingServlet = new BlockingServlet();
1154+
this.webServer = factory
1155+
.getWebServer((context) -> context.addServlet("blockingServlet", blockingServlet).addMapping("/"));
1156+
this.webServer.start();
1157+
int port = this.webServer.getPort();
1158+
initiateGetRequest(port, "/");
1159+
blockingServlet.awaitQueue();
1160+
this.webServer.stop();
1161+
try {
1162+
blockingServlet.admitOne();
1163+
}
1164+
catch (RuntimeException ex) {
1165+
1166+
}
1167+
}
1168+
11501169
protected Future<Boolean> initiateGracefulShutdown() {
11511170
RunnableFuture<Boolean> future = new FutureTask<Boolean>(() -> this.webServer.shutDownGracefully());
11521171
new Thread(future).start();
@@ -1524,7 +1543,10 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws Se
15241543

15251544
public void admitOne() {
15261545
try {
1527-
this.barriers.take().await();
1546+
CyclicBarrier barrier = this.barriers.take();
1547+
if (!barrier.isBroken()) {
1548+
barrier.await();
1549+
}
15281550
}
15291551
catch (InterruptedException ex) {
15301552
Thread.currentThread().interrupt();

0 commit comments

Comments
 (0)