我是发布-订阅模式的新手,我们在应用程序中使用Vertx。
我正在尝试在某些用例中执行此操作,在该用例中,我在自己的使用者中进行发布:
private void functionality() {
EventBus eb = Vertx.currentContext().owner().eventBus();
MessageConsumer<String> consumer = eb.consumer("myAddress");
consumer.handler(message -> {
if (condition1) {
doOperationWhichMightChangeTheCondition();
eb.publish("myAddress","Start Operation");
}else {
log.info("Operations on all assets completed");
}
});
eb.publish("myAddress","Start Operation");
}
这是个坏主意。还会导致诸如递归调用的StackOverFlow错误吗?或其他任何问题?
EventBus.publish
方法是异步的;它不会阻止等待使用者接收/处理已发布的消息。因此,在使用者内调用publish
,然后再消费已发布的消息是绝对安全的。在内部,Vert.x让Netty安排了对使用者的另一个调用,该调用直到当前调用(以及Netty事件循环之前安排的其他任何方法)都不会运行。您可以通过编写一个与消费者一起发布到其消费地址的测试,轻松地向自己证明这一点。您不会看到StackOverFlowError
。