RxJava es una de las librerías que más interés esta generando dentro de la comunidad. Esto es debido a que cada día nos encontramos con más sistemas que funcionan de forma asíncrona y que necesitan poder gestionar flujos de información complejos. Para entender como funciona RxJava necesitamos entender como funcionan los Observables que son los elementos principales de la librería.
RxJava Observables e Iterables
Los observables tienen fuertes similitudes con los Iterables , recordemos que estos últimos son estructuras de datos que se pueden recorrer utilizando el interface Iterator. Vamos a verlos en acción para recordarlos un poco.
package com.arquitecturajava; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; public class Principal0 { public static void main(String[] args) { List<String> lista= new ArrayList<String>(Arrays.asList("hola","que","tal")); Iterator<String> i= lista.iterator(); while(i.hasNext()) { System.out.println(i.next()); } } }
En este caso recorremos una lista de cadenas y las imprimimos por pantalla.
Vamos a ver el mismo ejemplo a través del uso de RxJava y Observables . El primer paso que tendremos que realizar es instalar las dependencias de Maven necesarias:
<dependency> <groupId>io.reactivex</groupId> <artifactId>rxjava</artifactId> <version>1.0.8</version> </dependency>
Una vez instaladas las dependencias vamos a crear un Observable y subscribirnos a él.
package com.arquitecturajava; import java.util.Arrays; import rx.Observable; import rx.functions.Action1; public class Principal { public static void main(String[] args) { Observable<String> o = Observable.from(Arrays.asList("hola","que","tal")); o.subscribe(new Action1<String>() { public void call(String arg0) { System.out.println(arg0); } }); } }
La forma de trabajar es muy similar en este caso tenemos una lista que se convierte en un Observable. Este Observable emitirá los diferentes elementos de la lista.
En este caso tenemos un objeto Action1 que se subscribe a la lista de objetos que el observable emite.
El resultado que obtenemos por pantalla es idéntico al anterior.
¿Cual es entonces la ventaja de usar los Observables?. Los observables están orientados a gestionar flujos asíncronos. Vamos a ver un ejemplo:
package com.arquitecturajava; import java.util.concurrent.TimeUnit; import rx.Observable; import rx.functions.Action1; public class Principal2 { public static void main(String[] args) throws InterruptedException { Observable<Long> observable1=Observable.interval(500, TimeUnit.MILLISECONDS).take(20); Observable<Long> observable2=Observable.interval(200, TimeUnit.MILLISECONDS).take(20); Observable.merge(observable1,observable2).subscribe(new Action1<Long>() { @Override public void call(Long arg0) { System.out.println(arg0); } }); Thread.sleep(20000); } }
En este caso hemos construido dos observables. Cada uno de ellos emite 20 números a diferentes intervalos de tiempo (cada uno crea un Thread). Podríamos considerarlos dos tareas asíncronas diferentes. Vamos a usar RxJava para fusionar ambas tareas utilizando el método merge y tratarlas como si fuera una única.
El resultado de utilizar el método Merge es que podemos utilizar el mismo subscriptor para ambas tareas y se irán intercalando en la consola.
RxJava es una de las librerías que más futuro tiene , recordemos que una parte importante de las Arquitecturas de microservicios serán asíncronas.
Otros artículos relacionados: Iterator , MicroServicios
Excelente! Todas tus clases son geniales, gracias!
gracias 🙂
Buen artículo, gracias por compartir el conocimiento.
De nada 🙂
Muy bueno Cecilio. Gracias por estos artículos. Lo breve y bueno…
gracias 😉
Buen articulo, claro y simple. Yo he trabajado procesos asíncronos con http://akka.io/
el cual esta construido en Scala y utiliza el modelo de Actores, muy recomendable.
gracias por el aporte 🙂
Buena y simple explication , Muchas gracias por compartirla!
gracias 🙂
[…] Otros artículos relacionados: Introducción RxJS , jQuery Promises , RxJava […]
¡Buen post!
La verdad que tengo ganas de probarla. Aunque hasta el momento he trabajo con el EJB’s con llamadas asíncronas (con el @Asynchronous) y Futures, y estoy bastante contento. No estoy seguro si RxJava me aportará algo.
¡Saludos!
Gracias 🙂 , recuerda que esta librería se puede usar fuera de cualquier entorno de EJB y cada día tenemos más entornos de ese estilo 🙂
Pero EJB podríamos decir que es tecnología obsoleta desde hace bastante tiempo. En una arquitectura de funcionalidades desacopladas y sin sesión, como es el caso de los microservicios, no veo donde poder usar EJBs. Es mas, el usar EJBs te obligaría a meter un repositorio de EJBs y ahí tampoco veo dóde lo meterías. Por ejemplo: si tienes varios micros que usan un componente de tus EJBs, ¿meterás un contenedor EJB en cada micro y a su vez en cada Docker? ¿Harás un solo Docker que contenga los EJBs? ¿Cómo escala eso? En mi opinión y por experiencia propia, mezclar… Read more »
Recuerda que ahora un WAR soporta el uso de EJBs a través de EJB Lite 😉