Vert.x 3、请求处理程序POST、异步CompletionStage或CompletableFuture
Vert.x 3, request handler POST, async CompletionStage or CompletableFuture
class MyVerticle extends AbstractVerticle {
void start ...
router.get("/api/v1/mypostcall").handler(routingContext -> {
...
// I have existing async code, which I want to plug here.
CompletionStage<String> jsonCompletable = ...
// How do I respond using the CompletionStage (or CompletableFuture) to VertX
// so it does not block here ?
}
我也读过 vert.x context,但是 routingContext
是另外一回事,这个例子是关于单元测试的......
您有 Java CompletionStage 之间的集成示例吗?或者我必须使用 RxJava 吗?
如果您的所有阶段都是非阻塞的并且遵循 Vert.x 线程模型(意味着始终使用事件循环),只需使用您编写的可完成未来中的 "handle" 方法响应 (routingContext.response().end(...)) 或报告失败。
如果您正在集成不遵循 Vert.x 线程模型的阶段,您可以使用 https://github.com/cescoffier/vertx-completable-future,它提供了一种始终在 "right" 线程中调用阶段的方法。
CompletableFuture
没有什么特别之处。就像任何异步 api。简单示例,遵循顶点线程模型。计算发生在一些计算上下文中,结果写入顶点事件循环:
public static CompletionStage<String> calculateAsync() {
CompletableFuture<String> completableFuture = new CompletableFuture<>();
Executors.newCachedThreadPool().submit(() -> {
Thread.sleep(5000);
completableFuture.complete("Hello");
return null;
});
return completableFuture;
}
public static void main(String[] args) {
Vertx vertx = Vertx.vertx();
Router router = Router.router(vertx);
Router.router(vertx).get("/api").handler(ctx -> {
calculateAsync().whenComplete((result, e) -> vertx.runOnContext(none -> {
ctx.response().end(result);
}));
});
vertx.createHttpServer().requestHandler(router::accept).listen(8080);
}
class MyVerticle extends AbstractVerticle {
void start ...
router.get("/api/v1/mypostcall").handler(routingContext -> {
...
// I have existing async code, which I want to plug here.
CompletionStage<String> jsonCompletable = ...
// How do I respond using the CompletionStage (or CompletableFuture) to VertX
// so it does not block here ?
}
我也读过 vert.x context,但是 routingContext
是另外一回事,这个例子是关于单元测试的......
您有 Java CompletionStage 之间的集成示例吗?或者我必须使用 RxJava 吗?
如果您的所有阶段都是非阻塞的并且遵循 Vert.x 线程模型(意味着始终使用事件循环),只需使用您编写的可完成未来中的 "handle" 方法响应 (routingContext.response().end(...)) 或报告失败。
如果您正在集成不遵循 Vert.x 线程模型的阶段,您可以使用 https://github.com/cescoffier/vertx-completable-future,它提供了一种始终在 "right" 线程中调用阶段的方法。
CompletableFuture
没有什么特别之处。就像任何异步 api。简单示例,遵循顶点线程模型。计算发生在一些计算上下文中,结果写入顶点事件循环:
public static CompletionStage<String> calculateAsync() {
CompletableFuture<String> completableFuture = new CompletableFuture<>();
Executors.newCachedThreadPool().submit(() -> {
Thread.sleep(5000);
completableFuture.complete("Hello");
return null;
});
return completableFuture;
}
public static void main(String[] args) {
Vertx vertx = Vertx.vertx();
Router router = Router.router(vertx);
Router.router(vertx).get("/api").handler(ctx -> {
calculateAsync().whenComplete((result, e) -> vertx.runOnContext(none -> {
ctx.response().end(result);
}));
});
vertx.createHttpServer().requestHandler(router::accept).listen(8080);
}