我对发布-订阅模式很陌生,我们在应用程序中使用了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错误,如递归调用,或任何其他问题?
发布于 2020-06-08 04:30:42
EventBus.publish方法是异步的;它不会阻塞以等待使用者接收/处理发布的消息。因此,在消费者内部调用publish是完全安全的,该消费者随后将消费已发布的消息。在内部,Vert.x让Netty调度另一个对消费者的调用,直到当前调用(以及Netty事件循环中在它之前调度的任何其他方法)完成后才会运行。您可以很容易地向自己证明这一点,方法是编写一个测试,将一个消费者发布到它正在消费的地址。您将不会看到StackOverFlowError。
https://stackoverflow.com/questions/62250141
复制相似问题