等待来自vertx中多个可观察对象的响应

时间:2018-09-20 20:38:50

标签: java rx-java vert.x

我正在使用vertx-rx-java

我有一个处理程序,我需要通过PortalSettings.SSLEnabled; PortalSettings.SSLEnforced; PortalSettings.SSLURL; 发出2个不同的请求,并使用这2个请求的响应来创建响应。

EventBus

基本上,我需要组合两个请求结果并将其放入public handle(RoutingContext context) { ....some code... Single<Message<Object>> firstRequest = eb.rxSend("address1", "message1"); Single<Message<Object>> secondRequest = eb.rxSend("address2", "message2"); ... TODO ... } 响应中。问题是我不完全了解如何以rxjava样式进行操作。 我唯一能想到的就是这样:

RoutingContext

但是我认为这是一个不好的方法,因为如果有10个请求而不是2个请求该怎么办?该代码将有10个嵌套调用。

是否有更好的方法来合并多个请求结果?

1 个答案:

答案 0 :(得分:2)

zip运算符可用于关联来自多个源的发射,区别在于它仅在其每个潜在源都发射时才发射。所以...

  • 在有两个基础源的情况下,zip将成对发射。
  • 如果存在三个基本源,则zip将以三重态发射。
  • ...等

要了解我的意思,您可以参考RxMarbles页面,并在观察底部流的同时处理顶部两个流的排放。

有了这种理解,您就可以使用zip运算符来合并Message答复的结果,就像这样:

Single.zip(firstRequest, secondRequest, (firstReply, secondReply) -> {
    // ...do stuff with the replies and compose some result
    //    to be handled in onSuccess()
    return firstReply.body().toString() + secondReply.body().toString();
})
.subscribe(
    result -> {
        System.out.println("## onSuccess(" + result + ")");
    },
    error -> {
        System.err.println("## onError(" + error.getMessage() + ")");
    }
);

如果任一传送失败,则将触发onError处理程序。否则将触发onSuccess

如果您如上所述要一次处理大量请求,则zip的重载变体可以接受Iterable个源。在您的情况下,可能看起来像这样:

final List<Single<Message<Object>>> requests = asList(firstRequest, secondRequest, ...);

Single.zip(requests, replies -> {
    // ...do stuff with the array of replies
    return null;
})
.subscribe(...);

希望有帮助!