Vertx 3支持CompletableFuture吗?

4

我希望用Vertx开发基于Promise的应用程序,CompletableFuture正好适合这个用途,但是JVM在CompletableFuture后台使用fork/join可能会破坏Vertx线程安全。

你有任何想法或者已经在项目中使用过这个特性吗?


1
你尝试过(或者看过)JavaRx吗? - x80486
3个回答

3

此外还有https://github.com/cescoffier/vertx-completable-future。从 README 中可以看到:

该项目提供了 Completable Future API,但强制执行 Vert.x 的线程模型:

  • 当使用 xAsync 方法(没有执行器)时,回调将在 Vert.x 上下文中调用。
  • 当使用非异步方法时,它将使用调用者线程。如果是 Vert.x 线程,则仍使用相同的线程。如果不是由 Vert.x 线程调用,则仍然使用调用者线程。
  • 当使用带有执行器参数的 xAsync 方法时,将使用此执行器来执行回调(不强制执行 Vert.x 线程系统)。

尚未使用过。


2

1
从技术上讲,总是可以在由Vertx管理的线程之外进行异步操作,并返回结果以供Vertx管理的线程使用。关键是在启动异步操作之前使用vertx.getOrCreateContext()获取Context,并在准备好时使用它来返回结果。
假设您有一种Handler<AsyncResult<>>,这是一个示例代码:
public void doAsyncThing(String someParam, String otherParam, Handler<AsyncResult<Void>> resultHandler) {
    Context vertxContext = vertx.getOrCreateContext();
    CompletableFuture<Void> future = 
        someOperatinThatTriggersAsync(someParam, otherParam)
            .handleAsync((unused, throwable) -> {
                vertxContext.runOnContext(unused1 -> {
                    if (throwable == null) {
                      responseHandler.handle(Future.succeededFuture());
                    } else {
                      responseHandler.handle(Future.failedFuture(throwable));
                    }
                });
                return null;
          });
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接