Skip to content

Commit 25c6a78

Browse files
Merge pull request #10176 from stuartwdouglas/9693
Make sure request resumes on correct thread
2 parents b9f1258 + 6f781d2 commit 25c6a78

File tree

7 files changed

+113
-16
lines changed

7 files changed

+113
-16
lines changed

core/deployment/src/main/java/io/quarkus/deployment/dev/DevModeMain.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,12 +102,14 @@ public void start() throws Exception {
102102

103103
QuarkusBootstrap.Builder bootstrapBuilder = QuarkusBootstrap.builder()
104104
.setApplicationRoot(appRoots.build())
105-
.setTargetDirectory(context.getDevModeRunnerJarFile().getParentFile().toPath())
106105
.setIsolateDeployment(true)
107106
.setLocalProjectDiscovery(context.isLocalProjectDiscovery())
108107
.addAdditionalDeploymentArchive(path)
109108
.setBaseName(context.getBaseName())
110109
.setMode(context.getMode());
110+
if (context.getDevModeRunnerJarFile() != null) {
111+
bootstrapBuilder.setTargetDirectory(context.getDevModeRunnerJarFile().getParentFile().toPath());
112+
}
111113
if (context.getProjectDir() != null) {
112114
bootstrapBuilder.setProjectRoot(context.getProjectDir().toPath());
113115
} else {

extensions/vertx-core/runtime/src/main/java/io/quarkus/vertx/core/runtime/VertxCoreRecorder.java

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ public class VertxCoreRecorder {
5353

5454
public Supplier<Vertx> configureVertx(VertxConfiguration config,
5555
LaunchMode launchMode, ShutdownContext shutdown, List<Consumer<VertxOptions>> customizers) {
56-
vertx = new VertxSupplier(config, customizers);
5756
if (launchMode != LaunchMode.DEVELOPMENT) {
57+
vertx = new VertxSupplier(config, customizers);
5858
// we need this to be part of the last shutdown tasks because closing it early (basically before Arc)
5959
// could cause problem to beans that rely on Vert.x and contain shutdown tasks
6060
shutdown.addLastShutdownTask(new Runnable() {
@@ -63,6 +63,31 @@ public void run() {
6363
destroy();
6464
}
6565
});
66+
} else {
67+
if (vertx == null) {
68+
vertx = new VertxSupplier(config, customizers);
69+
} else if (vertx.v != null) {
70+
tryCleanTccl(vertx.v);
71+
}
72+
shutdown.addLastShutdownTask(new Runnable() {
73+
@Override
74+
public void run() {
75+
CountDownLatch latch = new CountDownLatch(1);
76+
if (vertx.v != null) {
77+
vertx.v.eventBus().close(new Handler<AsyncResult<Void>>() {
78+
@Override
79+
public void handle(AsyncResult<Void> event) {
80+
vertx.v.eventBus().start(new Handler<AsyncResult<Void>>() {
81+
@Override
82+
public void handle(AsyncResult<Void> event) {
83+
latch.countDown();
84+
}
85+
});
86+
}
87+
});
88+
}
89+
}
90+
});
6691
}
6792
return vertx;
6893
}
@@ -303,7 +328,8 @@ public Supplier<EventLoopGroup> bossSupplier() {
303328
return new Supplier<EventLoopGroup>() {
304329
@Override
305330
public EventLoopGroup get() {
306-
return ((VertxImpl) vertx.get()).getAcceptorEventLoopGroup();
331+
vertx.get();
332+
return ((VertxImpl) vertx.v).getAcceptorEventLoopGroup();
307333
}
308334
};
309335
}

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: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -188,15 +188,10 @@ public Integer get() {
188188
}
189189
}
190190

191-
public RuntimeValue<Router> initializeRouter(final Supplier<Vertx> vertxRuntimeValue,
192-
final LaunchMode launchMode, final ShutdownContext shutdownContext) {
191+
public RuntimeValue<Router> initializeRouter(final Supplier<Vertx> vertxRuntimeValue) {
193192

194193
Vertx vertx = vertxRuntimeValue.get();
195194
Router router = Router.router(vertx);
196-
if (hotReplacementHandler != null) {
197-
router.route().order(Integer.MIN_VALUE).handler(hotReplacementHandler);
198-
}
199-
200195
return new RuntimeValue<>(router);
201196
}
202197

@@ -260,7 +255,7 @@ public void finalizeRouter(BeanContainer container, Consumer<Route> defaultRoute
260255
if (requireBodyHandler) {
261256
//if this is set then everything needs the body handler installed
262257
//TODO: config etc
263-
router.route().order(Integer.MIN_VALUE).handler(new Handler<RoutingContext>() {
258+
router.route().order(Integer.MIN_VALUE + 1).handler(new Handler<RoutingContext>() {
264259
@Override
265260
public void handle(RoutingContext routingContext) {
266261
routingContext.request().resume();
@@ -302,14 +297,14 @@ public void handle(Void e) {
302297
Handler<HttpServerRequest> root;
303298
if (rootPath.equals("/")) {
304299
if (hotReplacementHandler != null) {
305-
router.route().order(-1).handler(hotReplacementHandler);
300+
router.route().order(Integer.MIN_VALUE).handler(hotReplacementHandler);
306301
}
307302
root = router;
308303
} else {
309304
Router mainRouter = Router.router(vertx.get());
310305
mainRouter.mountSubRouter(rootPath, router);
311306
if (hotReplacementHandler != null) {
312-
mainRouter.route().order(-1).handler(hotReplacementHandler);
307+
mainRouter.route().order(Integer.MIN_VALUE).handler(hotReplacementHandler);
313308
}
314309
root = mainRouter;
315310
}

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: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package io.quarkus.vertx.web;
2+
3+
import static io.vertx.core.http.HttpMethod.GET;
4+
import static io.vertx.core.http.HttpMethod.OPTIONS;
5+
import static io.vertx.core.http.HttpMethod.POST;
6+
7+
import io.quarkus.vertx.core.runtime.VertxCoreRecorder;
8+
import io.vertx.ext.web.RoutingContext;
9+
10+
public class DevModeRoute {
11+
12+
@Route(path = "/test", methods = { GET, OPTIONS, POST })
13+
void getRoutes(RoutingContext context) {
14+
context.response().setStatusCode(200).end("test route");
15+
}
16+
17+
@Route(path = "/assert", methods = GET)
18+
void assertVertx(RoutingContext context) {
19+
if (VertxCoreRecorder.getVertx().get() == context.vertx()) {
20+
context.response().end("OK");
21+
} else {
22+
context.fail(new RuntimeException("Incorrect vertx in use"));
23+
}
24+
}
25+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
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(DevModeRoute.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(DevModeRoute.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+
RestAssured.given()
43+
.get("/assert")
44+
.then().statusCode(200)
45+
.body(Matchers.equalTo("OK"));
46+
}
47+
48+
}

0 commit comments

Comments
 (0)