Concurrency vert.x:发布和使用来自事件总线的消息

Concurrency vert.x:发布和使用来自事件总线的消息,concurrency,reactive-programming,vert.x,Concurrency,Reactive Programming,Vert.x,我编写了以下代码: public class VertxApp { public static void main(String[] args) { // This is OK Vertx vertx = Vertx.vertx(); vertx.deployVerticle(new ReceiveVerticle()); // line A vertx.deployVerticle(new SendVerticle());

我编写了以下代码:

public class VertxApp {

    public static void main(String[] args)  { // This is OK
        Vertx vertx = Vertx.vertx();
        vertx.deployVerticle(new ReceiveVerticle());  // line A
        vertx.deployVerticle(new SendVerticle());     // line B
    }
}

public class ReceiveVerticle extends AbstractVerticle{

    @Override
    public void start(Future<Void> startFuture) {
        vertx.eventBus().consumer("address", message -> {
            System.out.println("message received by receiver");
            System.out.println(message.body());
        });
    }
}

public class SendVerticle extends AbstractVerticle {

    @Override
    public void start(Future<Void> startFuture) throws InterruptedException {
        System.out.println("SendVerticle started!");
        int i = 0;

        for (i = 0; i < 5; i++) {
            System.out.println("Sender sends a message " + i );
            vertx.eventBus().publish("address", "message" + i);
        }
    }
}
公共类VertxApp{
publicstaticvoidmain(字符串[]args){//这没问题
Vertx Vertx=Vertx.Vertx();
deployVerticle(新的ReceiveVerticle());//行A
vertx.deployVerticle(新的SendVerticle());//行B
}
}
公共类ReceiveVerticle扩展了AbstractVerticle{
@凌驾
公共作废开始(未来开始未来){
vertx.eventBus().consumer(“地址”,消息->{
System.out.println(“接收方收到的消息”);
System.out.println(message.body());
});
}
}
公共类SendVerticle扩展了AbstractVerticle{
@凌驾
public void start(Future startFuture)引发InterruptedException{
System.out.println(“SendVerticle已启动!”);
int i=0;
对于(i=0;i<5;i++){
System.out.println(“发送方发送消息”+i);
eventBus()发布(“地址”、“消息”+i);
}
}
}
此代码不一致。有一个比赛条件。如果我多次运行代码,有时发送的所有5条消息都会被消耗,有时它们都不会被消耗


你能解释一下为什么这里有种族问题,以及如何解决这个问题吗

不存在竞态条件,部署verticle是一种异步操作,在发送方verticle发送消息后,接收方verticle可能会注册消费者

要确保操作按顺序进行,请使用采用处理程序参数的
deploy
方法:

Vertx vertx = Vertx.vertx();
vertx.deployVerticle(new ReceiveVerticle(), ar -> {
    if (ar.succeeded()) {
        vertx.deployVerticle(new SendVerticle());
    } else {
        // handle the problem -> ar.cause()
    }
});

不存在竞态条件,部署verticle是一种异步操作,在发送方verticle发送消息后,接收方verticle可能会注册消费者

要确保操作按顺序进行,请使用采用处理程序参数的
deploy
方法:

Vertx vertx = Vertx.vertx();
vertx.deployVerticle(new ReceiveVerticle(), ar -> {
    if (ar.succeeded()) {
        vertx.deployVerticle(new SendVerticle());
    } else {
        // handle the problem -> ar.cause()
    }
});