Vert.x 3,请求处理程序POST,异步CompletionStage或CompletableFuture

时间:2017-09-28 10:43:42

标签: java asynchronous vert.x

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吗?

2 个答案:

答案 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;中调用阶段的方法。线程。