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 的实现,至少对于这个版本,注册似乎是同步的。

解决方法

在您的侦听器注册后,完成处理程序只会被调用一次。如果您想在发生这种情况后向 s2="Virus/02/2013" s3="Helium Nitrogen 10/10" s4="Nitrogen Oxygen10/20" s5="glycol,water,oxygen,10/20/30" concat=c(s2,s3,s4,s5) stringr::str_replace_all(concat,"(?<!\\/)(?<!\\/)\\d*\\.?\\d+(\\s+)?\\/\\d*\\.?\\d+(\\s+)?(\\/\\d*\\.?\\d+(\\s+)?)?","") s2_f="Virus/02/2013" s3_f="Helium Nitrogen" s4_f="Nitrogen Oxygen" s5_f="glycol,oxygen" 发送消息,那么您的初始代码是正确的。

由于 Vert.x 异步性质,您的第二个示例将不一致。很可能在您发送消息时,您的本地消费者尚未注册,因此消息丢失。

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