Синхронное сообщение EventBus отправлено в Vertx - PullRequest
0 голосов
/ 11 сентября 2018

Я хочу отправить несколько сообщений через EventBus в Vertx, но синхронно.Я хочу отправить сообщение, дождаться его, а также отправил следующие.Адрес тот же.Это по умолчанию, как я это делаю?или нужно использовать, может быть, код 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 голосов
/ 12 сентября 2018

Использование 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() будет блокироваться до тех пор, пока ответ не станет известен.

0 голосов
/ 13 сентября 2018

EventBus предназначен для асинхронной передачи сообщений (публикация сообщений / подписка, обмен сообщениями «точка-точка» и «запрос-ответ»). Не имеет смысла форсировать синхронные действия.

Если вам нужен синхронный ответ, просто вызовите метод в другом Java-классе, если вы находитесь в той же JVM.

0 голосов
/ 11 сентября 2018

Примеры Vert.x-sync

Здесь вы найдете примеры, демонстрирующие Vert.x-Sync в действии.

[...]

Это демонстрирует использование awaitResult для получения отправляемых сообщений шины событий и получения ответа обратно, синхронно.

...