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);
}