EventBus.localConsumer是否需要MessageConsumer.completionHandler



以下代码可能是自定义请求/响应实现的一部分。我不使用EventBus.request,因为我需要更多的自由度,比如对单个请求发送多个响应。

String replyAddress = generateUniqueAddress();
replyConsumer = eventBus.localConsumer(replyAddress, this::handleReply);
replyConsumer.completionHandler(result -> {
if (result.succeeded()) {
eventBus.send("someAddress", new SomeMessageWhichContainsMyReplyAddress(replyAddress));
}
else {
...
}
});

问题是:我真的必须等待完成处理程序吗?或者我可以像这样简化代码吗?

String replyAddress = generateUniqueAddress();
replyConsumer = eventBus.localConsumer(replyAddress, this::handleReply);
eventBus.send("someAddress", new SomeMessageWhichContainsMyReplyAddress(replyAddress));

MessageConsumer.completionHandler的Javadoc描述了该方法通知给定的处理程序"当注册在集群中传播时">。由于不存在具有EventBus.localConsumer的集群,因此假设注册总是立即在本地事件总线上传播是否有效?我检查了Vert.x 3.9.3的实现,至少对于这个版本,注册似乎是同步的。

在侦听器注册后,只调用一次完成处理程序。如果您想在发生这种情况时向someAddress发送消息,那么您的初始代码是正确的。

由于Vert.x的异步特性,您的第二个示例将不一致。最有可能的是,当您发送消息时,您的本地消费者还没有注册,因此消息丢失。

如果您打算在收到每条新消息后向someAddress发送一条新消息,那么这两条代码都是错误的。

最新更新