在Vertx中发送同步EventBus消息

时间:2018-09-11 11:54:57

标签: java rx-java reactive-programming vert.x event-bus

我想通过Vertx中的EventBus发送多个消息,但要同步。我想发送一条消息,等待它,并发送下一条消息。地址是一样的。默认情况下,我该怎么做?还是有必要使用executeBlocking代码?

这是我的代码。

public class EventBusSync {
    private Vertx vertx = Vertx.vertx();
    private static final String SERVICE_ADDRESS =  "service.worker";

  public void sentViaEvBus() {
    String message1 = "message1";
    String message2 = "message2";

    String reply1 = sendCommand(SERVICE_ADDRESS,message1);
    String reply2 = sendCommand(SERVICE_ADDRESS,message2);

  }

  private String sendCommand(String address, String command) {
   String message;
   vertx.eventBus().send(address,command, handler -> {
    if(handler.succeeded()) {
     log.info("success");
   } else {
     log.error("error",handler.cause());
     throw new RuntimeException("ERROR");
    }
    message = handler.result.body();
    });
 return message;
  }
 }

所以在这里,如果发送了第一个命令,并且正在发生某些事情,我想中断下一个事件总线的发送。

谢谢

3 个答案:

答案 0 :(得分:2)

使用CompleteFuture

  private String sendCommand(String address, String command) {
    CompletableFuture<String> completableFuture = new CompletableFuture<>();
    vertx.eventBus().<String>send(address, command, asyncResult -> {
      if (asyncResult.succeeded()) {
        completableFuture.complete(asyncResult.result().body());
      } else {
        completableFuture.completeExceptionally(asyncResult.cause());
      }
    });
    try {
      return completableFuture.get();
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
  }

请确保虽然未在Vert.x事件循环上调用此代码,因为get()将一直阻塞,直到知道答复为止。

答案 1 :(得分:0)

Vert.x-sync examples

  

在这里,您将找到演示Vert.x-Sync实际操作的示例。

     

[...]

     

这表明使用   awaitResult   获得发送事件总线消息并同步返回答复。

答案 2 :(得分:0)

EventBus用于异步消息传递(发布/订阅消息传递,点对点和请求-响应消息传递)。强制同步动作没有意义。

如果要同步响应,如果您在同一JVM中,则只需在另一个Java类中调用一个方法即可。