Skip to content

Commit 73e1aaa

Browse files
stuartwdouglasgsmet
authored andcommitted
Make sure request resumes on correct thread
Fixes #9693
1 parent 683d783 commit 73e1aaa

File tree

4 files changed

+52
-12
lines changed

4 files changed

+52
-12
lines changed

extensions/vertx-http/deployment/src/main/java/io/quarkus/vertx/http/deployment/VertxHttpProcessor.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,11 +103,10 @@ public KubernetesPortBuildItem kubernetes() {
103103
@Record(ExecutionTime.RUNTIME_INIT)
104104
VertxWebRouterBuildItem initializeRouter(VertxHttpRecorder recorder,
105105
CoreVertxBuildItem vertx,
106-
List<RouteBuildItem> routes, LaunchModeBuildItem launchModeBuildItem,
106+
List<RouteBuildItem> routes,
107107
ShutdownContextBuildItem shutdown) {
108108

109-
RuntimeValue<Router> router = recorder.initializeRouter(vertx.getVertx(), launchModeBuildItem.getLaunchMode(),
110-
shutdown);
109+
RuntimeValue<Router> router = recorder.initializeRouter(vertx.getVertx());
111110
for (RouteBuildItem route : routes) {
112111
recorder.addRoute(router, route.getRouteFunction(), route.getHandler(), route.getType());
113112
}

extensions/vertx-http/runtime/src/main/java/io/quarkus/vertx/http/runtime/VertxHttpRecorder.java

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -180,15 +180,10 @@ public Integer get() {
180180
}
181181
}
182182

183-
public RuntimeValue<Router> initializeRouter(final Supplier<Vertx> vertxRuntimeValue,
184-
final LaunchMode launchMode, final ShutdownContext shutdownContext) {
183+
public RuntimeValue<Router> initializeRouter(final Supplier<Vertx> vertxRuntimeValue) {
185184

186185
Vertx vertx = vertxRuntimeValue.get();
187186
Router router = Router.router(vertx);
188-
if (hotReplacementHandler != null) {
189-
router.route().order(Integer.MIN_VALUE).handler(hotReplacementHandler);
190-
}
191-
192187
return new RuntimeValue<>(router);
193188
}
194189

@@ -294,14 +289,14 @@ public void handle(Void e) {
294289
Handler<HttpServerRequest> root;
295290
if (rootPath.equals("/")) {
296291
if (hotReplacementHandler != null) {
297-
router.route().order(-1).handler(hotReplacementHandler);
292+
router.route().order(Integer.MIN_VALUE).handler(hotReplacementHandler);
298293
}
299294
root = router;
300295
} else {
301296
Router mainRouter = Router.router(vertx.get());
302297
mainRouter.mountSubRouter(rootPath, router);
303298
if (hotReplacementHandler != null) {
304-
mainRouter.route().order(-1).handler(hotReplacementHandler);
299+
mainRouter.route().order(Integer.MIN_VALUE).handler(hotReplacementHandler);
305300
}
306301
root = mainRouter;
307302
}

extensions/vertx-http/runtime/src/main/java/io/quarkus/vertx/http/runtime/devmode/VertxHttpHotReplacementSetup.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import io.vertx.core.Handler;
88
import io.vertx.core.Promise;
99
import io.vertx.core.http.HttpServerResponse;
10+
import io.vertx.core.net.impl.ConnectionBase;
1011
import io.vertx.ext.web.RoutingContext;
1112

1213
public class VertxHttpHotReplacementSetup implements HotReplacementSetup {
@@ -39,7 +40,8 @@ void handleHotReplacementRequest(RoutingContext routingContext) {
3940
routingContext.next();
4041
return;
4142
}
42-
routingContext.vertx().executeBlocking(new Handler<Promise<Boolean>>() {
43+
ConnectionBase connectionBase = (ConnectionBase) routingContext.request().connection();
44+
connectionBase.getContext().executeBlocking(new Handler<Promise<Boolean>>() {
4345
@Override
4446
public void handle(Promise<Boolean> event) {
4547
boolean restart = false;
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package io.quarkus.vertx.web;
2+
3+
import java.util.function.Function;
4+
5+
import org.hamcrest.Matchers;
6+
import org.jboss.shrinkwrap.api.ShrinkWrap;
7+
import org.jboss.shrinkwrap.api.spec.JavaArchive;
8+
import org.junit.jupiter.api.Test;
9+
import org.junit.jupiter.api.extension.RegisterExtension;
10+
11+
import io.quarkus.test.QuarkusDevModeTest;
12+
import io.restassured.RestAssured;
13+
14+
public class VertxWebDevModeTestCase {
15+
16+
@RegisterExtension
17+
static QuarkusDevModeTest runner = new QuarkusDevModeTest()
18+
.setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)
19+
.addClasses(TestRoute.class));
20+
21+
@Test
22+
public void testRunningInDevMode() {
23+
RestAssured.given()
24+
.body("OK")
25+
.post("/test")
26+
.then().statusCode(200)
27+
.body(Matchers.equalTo("test route"));
28+
29+
runner.modifySourceFile(TestRoute.class, new Function<String, String>() {
30+
@Override
31+
public String apply(String s) {
32+
return s.replace("test route", "new code");
33+
}
34+
});
35+
for (int i = 0; i < 10; ++i) {
36+
RestAssured.given()
37+
.body("OK")
38+
.post("/test")
39+
.then().statusCode(200)
40+
.body(Matchers.equalTo("new code"));
41+
}
42+
}
43+
44+
}

0 commit comments

Comments
 (0)