在vert.x中,我可以向另一个Verticle发送消息,并且"异步等待"回复。
问题是:我想向多个Verticle发送消息,并在所有Verticle回复时调用异步处理程序。
这是否可行或是否有更好的设计来实现此功能?
编辑:
Supose我有一个Verticle A,它发送消息到Verticle B,C和D.每个Verticle(B,C,D)对消息做一些事情并返回一些数据。然后,垂直A接收来自B,C,D的响应,并对所有数据执行某些操作。问题是我为每个发送的消息都有一个处理程序(一个用于A,一个用于B,一个用于C),我希望在所有回复到达时调用一个处理程序。
答案 0 :(得分:12)
自Vert.x 3.2起,文档使用Future
和CompositeFuture
解释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响应。