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吗?
答案 0 :(得分:2)
CompletableFuture
没什么特别之处。它就像任何异步api一样。简单的例子,遵循vertx线程模型。计算在某些计算上下文中发生,结果写在vertx事件循环上:
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);
}
答案 1 :(得分:1)
如果你的所有阶段都是非阻塞的并且遵循Vert.x线程模型(意味着总是使用事件循环),那么只需使用&#34; handle&#34;您可完成的未来的方法,您可以在其中编写响应(routingContext.response()。end(...))或报告失败。
如果要整合不遵循Vert.x线程模型的阶段,可以使用https://github.com/cescoffier/vertx-completable-future提供一种始终在&#34;右边&#34;中调用阶段的方法。线程。