vert.x等待多条消息的回复

时间:2014-08-07 11:02:52

标签: java vert.x event-based-programming

在vert.x中,我可以向另一个Verticle发送消息,并且"异步等待"回复。

问题是:我想向多个Verticle发送消息,并在所有Verticle回复时调用异步处理程序。

这是否可行或是否有更好的设计来实现此功能?

编辑:

Supose我有一个Verticle A,它发送消息到Verticle B,C和D.每个Verticle(B,C,D)对消息做一些事情并返回一些数据。然后,垂直A接收来自B,C,D的响应,并对所有数据执行某些操作。问题是我为每个发送的消息都有一个处理程序(一个用于A,一个用于B,一个用于C),我希望在所有回复到达时调用一个处理程序。

2 个答案:

答案 0 :(得分:12)

自Vert.x 3.2起,文档使用FutureCompositeFuture解释how to coordinate asyncronously

因此,假设您希望通过事件总线进行两次send调用,并在两者都成功时执行某些操作:

Future<Message> f1 = Future.future();
eventBus.send("first.address", "first message", f1.completer());

Future<Message> f2 = Future.future();
eventBus.send("second.address", "second message", f2.completer());

CompositeFuture.all(f1, f2).setHandler(result -> {
  // business as usual
});

最多可以将6个期货作为参数传递,或者可以将它们作为列表传递。

答案 1 :(得分:3)

最佳方法是使用由Netflix's Rx.Java实施并由RxVertx Module提供的Reactive Extensions。

huge variety of operators允许你做&#34; zipping&#34;将几个异步调用的结果转换为新的结果并随意执行任何操作。

我有simple demo available on GitHub,其中包含:

final Observable<JsonObject> meters = observeMetricsSource(metricsAddress, METERS_BUS_REQUEST, "meters", rx);
final Observable<JsonObject> histograms = observeMetricsSource(metricsAddress, HISTOGRAMS_BUS_REQUEST, "histograms", rx);
subscribeAndRespondJson(zip(meters, histograms, (jo1, jo2) -> jo1.mergeIn(jo2)), req);

这个片段显示了来自两个事件总线异步交互的两个observable如何得到&#34;压缩&#34; (即合并)成一个最终的HTTP响应。