Vert.x con RxJava

Aug 22 2020

En mi proyecto actual, Vert.x se usa con RxJava y no entiendo por qué.

¿Qué ofrece RxJava además de lo que ofrece Vert.x?

Hay esto , pero no responde a mi pregunta.

Respuestas

4 dano Aug 22 2020 at 07:02

La API central de Vert.x usa devoluciones de llamada para manejar operaciones asincrónicas, que pueden ser difíciles de componer (encadenar). Por ejemplo, implementar un grupo de Verticles en secuencia se ve así usando devoluciones de llamada:

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

El código equivalente usando la API Rxified Vert.x sería este:

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 hace que sea mucho más fácil lidiar con la composición de operaciones asincrónicas como esta. Por supuesto, este ejemplo es un poco artificial (definitivamente podría limpiar la versión de devolución de llamada para que sea más legible), pero le da una idea de lo simple que es encadenar las operaciones con RxJava. RxJava tiene un conjunto muy rico de operadores para combinar y transformar operaciones asincrónicas, lo que le permite expresar lógica compleja con muy poco código. Simplemente no es posible hacer eso con la API central de Vert.x.

Vert.x 4.0 agregará una API basada en el futuro al núcleo de Vert.x, lo que reducirá la necesidad de RxJava para flujos de trabajo más simples (como el ejemplo anterior), pero los flujos más complejos aún se beneficiarán de ello.