RxJavaを使用したVert.x

Aug 22 2020

私の現在のプロジェクトでは、Vert.xがRxJavaで使用されていますが、その理由がわかりません。

Vert.xが提供するものに加えて、RxJavaは何を提供しますか。

あり、これは、それは私の質問に答えていません。

回答

4 dano Aug 22 2020 at 07:02

コアのVert.xAPIは、コールバックを使用して非同期操作を処理します。非同期操作は、構成(チェーン)が難しい場合があります。たとえば、一連のVerticlesを順番にデプロイすると、コールバックを使用して次のようになります。

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

Rxified Vert.x APIを使用した同等のコードは、次のようになります。

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には、非同期操作を組み合わせて変換するための非常に豊富な演算子のセットがあり、非常に少ないコードで複雑なロジックを表現できます。コアのVert.xAPIではそれを行うことはできません。

Vert.x 4.0は、FutureベースのAPIをコアVert.xに追加します。これにより、より単純なワークフロー(上記の例のような)でのRxJavaの必要性が減りますが、より複雑なフローでもメリットが得られます。