Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-Vertx-Publish–;订阅模式:在自己的使用者内发布消息。这是个坏主意吗?_Java_Asynchronous_Functional Programming_Publish Subscribe_Vert.x - Fatal编程技术网

Java-Vertx-Publish–;订阅模式:在自己的使用者内发布消息。这是个坏主意吗?

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 -

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