Vert.x с RxJava

Aug 22 2020

В моем текущем проекте Vert.x используется с RxJava, и я не понимаю, почему?

Что предлагает RxJava помимо того, что предлагает Vert.x.

Существует это , но он не отвечает на мой вопрос.

Ответы

4 dano Aug 22 2020 at 07:02

Ядро Vert.x API использует обратные вызовы для обработки асинхронных операций, которые может быть сложно составить (связать вместе). Например, последовательное развертывание группы Вертикалей выглядит следующим образом с использованием обратных вызовов:

vertx.deployVerticle(MyClass1.class.getCanonicalName(), result1 -> {
  if (result2.succeeded()) {
    vertx.deployVerticle(MyClass2.class.getCanonicalName(), result2 -> {
      if (result2.suceeded()) {
        vertx.deployVerticle(MyClass3.class.getCanonicalName(), result3 -> {
          if (result3.succeeded()) {
            System.out.println("Deployed the verticles");
          } else {
            System.err.println("Failed to deploy verticle " + result3.cause());
          }
        });
       } else {
         System.err.println("Failed to deploy verticle " + result2.cause());
       }
    });
  } else {
    System.out.println("Failed to deploy verticle " + result1.cause());
  }
);

Эквивалентный код с использованием API Rxified Vert.x будет следующим:

vertx.rxDeployVerticle(MyClass1.class.getCanonicalName())
    .flatMap(ign -> vertx.rxDeployVerticle(MyClass2.class.getCanonicalName()))
    .flatMap(ign -> vertx.rxDeployVerticle(MyClass3.class.getCanonicalName()))
    .subscribe(
        ign -> System.out.println("Deployed the verticles"),
        err -> System.err.println("Failed to deploy verticle " + err)
    );

RxJava значительно упрощает создание подобных асинхронных операций. Конечно, этот пример немного надуман (вы определенно можете очистить версию обратного вызова, чтобы она была более читаемой), но он дает вам представление о том, насколько просто связать операции с RxJava. RxJava имеет очень богатый набор операторов для комбинирования и преобразования асинхронных операций, что позволяет выражать сложную логику с помощью очень небольшого количества кода. Это просто невозможно сделать с помощью основного API Vert.x.

Vert.x 4.0 собирается добавить API на основе будущего в ядро ​​Vert.x, что снизит потребность в RxJava для более простых рабочих процессов (как в примере выше), но более сложные потоки все равно выиграют от этого.