问题描述
以下代码可能是自定义请求/响应实现的一部分。我没有使用 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
发送一条新消息,那么这两段代码都是错误的。