Java-Vertx-Publish–;订阅模式:在自己的使用者内发布消息。这是个坏主意吗?
我是发布-订阅模式的新手,我们正在应用程序中使用Vertx 我试图为一些用例这样做,我在它自己的消费者内部发布:Java-Vertx-Publish–;订阅模式:在自己的使用者内发布消息。这是个坏主意吗?,java,asynchronous,functional-programming,publish-subscribe,vert.x,Java,Asynchronous,Functional Programming,Publish Subscribe,Vert.x,我是发布-订阅模式的新手,我们正在应用程序中使用Vertx 我试图为一些用例这样做,我在它自己的消费者内部发布: private void functionality() { EventBus eb = Vertx.currentContext().owner().eventBus(); MessageConsumer<String> consumer = eb.consumer("myAddress"); consumer.handler(message -
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");
}
private void功能(){
EventBus eb=Vertx.currentContext().owner().EventBus();
MessageConsumer=eb.consumer(“我的地址”);
consumer.handler(消息->{
如果(条件1){
DOO改变条件的操作();
eb.发布(“我的地址”,“开始运营”);
}否则{
日志信息(“对所有已完成资产的操作”);
}
});
eb.发布(“我的地址”,“开始运营”);
}
这是个坏主意吗?这是否也会导致堆栈溢出错误(如递归调用)或任何其他问题?EventBus.publish方法是异步的;它不会阻止等待使用者接收/处理已发布的消息。因此,在消费者内部调用
publish
,然后消费者将使用已发布的消息是完全安全的。在内部,Vert.x有Netty调度另一个对使用者的调用,直到当前调用(以及Netty事件循环中调度在它前面的任何其他方法)完成,才会运行该调用。您可以通过编写一个测试向自己证明这一点,该测试由发布到其消费地址的消费者进行。您不会看到堆栈溢出错误
如果您正在寻找一个可以为您检查代码的站点,请不要来堆栈溢出,将此问题放在“谢谢”上。直到现在我才知道这个网站。我会适当地使用它。我还想知道调用publish inside consumer是否会导致Stackoverflow。