Java - Vertx - Publish-Subscribe 模式:在自己的消费者内部发布消息.这是个坏主意吗?



我是发布-订阅模式的新手,我们正在应用程序中使用 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.

最新更新