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()
}
});