Vertx 3是否支持CompletableFuture?

时间:2016-06-29 13:01:53

标签: java-8 promise vert.x completable-future

我想使用vertx开发我的应用程序承诺样式,并且CompletableFuture非常适合此目的,但JVM在CompletableFuture的背景上使用fork / join,这可能会破坏Vertx线程安全。

您对项目有任何想法或使用此功能吗?

3 个答案:

答案 0 :(得分:3)

还有https://github.com/cescoffier/vertx-completable-future。来自自述文件:

  

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

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

但是还没有使用过。

答案 1 :(得分:2)

是的,这是一个例子http://qrman.github.io/posts/2015/08/28/callback_hell_completablefuture_ftw/

但我认为JavaRx是更好的解决方案,因为它通过vert.x http://vertx.io/docs/vertx-rx/java/支持作为一等公民

答案 2 :(得分:0)

从技术上看,总是可以对非Vertx管理的其他线程执行异步操作,并返回要由Vertx托管线程使用的结果。关键是要获取Context 之前,然后使用vertx.getOrCreateContext()开始异步操作,然后在准备就绪后使用它返回结果。

假设您有某种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;
          });
}