RxJava中等效的VertX CompositeFuture

时间:2018-05-03 14:47:53

标签: java rx-java reactive-programming vert.x

当您需要查询多个异步资源并在一次操作中全部使用它们时的VertX示例:

Future<HttpServer> httpServerFuture = Future.future();
httpServer.listen(httpServerFuture.completer());

Future<NetServer> netServerFuture = Future.future();
netServer.listen(netServerFuture.completer());

CompositeFuture.all(httpServerFuture, netServerFuture).setHandler(ar -> {
  if (ar.succeeded()) {
    // All servers started
  } else {
    // At least one server failed
  }
});

我们需要查询两个不同的数据库,然后在业务逻辑中使用结果,但流程是等效的。

VertX / RxJava的等价物是什么?

目前人们通过在每次需要新变量时嵌套一个新的.flatMap()调用来做到这一点。我觉得必须有更好的方法......

我们实际上并不需要查询是并发的,但我们需要缓存两个结果并同时将它们传递给业务逻辑。

1 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点,但我试图选择一种与您的样本密切相关的方法:

@Override
public void start(Future<Void> startFuture) throws Exception {
    final HttpServer httpServer = vertx.createHttpServer();
    final Completable initializeHttpServer = httpServer.rxListen().toCompletable();

    final NetServer netServer = vertx.createNetServer();
    final Completable initializeNetServer = netServer.rxListen().toCompletable();

    initializeHttpServer.andThen(initializeNetServer)
        .subscribe(
            ()    -> { /* All servers started */ },
            error -> { /* At least one server failed */ }
        );
}

rxListen()次调用转换为Completable个实例,然后在订阅时按顺序运行。

  • 当两个服务器都绑定到各自的端​​口时,将调用订阅者的onComplete回调,或者......
  • 如果发生异常,将调用onError回调

(另外,fwiw,“嵌套”flatMap操作对于一些微不足道的操作不应该是必要的。但是“链接”此类操作将是习惯用法。)

希望有所帮助!

<强> - UPDATE -

更仔细地阅读了这个问题,我现在看到你实际上在询问如何处理两个离散异步操作的结果。

替代flatMap组合结果的方法是使用zip运算符,如下所示:

    @Override
    public void start(Future<Void> startFuture) throws Exception {
        final Single<String> dbQuery1 = Single.fromCallable(() -> { return "db-query-result-1"; });
        final Single<String> dbQuery2 = Single.fromCallable(() -> { return "db-query-result-2"; });

        Single.zip(dbQuery1, dbQuery2, (result1, result2) -> {
            // handle the results from both db queries
            // (with Pair being a standard tuple-like class)
           return new Pair(result1, result2);
        })
            .subscribe(
                pair -> {
                    // handle the results
                },
                error -> {
                    // something went wrong
                }
            );
    }

根据docszip允许您指定一系列反应类型(SingleObservable等)以及转换所有结果的函数曾经,其核心思想是,在所有来源发出一次(或更多,取决于反应类型)之前,它不会发出任何东西。