SlideShare una empresa de Scribd logo
JVM Reactive Programming
Mexico City JVM Group
October 2016
domix
domix
coderDog
!Gracias por estar aqui¡
!Ya estamos en vivo¡
bit.ly/jm_live
La idea de ‘Live’
• Reuniones intermedias entre cada meetup
presencial en CDMX
• Para desarrolladores que no pueden asistir
• Para expositores nacionales o internacionales
• Esfuerzo paralelo a las actividades de JVM_MX
• YOLO
Anuncio parroquial
Nuevo libro por
Javeros Mexicanos
Raul Estrada (@BusinessRul)
Isaac Ruiz Guerra (@rugi)
bit.ly/book_smack
Reactive
Programming
Reactive Programming
• “Reactive Programming” es programar con flujos de
datos asíncronos.
• Flujo de datos (Data Stream): Una secuencia de valores
• Modelo de programación basado en el principio de
empujar (push) en lugar de obtener (pull).
• Los valores se “emiten” cuando están listos, no cuando
se solicitan de una forma no-bloqueante (non-blocking)
• Se permite ejecutar operaciones en paralelo en lugar de
forma serial.
Functional
Reactive Programming
• Functional programming
• https://maryrosecook.com/blog/post/a-practical-
introduction-to-functional-programming
• Lleva a Reactive Programming al siguiente nivel.
• Permute aplicar funciones al flujo de datos.
• map, filter, zip, take, etc..
• Integra flujo de tiempo y los eventos de composición en
la programación funcional.
ReactiveX
Reactive eXtensions
• Creado en Microsoft por Erik Meijer
• Colección de funciones útiles para hacer
programación reactiva.
• ReactiveX esta implementado en mas de 10
lenguajes.
• RxJava es la implementación de ReactiveX, fue
escrita por el equipo de Netflix
ReactiveX
• Observable: fuente de flujos de datos (sender).
• Observer: Escucha los valores emitidos (receiver)
• El Observer se suscribe (escucha) al Observable
• Los Observers reaccionan a cualquier elemento o
secuencias de elementos que emita el Observable
• Muchos Observers pueden suscribirse al mismo
Observable.
Observable Observer
Pattern
• Permite operaciones concurrentes: el Observer
no necesita bloquear mientras espera que el
Observable emita valores
• El Observer espera a recibir valores cuando el
Observable esta listo para emitirlos
• Sobre la base de empuje (push) en lugar de
obtener (pull)
RxJava
RxJava
• Proyecto Open Source con Licencia Apache.
• Implementación en Java de ReactiveX de
Microsoft
• El API de Netflix la usa para hacer la capa de
servicio completamente asíncrona.
• El objetivo es la JVM no el lenguaje.
• Existe soporte para Java, Groovy, Clojure, y Scala
RxJava Features
• Composable: Fácilmente se puede encadenar o
combinar
• Flexible: Se puede usar para emitir:
• Un valor escalar (network result)
• Secuencia (elementos en una lista)
• Flujos infinitos (sensores de clima)
• Mitiga el callback hell: Fácilmente se puede transformar
un flujo asíncrono en otro
Usando Iterables
• Antes de reactivo
1. Invocar un método
2. Esperar el resultado
3. Almacenar el resultado en una variable
4. Usar la variable para hacer algo util.
Usando Observables
1. Definir un Observer que especifica que hacer
con cada valor emitido
2. Invocar un método que regrese un Observable
3. Suscribirse el Observer al Observable. Esto le
dice al Observable que tiene un subscriptor
esperando a recibir valores cuando estén
disponibles.
En RxJava
• El método Subscribe conecta un Observer a un
Observable
• Una ves suscrito, no hay necesidad de bloquear
el hilo actual.
• Los valores llegaran al Observer cuando estén
listos y disponibles
Interface rx.Observer
public interface rx.Observer<T> {

void onCompleted();



void onError(Throwable e);



void onNext(T t);



}
void onCompleted();


/**

* Notifies the Observer that the
* {@link Observable} has finished sending
* push-based notifications.

* <p>

* The {@link Observable} will not call
* this method if it calls {@link #onError}.

*/

void onCompleted();
void onCompleted();
• El Observable invoca este método después de
que se invocó el método onNext por ultima
ocasión y no encontró ningún error.
• La llamada a onComplete finaliza la
subscripción.
void onError(Throwable e);
/**

* Notifies the Observer that the {@link Observable}
* has experienced an error condition.

* <p>

* If the {@link Observable} calls this method, it
* will not thereafter call {@link #onNext} or

* {@link #onCompleted}.

* 

* @param e

* the exception encountered by the
* Observable

*/

void onError(Throwable e);
void onError(Throwable e);
• El Observable invoca este método para indicar
que ha fallado al obtener la información
esperada o alguno otro problema.
• Esto detiene al Observable y no hará mas
invocaciones.
• Envía la excepción que genero el problema.
void onNext(T t)
/**

* Provides the Observer with a new item to observe.

* <p>

* The {@link Observable} may call this method 0 or
* more times.

* <p>

* The {@code Observable} will not call this method
* again after it calls either {@link #onCompleted}
* or {@link #onError}.

* 

* @param t

* the item emitted by the Observable

*/

void onNext(T t);
void onNext(T t)
• El Observable invoca este método cada vez que
el Observable emite un elemento.
• Este método puede ser invocado cualquier
número de veces (de cero a muchos).
• Siempre seguido por onError o onComplete
(pero no ambos)
Uso sencillo
public Observable<Double>
dollarToCurrencyExchangeRate(String targetCurrencyCode) {

// se crea de alguna manera el Observable

return ...

}
public void foo() {

dollarToCurrencyExchangeRate("MXN")

.subscribe(System.out::println);

}
Composing el Observable
public void foo() {

dollarToCurrencyExchangeRate("MXN")

.throttleWithTimeout(2, TimeUnit.MINUTES)

.distinctUntilChanged()

.filter(value -> value > 0)

.map(Object::toString)

.subscribe(System.out::println);

}

¿Como esta
implementado el Observable?
• ¿Tal vez ejecuta su lógica en el hilo del subscriptor?
• ¿Tal vez delega parte del trabajo a otros hilos?
• ¿Usará NIO?
• ¿Tal vez es un actor?
• ¿Devolverá datos de un cache?
• ¡Al Observer no le importa!
Consumiendo Observables
Modo largo…


rx.Observable.just(1, 2, 3)

.subscribe(new rx.Observer<Integer>() {

@Override

public void onCompleted() {

System.out.println("No más elementos.");

}



@Override

public void onError(Throwable e) {

System.out.println(

String.format("Ocurrio un problema: %s", e.getMessage()));

}



@Override

public void onNext(Integer integer) {

System.out.println(

String.format("Valor recibido: %d", integer));

}

});
Consumiendo Observables
Modo corto Java 8.


rx.Observable.just(1, 2, 3)

.subscribe(

value ->

System.out.println(

String.format("Valor recibido: %d", value)),

throwable ->

System.out.println(

String.format("Ocurrio un problema: %s",

throwable.getMessage())),

() -> System.out.println("No más elementos."));
Operadores doOn*
rx.Observable.just(1, 2, 3, 4, 5)

.doOnNext(value -> {

if (Integer.valueOf(4).equals(value)) {

throw new RuntimeException("El cuatro es feo.");

}

})

.doOnError(throwable -> System.out.println(

String.format("Ocurrio un problema: %s",

throwable.getMessage())))

.doOnCompleted(() ->
System.out.println("No más elementos."))

.subscribe(value ->

System.out.println(

String.format("Valor recibido: %d", value)));
Creando Observable
de forma explicita.
rx.Observable.<Integer>create(subscriber -> {

try {

for (int i = 0; i < 5; i++) {

subscriber.onNext(i);

}

// Si olvidamos invocar onCompleted se

// pueden crear Observables sin fin.

subscriber.onCompleted();

} catch (Throwable cause) {

subscriber.onError(cause);

}

});
Como crear Observables
Manipulando
Observable
Transformando data map
rx.Observable.just(1, 2, 3, 4, 5)

.map(value -> String
.format("Value: %s", value.toString()))

.subscribe(System.out::println);
Combinando Observables
Filtrando
Limitando elementos
Ejercicio 1
Implementar la kata
FizzBuzz
http://codingdojo.org/cgi-bin/index.pl?KataFizzBuzz
https://en.wikipedia.org/wiki/Fizz_buzz
Hasta el número 20
Backpressure
• ¿Que ocurre si un Observable esta emitiendo elementos más rápido de lo que
el Observer puede procesarlos?
• Cold Observable:
• Emite una secuencia particular de elementos, puede empezar a emitirla
cuando su Observer lo considere conveniente y a la tasa de entrega que el
Observer desee, sin interferir la integridad de la secuencia.
• Hot Observable:
• Es un Observable que empieza a generar elementos inmediatamente
cuando es creado. Los subscriptores pueden empezar a observar la
secuencia de elementos emitidos a la mitad de la secuencia, empezando
con el primer elemento emitido posterior al establecimiento de la
subscripción. Dicho Observable emite elementos a su propio ritmo y es
responsabilidad de los Observers mantener ese mismo ritmo.
Debounce
throttleFirst
throttleWithTimeout
List<Observable<byte[]>> observables =

//obtengo todas las instancias de los servicios

discoveryClient.getInstances("service_id").stream()

//Obtengo su URI remota (host:port)

.map(serviceInstance -> serviceInstance.getUri().toString())

//Genera un Worker que hará el trabajo de pedirle
//a cada instancia del servicio el archivo.
//DownloadCacheWorker implementa java.util.concurrent.Callable

.map(baseUrl -> new DownloadLocalCacheWorker(baseUrl, bucket, key))

//Genero un Future para hacerlo asíncrono

.map(callable ->
((ThreadPoolTaskExecutor) taskExecutor).submit(callable))

//Lo convierto a Observable para facilitar
//el manejo de errores

.map(Observable::from)

//Genero una lista de Observables

.collect(Collectors.toList());


//Genero un solo Observable a partir de todos

Observable.merge(observables)

//Si algo falla al obtener el archivo del
//servicio remoto, simplemente regreso null

.onErrorReturn(throwable -> {

log.warn("No se encontró algo", throwable);

return null;

}).doOnCompleted(() -> {})

//Descarto todos los null

.filter(fileContent -> fileContent != null)

//obtengo el primer resultado exitoso
//(en teoría solo debe existir en un solo servidor)

.firstOrDefault(null)

//hago la llamada bloqueante

.toBlocking()

//aplico la lógica de manejo del archivo

.subscribe(new DownloadLocalCacheObserver(response, key, notFound));

A seguir
• Project Reactor
• https://projectreactor.io/
• Akka
• http://akka.io/
• Reactive Streams
• http://www.reactive-streams.org/

Más contenido relacionado

La actualidad más candente

.NET Memoria y Rendimiento
.NET Memoria y Rendimiento.NET Memoria y Rendimiento
.NET Memoria y Rendimiento
Eduard Tomàs
 
Magallanes - PHPmvd Meet Up - Mayo 2014
Magallanes - PHPmvd Meet Up - Mayo 2014Magallanes - PHPmvd Meet Up - Mayo 2014
Magallanes - PHPmvd Meet Up - Mayo 2014
Andrés Montañez
 
Codemotion 2015 - Akka.NET - EL modelo de actores
Codemotion 2015 - Akka.NET - EL modelo de actoresCodemotion 2015 - Akka.NET - EL modelo de actores
Codemotion 2015 - Akka.NET - EL modelo de actores
Javier García Magna
 
Java struts2 - 03 componentes de la aplicacion
Java   struts2 - 03 componentes de la aplicacionJava   struts2 - 03 componentes de la aplicacion
Java struts2 - 03 componentes de la aplicacion
Jechu2013
 
Keda o como convertir Kubernetess en Serverless
Keda o como convertir Kubernetess en ServerlessKeda o como convertir Kubernetess en Serverless
Keda o como convertir Kubernetess en Serverless
Eduard Tomàs
 
Ciencia de redes con R: Una introducción al universo de paquetes para ciencia...
Ciencia de redes con R: Una introducción al universo de paquetes para ciencia...Ciencia de redes con R: Una introducción al universo de paquetes para ciencia...
Ciencia de redes con R: Una introducción al universo de paquetes para ciencia...
Software Guru
 
Fernando Gandia - Airflow - PyData Mallorca 18-10-2016
Fernando Gandia - Airflow - PyData Mallorca 18-10-2016Fernando Gandia - Airflow - PyData Mallorca 18-10-2016
Fernando Gandia - Airflow - PyData Mallorca 18-10-2016
Fernando Gandia
 
Tolerancia a fallas, service mesh y chassis
Tolerancia a fallas, service mesh y chassisTolerancia a fallas, service mesh y chassis
Tolerancia a fallas, service mesh y chassis
Víctor Leonel Orozco López
 
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptx
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptxDocker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptx
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptx
Paradigma Digital
 
Iniciando microservicios reales con JakartaEE/MicroProfile y arquetipos de Maven
Iniciando microservicios reales con JakartaEE/MicroProfile y arquetipos de MavenIniciando microservicios reales con JakartaEE/MicroProfile y arquetipos de Maven
Iniciando microservicios reales con JakartaEE/MicroProfile y arquetipos de Maven
Víctor Leonel Orozco López
 
Actualizando aplicaciones empresariales en Java desde Java 8 on premise hasta...
Actualizando aplicaciones empresariales en Java desde Java 8 on premise hasta...Actualizando aplicaciones empresariales en Java desde Java 8 on premise hasta...
Actualizando aplicaciones empresariales en Java desde Java 8 on premise hasta...
Víctor Leonel Orozco López
 
Mad scalability (perfomance debugging)
Mad scalability (perfomance debugging)Mad scalability (perfomance debugging)
Mad scalability (perfomance debugging)
Alejandro E Brito Monedero
 
Introducción a Kotlin para desarrolladores Java
Introducción a Kotlin para desarrolladores JavaIntroducción a Kotlin para desarrolladores Java
Introducción a Kotlin para desarrolladores Java
Víctor Leonel Orozco López
 
Rendimiento extremo en php
Rendimiento extremo en phpRendimiento extremo en php
Rendimiento extremo en php
Francisco Javier Vazquez Umbria
 
Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!
Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!
Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!
Iván López Martín
 
Protocol HTTP
Protocol HTTPProtocol HTTP
CommitConf 2019 - Micronaut y GraalVm: La combinación perfecta
CommitConf 2019 - Micronaut y GraalVm: La combinación perfectaCommitConf 2019 - Micronaut y GraalVm: La combinación perfecta
CommitConf 2019 - Micronaut y GraalVm: La combinación perfecta
Iván López Martín
 
Alta disponibilidad con Replicas de MySQL en AWS
Alta disponibilidad con Replicas de MySQL en AWSAlta disponibilidad con Replicas de MySQL en AWS
Alta disponibilidad con Replicas de MySQL en AWS
Nicola Strappazzon C.
 
Actualizando aplicaciones empresariales en Java desde Java 8 on premise hasta...
Actualizando aplicaciones empresariales en Java desde Java 8 on premise hasta...Actualizando aplicaciones empresariales en Java desde Java 8 on premise hasta...
Actualizando aplicaciones empresariales en Java desde Java 8 on premise hasta...
Víctor Leonel Orozco López
 
Meetup de kubernetes, conceptos básicos.
Meetup  de kubernetes, conceptos básicos.Meetup  de kubernetes, conceptos básicos.
Meetup de kubernetes, conceptos básicos.
Paradigma Digital
 

La actualidad más candente (20)

.NET Memoria y Rendimiento
.NET Memoria y Rendimiento.NET Memoria y Rendimiento
.NET Memoria y Rendimiento
 
Magallanes - PHPmvd Meet Up - Mayo 2014
Magallanes - PHPmvd Meet Up - Mayo 2014Magallanes - PHPmvd Meet Up - Mayo 2014
Magallanes - PHPmvd Meet Up - Mayo 2014
 
Codemotion 2015 - Akka.NET - EL modelo de actores
Codemotion 2015 - Akka.NET - EL modelo de actoresCodemotion 2015 - Akka.NET - EL modelo de actores
Codemotion 2015 - Akka.NET - EL modelo de actores
 
Java struts2 - 03 componentes de la aplicacion
Java   struts2 - 03 componentes de la aplicacionJava   struts2 - 03 componentes de la aplicacion
Java struts2 - 03 componentes de la aplicacion
 
Keda o como convertir Kubernetess en Serverless
Keda o como convertir Kubernetess en ServerlessKeda o como convertir Kubernetess en Serverless
Keda o como convertir Kubernetess en Serverless
 
Ciencia de redes con R: Una introducción al universo de paquetes para ciencia...
Ciencia de redes con R: Una introducción al universo de paquetes para ciencia...Ciencia de redes con R: Una introducción al universo de paquetes para ciencia...
Ciencia de redes con R: Una introducción al universo de paquetes para ciencia...
 
Fernando Gandia - Airflow - PyData Mallorca 18-10-2016
Fernando Gandia - Airflow - PyData Mallorca 18-10-2016Fernando Gandia - Airflow - PyData Mallorca 18-10-2016
Fernando Gandia - Airflow - PyData Mallorca 18-10-2016
 
Tolerancia a fallas, service mesh y chassis
Tolerancia a fallas, service mesh y chassisTolerancia a fallas, service mesh y chassis
Tolerancia a fallas, service mesh y chassis
 
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptx
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptxDocker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptx
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptx
 
Iniciando microservicios reales con JakartaEE/MicroProfile y arquetipos de Maven
Iniciando microservicios reales con JakartaEE/MicroProfile y arquetipos de MavenIniciando microservicios reales con JakartaEE/MicroProfile y arquetipos de Maven
Iniciando microservicios reales con JakartaEE/MicroProfile y arquetipos de Maven
 
Actualizando aplicaciones empresariales en Java desde Java 8 on premise hasta...
Actualizando aplicaciones empresariales en Java desde Java 8 on premise hasta...Actualizando aplicaciones empresariales en Java desde Java 8 on premise hasta...
Actualizando aplicaciones empresariales en Java desde Java 8 on premise hasta...
 
Mad scalability (perfomance debugging)
Mad scalability (perfomance debugging)Mad scalability (perfomance debugging)
Mad scalability (perfomance debugging)
 
Introducción a Kotlin para desarrolladores Java
Introducción a Kotlin para desarrolladores JavaIntroducción a Kotlin para desarrolladores Java
Introducción a Kotlin para desarrolladores Java
 
Rendimiento extremo en php
Rendimiento extremo en phpRendimiento extremo en php
Rendimiento extremo en php
 
Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!
Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!
Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!
 
Protocol HTTP
Protocol HTTPProtocol HTTP
Protocol HTTP
 
CommitConf 2019 - Micronaut y GraalVm: La combinación perfecta
CommitConf 2019 - Micronaut y GraalVm: La combinación perfectaCommitConf 2019 - Micronaut y GraalVm: La combinación perfecta
CommitConf 2019 - Micronaut y GraalVm: La combinación perfecta
 
Alta disponibilidad con Replicas de MySQL en AWS
Alta disponibilidad con Replicas de MySQL en AWSAlta disponibilidad con Replicas de MySQL en AWS
Alta disponibilidad con Replicas de MySQL en AWS
 
Actualizando aplicaciones empresariales en Java desde Java 8 on premise hasta...
Actualizando aplicaciones empresariales en Java desde Java 8 on premise hasta...Actualizando aplicaciones empresariales en Java desde Java 8 on premise hasta...
Actualizando aplicaciones empresariales en Java desde Java 8 on premise hasta...
 
Meetup de kubernetes, conceptos básicos.
Meetup  de kubernetes, conceptos básicos.Meetup  de kubernetes, conceptos básicos.
Meetup de kubernetes, conceptos básicos.
 

Similar a JVM Reactive Programming

Concurrencia en Java
Concurrencia en Java Concurrencia en Java
Concurrencia en Java
Pedro Gonzalez
 
Sistemas Tolerantes a Fallas
Sistemas Tolerantes a FallasSistemas Tolerantes a Fallas
Sistemas Tolerantes a Fallas
Agustin Ramos
 
Desarrollo de sistemas tolerantes a fallas
Desarrollo de sistemas tolerantes a fallasDesarrollo de sistemas tolerantes a fallas
Desarrollo de sistemas tolerantes a fallas
Software Guru
 
Rx js
Rx jsRx js
Sistemas operativos unidad 2
Sistemas operativos unidad 2Sistemas operativos unidad 2
Sistemas operativos unidad 2
Luis Cigarroa
 
UNIDAD II SISTEMAS OPERATIVOS
UNIDAD II SISTEMAS OPERATIVOSUNIDAD II SISTEMAS OPERATIVOS
UNIDAD II SISTEMAS OPERATIVOS
Selqit Mgw
 
DefinicionExplicacionEjemplosdeHilosenJava
DefinicionExplicacionEjemplosdeHilosenJavaDefinicionExplicacionEjemplosdeHilosenJava
DefinicionExplicacionEjemplosdeHilosenJava
DanielCorzo12
 
Desarrollo web con JAVA: Introduccion a los Servlets
Desarrollo web con JAVA: Introduccion a los ServletsDesarrollo web con JAVA: Introduccion a los Servlets
Desarrollo web con JAVA: Introduccion a los Servlets
Jon Vadillo Romero
 
Tema servlets
Tema servletsTema servlets
Tema servlets
simeonhuamanchao
 
Tema servlets
Tema servletsTema servlets
Tema servlets
simeonhuamanchao
 
Tema servlets
Tema servletsTema servlets
Tema servlets
simeonhuamanchao
 
Tema servlets
Tema servletsTema servlets
Tema servlets
simeonhuamanchao
 
servlets
servlets servlets
servlets
AltivaSA
 
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAPARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
Víctor Bolinches
 
Sincronizacion de procesos
Sincronizacion de procesosSincronizacion de procesos
Sincronizacion de procesos
kruskaya salazar
 
Procesos
ProcesosProcesos
Ajax: introducción
Ajax: introducciónAjax: introducción
Ajax: introducción
Moisés Pérez Delgado
 
Introduccion a Programacion Reactiva
Introduccion a Programacion ReactivaIntroduccion a Programacion Reactiva
Introduccion a Programacion Reactiva
Andres Almiray
 
programacion concurrente java.pptx
programacion concurrente java.pptxprogramacion concurrente java.pptx
programacion concurrente java.pptx
juan gonzalez
 
Evasión de Técnicas Forenses
Evasión de Técnicas ForensesEvasión de Técnicas Forenses
Evasión de Técnicas Forenses
Conferencias FIST
 

Similar a JVM Reactive Programming (20)

Concurrencia en Java
Concurrencia en Java Concurrencia en Java
Concurrencia en Java
 
Sistemas Tolerantes a Fallas
Sistemas Tolerantes a FallasSistemas Tolerantes a Fallas
Sistemas Tolerantes a Fallas
 
Desarrollo de sistemas tolerantes a fallas
Desarrollo de sistemas tolerantes a fallasDesarrollo de sistemas tolerantes a fallas
Desarrollo de sistemas tolerantes a fallas
 
Rx js
Rx jsRx js
Rx js
 
Sistemas operativos unidad 2
Sistemas operativos unidad 2Sistemas operativos unidad 2
Sistemas operativos unidad 2
 
UNIDAD II SISTEMAS OPERATIVOS
UNIDAD II SISTEMAS OPERATIVOSUNIDAD II SISTEMAS OPERATIVOS
UNIDAD II SISTEMAS OPERATIVOS
 
DefinicionExplicacionEjemplosdeHilosenJava
DefinicionExplicacionEjemplosdeHilosenJavaDefinicionExplicacionEjemplosdeHilosenJava
DefinicionExplicacionEjemplosdeHilosenJava
 
Desarrollo web con JAVA: Introduccion a los Servlets
Desarrollo web con JAVA: Introduccion a los ServletsDesarrollo web con JAVA: Introduccion a los Servlets
Desarrollo web con JAVA: Introduccion a los Servlets
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 
servlets
servlets servlets
servlets
 
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAPARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
 
Sincronizacion de procesos
Sincronizacion de procesosSincronizacion de procesos
Sincronizacion de procesos
 
Procesos
ProcesosProcesos
Procesos
 
Ajax: introducción
Ajax: introducciónAjax: introducción
Ajax: introducción
 
Introduccion a Programacion Reactiva
Introduccion a Programacion ReactivaIntroduccion a Programacion Reactiva
Introduccion a Programacion Reactiva
 
programacion concurrente java.pptx
programacion concurrente java.pptxprogramacion concurrente java.pptx
programacion concurrente java.pptx
 
Evasión de Técnicas Forenses
Evasión de Técnicas ForensesEvasión de Técnicas Forenses
Evasión de Técnicas Forenses
 

Más de Domingo Suarez Torres

Cloud Native MX Meetup - Asegurando tu Cluster de Kubernetes
Cloud Native MX Meetup - Asegurando tu Cluster de KubernetesCloud Native MX Meetup - Asegurando tu Cluster de Kubernetes
Cloud Native MX Meetup - Asegurando tu Cluster de Kubernetes
Domingo Suarez Torres
 
Java Dev Day 2019 No kuberneteen por convivir
Java Dev Day 2019  No kuberneteen por convivirJava Dev Day 2019  No kuberneteen por convivir
Java Dev Day 2019 No kuberneteen por convivir
Domingo Suarez Torres
 
Contenedores 101 Digital Ocean CDMX
Contenedores 101 Digital Ocean CDMXContenedores 101 Digital Ocean CDMX
Contenedores 101 Digital Ocean CDMX
Domingo Suarez Torres
 
Retos en la arquitectura de Microservicios
Retos en la arquitectura de MicroserviciosRetos en la arquitectura de Microservicios
Retos en la arquitectura de Microservicios
Domingo Suarez Torres
 
Java Cloud Native Hack Nights GDL
Java Cloud Native Hack Nights GDLJava Cloud Native Hack Nights GDL
Java Cloud Native Hack Nights GDL
Domingo Suarez Torres
 
meetup digital ocean kubernetes
meetup digital ocean kubernetesmeetup digital ocean kubernetes
meetup digital ocean kubernetes
Domingo Suarez Torres
 
Peru JUG Micronaut & GraalVM
Peru JUG Micronaut & GraalVMPeru JUG Micronaut & GraalVM
Peru JUG Micronaut & GraalVM
Domingo Suarez Torres
 
DevFest Lima Corriendo cargas e trabajo seguras en GKE con Istio
DevFest Lima Corriendo cargas e trabajo seguras en GKE con IstioDevFest Lima Corriendo cargas e trabajo seguras en GKE con Istio
DevFest Lima Corriendo cargas e trabajo seguras en GKE con Istio
Domingo Suarez Torres
 
Cloud Native Development in the JVM
Cloud Native Development in the JVMCloud Native Development in the JVM
Cloud Native Development in the JVM
Domingo Suarez Torres
 
Cloud Native Mexico - Introducción a Kubernetes
Cloud Native Mexico - Introducción a KubernetesCloud Native Mexico - Introducción a Kubernetes
Cloud Native Mexico - Introducción a Kubernetes
Domingo Suarez Torres
 
Meetup DigitalOcean Cloud Native architecture
Meetup DigitalOcean Cloud Native architectureMeetup DigitalOcean Cloud Native architecture
Meetup DigitalOcean Cloud Native architecture
Domingo Suarez Torres
 
Cloud Native Mexico Meetup de Marzo 2018 Service Mesh con Istio y Envoy
Cloud Native Mexico Meetup de Marzo 2018 Service Mesh con Istio y EnvoyCloud Native Mexico Meetup de Marzo 2018 Service Mesh con Istio y Envoy
Cloud Native Mexico Meetup de Marzo 2018 Service Mesh con Istio y Envoy
Domingo Suarez Torres
 
Cloud Native Mexico Meetup enero 2018 Observability
Cloud Native Mexico Meetup enero 2018 ObservabilityCloud Native Mexico Meetup enero 2018 Observability
Cloud Native Mexico Meetup enero 2018 Observability
Domingo Suarez Torres
 
Cloud Native Mexico Presentacion
Cloud Native Mexico PresentacionCloud Native Mexico Presentacion
Cloud Native Mexico Presentacion
Domingo Suarez Torres
 
gRPC: Beyond REST
gRPC: Beyond RESTgRPC: Beyond REST
gRPC: Beyond REST
Domingo Suarez Torres
 
Devops Landscape
Devops LandscapeDevops Landscape
Devops Landscape
Domingo Suarez Torres
 
Orquestación de contenedores con Kubernetes SGNext
Orquestación de contenedores con Kubernetes SGNextOrquestación de contenedores con Kubernetes SGNext
Orquestación de contenedores con Kubernetes SGNext
Domingo Suarez Torres
 
SGNext Elasticsearch
SGNext ElasticsearchSGNext Elasticsearch
SGNext Elasticsearch
Domingo Suarez Torres
 
Webinar Arquitectura de Microservicios
Webinar Arquitectura de MicroserviciosWebinar Arquitectura de Microservicios
Webinar Arquitectura de Microservicios
Domingo Suarez Torres
 
Elasticsearch JVM-MX Meetup April 2016
Elasticsearch JVM-MX Meetup April 2016Elasticsearch JVM-MX Meetup April 2016
Elasticsearch JVM-MX Meetup April 2016
Domingo Suarez Torres
 

Más de Domingo Suarez Torres (20)

Cloud Native MX Meetup - Asegurando tu Cluster de Kubernetes
Cloud Native MX Meetup - Asegurando tu Cluster de KubernetesCloud Native MX Meetup - Asegurando tu Cluster de Kubernetes
Cloud Native MX Meetup - Asegurando tu Cluster de Kubernetes
 
Java Dev Day 2019 No kuberneteen por convivir
Java Dev Day 2019  No kuberneteen por convivirJava Dev Day 2019  No kuberneteen por convivir
Java Dev Day 2019 No kuberneteen por convivir
 
Contenedores 101 Digital Ocean CDMX
Contenedores 101 Digital Ocean CDMXContenedores 101 Digital Ocean CDMX
Contenedores 101 Digital Ocean CDMX
 
Retos en la arquitectura de Microservicios
Retos en la arquitectura de MicroserviciosRetos en la arquitectura de Microservicios
Retos en la arquitectura de Microservicios
 
Java Cloud Native Hack Nights GDL
Java Cloud Native Hack Nights GDLJava Cloud Native Hack Nights GDL
Java Cloud Native Hack Nights GDL
 
meetup digital ocean kubernetes
meetup digital ocean kubernetesmeetup digital ocean kubernetes
meetup digital ocean kubernetes
 
Peru JUG Micronaut & GraalVM
Peru JUG Micronaut & GraalVMPeru JUG Micronaut & GraalVM
Peru JUG Micronaut & GraalVM
 
DevFest Lima Corriendo cargas e trabajo seguras en GKE con Istio
DevFest Lima Corriendo cargas e trabajo seguras en GKE con IstioDevFest Lima Corriendo cargas e trabajo seguras en GKE con Istio
DevFest Lima Corriendo cargas e trabajo seguras en GKE con Istio
 
Cloud Native Development in the JVM
Cloud Native Development in the JVMCloud Native Development in the JVM
Cloud Native Development in the JVM
 
Cloud Native Mexico - Introducción a Kubernetes
Cloud Native Mexico - Introducción a KubernetesCloud Native Mexico - Introducción a Kubernetes
Cloud Native Mexico - Introducción a Kubernetes
 
Meetup DigitalOcean Cloud Native architecture
Meetup DigitalOcean Cloud Native architectureMeetup DigitalOcean Cloud Native architecture
Meetup DigitalOcean Cloud Native architecture
 
Cloud Native Mexico Meetup de Marzo 2018 Service Mesh con Istio y Envoy
Cloud Native Mexico Meetup de Marzo 2018 Service Mesh con Istio y EnvoyCloud Native Mexico Meetup de Marzo 2018 Service Mesh con Istio y Envoy
Cloud Native Mexico Meetup de Marzo 2018 Service Mesh con Istio y Envoy
 
Cloud Native Mexico Meetup enero 2018 Observability
Cloud Native Mexico Meetup enero 2018 ObservabilityCloud Native Mexico Meetup enero 2018 Observability
Cloud Native Mexico Meetup enero 2018 Observability
 
Cloud Native Mexico Presentacion
Cloud Native Mexico PresentacionCloud Native Mexico Presentacion
Cloud Native Mexico Presentacion
 
gRPC: Beyond REST
gRPC: Beyond RESTgRPC: Beyond REST
gRPC: Beyond REST
 
Devops Landscape
Devops LandscapeDevops Landscape
Devops Landscape
 
Orquestación de contenedores con Kubernetes SGNext
Orquestación de contenedores con Kubernetes SGNextOrquestación de contenedores con Kubernetes SGNext
Orquestación de contenedores con Kubernetes SGNext
 
SGNext Elasticsearch
SGNext ElasticsearchSGNext Elasticsearch
SGNext Elasticsearch
 
Webinar Arquitectura de Microservicios
Webinar Arquitectura de MicroserviciosWebinar Arquitectura de Microservicios
Webinar Arquitectura de Microservicios
 
Elasticsearch JVM-MX Meetup April 2016
Elasticsearch JVM-MX Meetup April 2016Elasticsearch JVM-MX Meetup April 2016
Elasticsearch JVM-MX Meetup April 2016
 

Último

computacion global 3.pdf pARA TERCER GRADO
computacion global 3.pdf pARA TERCER GRADOcomputacion global 3.pdf pARA TERCER GRADO
computacion global 3.pdf pARA TERCER GRADO
YaniEscobar2
 
Second Life, informe de actividad del maestro Tapia
Second Life, informe de actividad del maestro TapiaSecond Life, informe de actividad del maestro Tapia
Second Life, informe de actividad del maestro Tapia
al050121024
 
Projecte Iniciativa TIC 2024 SOPRA STERIA. inCV.pdf
Projecte Iniciativa TIC 2024 SOPRA STERIA. inCV.pdfProjecte Iniciativa TIC 2024 SOPRA STERIA. inCV.pdf
Projecte Iniciativa TIC 2024 SOPRA STERIA. inCV.pdf
Festibity
 
Presentación de Tic en educación y sobre blogger
Presentación de Tic en educación y sobre bloggerPresentación de Tic en educación y sobre blogger
Presentación de Tic en educación y sobre blogger
larapalaciosmonzon28
 
Projecte Iniciativa TIC 2024 KAWARU CONSULTING. inCV.pdf
Projecte Iniciativa TIC 2024 KAWARU CONSULTING. inCV.pdfProjecte Iniciativa TIC 2024 KAWARU CONSULTING. inCV.pdf
Projecte Iniciativa TIC 2024 KAWARU CONSULTING. inCV.pdf
Festibity
 
Refrigeradores Samsung Modo Test y Forzado
Refrigeradores Samsung Modo Test y ForzadoRefrigeradores Samsung Modo Test y Forzado
Refrigeradores Samsung Modo Test y Forzado
NicandroMartinez2
 
EXAMEN DE TOPOGRAFIA RESUELTO-2017 CURSO DE UNIVERSIDAD
EXAMEN DE TOPOGRAFIA RESUELTO-2017 CURSO DE UNIVERSIDADEXAMEN DE TOPOGRAFIA RESUELTO-2017 CURSO DE UNIVERSIDAD
EXAMEN DE TOPOGRAFIA RESUELTO-2017 CURSO DE UNIVERSIDAD
AngelCristhianMB
 
Projecte Iniciativa TIC 2024 HPE. inCV.pdf
Projecte Iniciativa TIC 2024 HPE. inCV.pdfProjecte Iniciativa TIC 2024 HPE. inCV.pdf
Projecte Iniciativa TIC 2024 HPE. inCV.pdf
Festibity
 
Informació Projecte Iniciativa TIC SOPRA STERIA.pdf
Informació Projecte Iniciativa TIC SOPRA STERIA.pdfInformació Projecte Iniciativa TIC SOPRA STERIA.pdf
Informació Projecte Iniciativa TIC SOPRA STERIA.pdf
Festibity
 
Manual de Soporte y mantenimiento de equipo de cómputos
Manual de Soporte y mantenimiento de equipo de cómputosManual de Soporte y mantenimiento de equipo de cómputos
Manual de Soporte y mantenimiento de equipo de cómputos
cbtechchihuahua
 
PLAN DE MANTENMIENTO preventivo de un equipo de computo.pdf
PLAN DE MANTENMIENTO preventivo de un equipo de computo.pdfPLAN DE MANTENMIENTO preventivo de un equipo de computo.pdf
PLAN DE MANTENMIENTO preventivo de un equipo de computo.pdf
70244530
 
REVISTA TECNOLOGICA PARA EL DESARROLLO HUMANO
REVISTA TECNOLOGICA PARA EL DESARROLLO HUMANOREVISTA TECNOLOGICA PARA EL DESARROLLO HUMANO
REVISTA TECNOLOGICA PARA EL DESARROLLO HUMANO
gisellearanguren1
 
mantenimiento de chasis y carroceria1.pptx
mantenimiento de chasis y carroceria1.pptxmantenimiento de chasis y carroceria1.pptx
mantenimiento de chasis y carroceria1.pptx
MiguelAtencio10
 
Catalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador Valencia
Catalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador ValenciaCatalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador Valencia
Catalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador Valencia
AMADO SALVADOR
 
Modo test refrigeradores y codigos de errores 2018 V2.pdf
Modo test refrigeradores y codigos de errores 2018 V2.pdfModo test refrigeradores y codigos de errores 2018 V2.pdf
Modo test refrigeradores y codigos de errores 2018 V2.pdf
ranierglez
 
Flows: Mejores Prácticas y Nuevos Features
Flows: Mejores Prácticas y Nuevos FeaturesFlows: Mejores Prácticas y Nuevos Features
Flows: Mejores Prácticas y Nuevos Features
Paola De la Torre
 
625204013-64-Camino-a-----La-Lectura.pdf
625204013-64-Camino-a-----La-Lectura.pdf625204013-64-Camino-a-----La-Lectura.pdf
625204013-64-Camino-a-----La-Lectura.pdf
yuberpalma
 
Todo sobre la tarjeta de video (Bienvenidos a mi blog personal)
Todo sobre la tarjeta de video (Bienvenidos a mi blog personal)Todo sobre la tarjeta de video (Bienvenidos a mi blog personal)
Todo sobre la tarjeta de video (Bienvenidos a mi blog personal)
AbrahamCastillo42
 
El uso de las TIC por Cecilia Pozos S..pptx
El uso de las TIC  por Cecilia Pozos S..pptxEl uso de las TIC  por Cecilia Pozos S..pptx
El uso de las TIC por Cecilia Pozos S..pptx
cecypozos703
 
TIC en educacion.rtf.docxlolololololololo
TIC en educacion.rtf.docxlolololololololoTIC en educacion.rtf.docxlolololololololo
TIC en educacion.rtf.docxlolololololololo
KukiiSanchez
 

Último (20)

computacion global 3.pdf pARA TERCER GRADO
computacion global 3.pdf pARA TERCER GRADOcomputacion global 3.pdf pARA TERCER GRADO
computacion global 3.pdf pARA TERCER GRADO
 
Second Life, informe de actividad del maestro Tapia
Second Life, informe de actividad del maestro TapiaSecond Life, informe de actividad del maestro Tapia
Second Life, informe de actividad del maestro Tapia
 
Projecte Iniciativa TIC 2024 SOPRA STERIA. inCV.pdf
Projecte Iniciativa TIC 2024 SOPRA STERIA. inCV.pdfProjecte Iniciativa TIC 2024 SOPRA STERIA. inCV.pdf
Projecte Iniciativa TIC 2024 SOPRA STERIA. inCV.pdf
 
Presentación de Tic en educación y sobre blogger
Presentación de Tic en educación y sobre bloggerPresentación de Tic en educación y sobre blogger
Presentación de Tic en educación y sobre blogger
 
Projecte Iniciativa TIC 2024 KAWARU CONSULTING. inCV.pdf
Projecte Iniciativa TIC 2024 KAWARU CONSULTING. inCV.pdfProjecte Iniciativa TIC 2024 KAWARU CONSULTING. inCV.pdf
Projecte Iniciativa TIC 2024 KAWARU CONSULTING. inCV.pdf
 
Refrigeradores Samsung Modo Test y Forzado
Refrigeradores Samsung Modo Test y ForzadoRefrigeradores Samsung Modo Test y Forzado
Refrigeradores Samsung Modo Test y Forzado
 
EXAMEN DE TOPOGRAFIA RESUELTO-2017 CURSO DE UNIVERSIDAD
EXAMEN DE TOPOGRAFIA RESUELTO-2017 CURSO DE UNIVERSIDADEXAMEN DE TOPOGRAFIA RESUELTO-2017 CURSO DE UNIVERSIDAD
EXAMEN DE TOPOGRAFIA RESUELTO-2017 CURSO DE UNIVERSIDAD
 
Projecte Iniciativa TIC 2024 HPE. inCV.pdf
Projecte Iniciativa TIC 2024 HPE. inCV.pdfProjecte Iniciativa TIC 2024 HPE. inCV.pdf
Projecte Iniciativa TIC 2024 HPE. inCV.pdf
 
Informació Projecte Iniciativa TIC SOPRA STERIA.pdf
Informació Projecte Iniciativa TIC SOPRA STERIA.pdfInformació Projecte Iniciativa TIC SOPRA STERIA.pdf
Informació Projecte Iniciativa TIC SOPRA STERIA.pdf
 
Manual de Soporte y mantenimiento de equipo de cómputos
Manual de Soporte y mantenimiento de equipo de cómputosManual de Soporte y mantenimiento de equipo de cómputos
Manual de Soporte y mantenimiento de equipo de cómputos
 
PLAN DE MANTENMIENTO preventivo de un equipo de computo.pdf
PLAN DE MANTENMIENTO preventivo de un equipo de computo.pdfPLAN DE MANTENMIENTO preventivo de un equipo de computo.pdf
PLAN DE MANTENMIENTO preventivo de un equipo de computo.pdf
 
REVISTA TECNOLOGICA PARA EL DESARROLLO HUMANO
REVISTA TECNOLOGICA PARA EL DESARROLLO HUMANOREVISTA TECNOLOGICA PARA EL DESARROLLO HUMANO
REVISTA TECNOLOGICA PARA EL DESARROLLO HUMANO
 
mantenimiento de chasis y carroceria1.pptx
mantenimiento de chasis y carroceria1.pptxmantenimiento de chasis y carroceria1.pptx
mantenimiento de chasis y carroceria1.pptx
 
Catalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador Valencia
Catalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador ValenciaCatalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador Valencia
Catalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador Valencia
 
Modo test refrigeradores y codigos de errores 2018 V2.pdf
Modo test refrigeradores y codigos de errores 2018 V2.pdfModo test refrigeradores y codigos de errores 2018 V2.pdf
Modo test refrigeradores y codigos de errores 2018 V2.pdf
 
Flows: Mejores Prácticas y Nuevos Features
Flows: Mejores Prácticas y Nuevos FeaturesFlows: Mejores Prácticas y Nuevos Features
Flows: Mejores Prácticas y Nuevos Features
 
625204013-64-Camino-a-----La-Lectura.pdf
625204013-64-Camino-a-----La-Lectura.pdf625204013-64-Camino-a-----La-Lectura.pdf
625204013-64-Camino-a-----La-Lectura.pdf
 
Todo sobre la tarjeta de video (Bienvenidos a mi blog personal)
Todo sobre la tarjeta de video (Bienvenidos a mi blog personal)Todo sobre la tarjeta de video (Bienvenidos a mi blog personal)
Todo sobre la tarjeta de video (Bienvenidos a mi blog personal)
 
El uso de las TIC por Cecilia Pozos S..pptx
El uso de las TIC  por Cecilia Pozos S..pptxEl uso de las TIC  por Cecilia Pozos S..pptx
El uso de las TIC por Cecilia Pozos S..pptx
 
TIC en educacion.rtf.docxlolololololololo
TIC en educacion.rtf.docxlolololololololoTIC en educacion.rtf.docxlolololololololo
TIC en educacion.rtf.docxlolololololololo
 

JVM Reactive Programming

  • 1. JVM Reactive Programming Mexico City JVM Group October 2016 domix domix coderDog
  • 3. !Ya estamos en vivo¡
  • 5. La idea de ‘Live’ • Reuniones intermedias entre cada meetup presencial en CDMX • Para desarrolladores que no pueden asistir • Para expositores nacionales o internacionales • Esfuerzo paralelo a las actividades de JVM_MX • YOLO
  • 8. Raul Estrada (@BusinessRul) Isaac Ruiz Guerra (@rugi)
  • 9.
  • 12. Reactive Programming • “Reactive Programming” es programar con flujos de datos asíncronos. • Flujo de datos (Data Stream): Una secuencia de valores • Modelo de programación basado en el principio de empujar (push) en lugar de obtener (pull). • Los valores se “emiten” cuando están listos, no cuando se solicitan de una forma no-bloqueante (non-blocking) • Se permite ejecutar operaciones en paralelo en lugar de forma serial.
  • 13. Functional Reactive Programming • Functional programming • https://maryrosecook.com/blog/post/a-practical- introduction-to-functional-programming • Lleva a Reactive Programming al siguiente nivel. • Permute aplicar funciones al flujo de datos. • map, filter, zip, take, etc.. • Integra flujo de tiempo y los eventos de composición en la programación funcional.
  • 14. ReactiveX Reactive eXtensions • Creado en Microsoft por Erik Meijer • Colección de funciones útiles para hacer programación reactiva. • ReactiveX esta implementado en mas de 10 lenguajes. • RxJava es la implementación de ReactiveX, fue escrita por el equipo de Netflix
  • 15. ReactiveX • Observable: fuente de flujos de datos (sender). • Observer: Escucha los valores emitidos (receiver) • El Observer se suscribe (escucha) al Observable • Los Observers reaccionan a cualquier elemento o secuencias de elementos que emita el Observable • Muchos Observers pueden suscribirse al mismo Observable.
  • 16. Observable Observer Pattern • Permite operaciones concurrentes: el Observer no necesita bloquear mientras espera que el Observable emita valores • El Observer espera a recibir valores cuando el Observable esta listo para emitirlos • Sobre la base de empuje (push) en lugar de obtener (pull)
  • 18. RxJava • Proyecto Open Source con Licencia Apache. • Implementación en Java de ReactiveX de Microsoft • El API de Netflix la usa para hacer la capa de servicio completamente asíncrona. • El objetivo es la JVM no el lenguaje. • Existe soporte para Java, Groovy, Clojure, y Scala
  • 19. RxJava Features • Composable: Fácilmente se puede encadenar o combinar • Flexible: Se puede usar para emitir: • Un valor escalar (network result) • Secuencia (elementos en una lista) • Flujos infinitos (sensores de clima) • Mitiga el callback hell: Fácilmente se puede transformar un flujo asíncrono en otro
  • 20. Usando Iterables • Antes de reactivo 1. Invocar un método 2. Esperar el resultado 3. Almacenar el resultado en una variable 4. Usar la variable para hacer algo util.
  • 21. Usando Observables 1. Definir un Observer que especifica que hacer con cada valor emitido 2. Invocar un método que regrese un Observable 3. Suscribirse el Observer al Observable. Esto le dice al Observable que tiene un subscriptor esperando a recibir valores cuando estén disponibles.
  • 22. En RxJava • El método Subscribe conecta un Observer a un Observable • Una ves suscrito, no hay necesidad de bloquear el hilo actual. • Los valores llegaran al Observer cuando estén listos y disponibles
  • 23. Interface rx.Observer public interface rx.Observer<T> {
 void onCompleted();
 
 void onError(Throwable e);
 
 void onNext(T t);
 
 }
  • 24. void onCompleted(); 
 /**
 * Notifies the Observer that the * {@link Observable} has finished sending * push-based notifications.
 * <p>
 * The {@link Observable} will not call * this method if it calls {@link #onError}.
 */
 void onCompleted();
  • 25. void onCompleted(); • El Observable invoca este método después de que se invocó el método onNext por ultima ocasión y no encontró ningún error. • La llamada a onComplete finaliza la subscripción.
  • 26. void onError(Throwable e); /**
 * Notifies the Observer that the {@link Observable} * has experienced an error condition.
 * <p>
 * If the {@link Observable} calls this method, it * will not thereafter call {@link #onNext} or
 * {@link #onCompleted}.
 * 
 * @param e
 * the exception encountered by the * Observable
 */
 void onError(Throwable e);
  • 27. void onError(Throwable e); • El Observable invoca este método para indicar que ha fallado al obtener la información esperada o alguno otro problema. • Esto detiene al Observable y no hará mas invocaciones. • Envía la excepción que genero el problema.
  • 28. void onNext(T t) /**
 * Provides the Observer with a new item to observe.
 * <p>
 * The {@link Observable} may call this method 0 or * more times.
 * <p>
 * The {@code Observable} will not call this method * again after it calls either {@link #onCompleted} * or {@link #onError}.
 * 
 * @param t
 * the item emitted by the Observable
 */
 void onNext(T t);
  • 29. void onNext(T t) • El Observable invoca este método cada vez que el Observable emite un elemento. • Este método puede ser invocado cualquier número de veces (de cero a muchos). • Siempre seguido por onError o onComplete (pero no ambos)
  • 30. Uso sencillo public Observable<Double> dollarToCurrencyExchangeRate(String targetCurrencyCode) {
 // se crea de alguna manera el Observable
 return ...
 } public void foo() {
 dollarToCurrencyExchangeRate("MXN")
 .subscribe(System.out::println);
 }
  • 31. Composing el Observable public void foo() {
 dollarToCurrencyExchangeRate("MXN")
 .throttleWithTimeout(2, TimeUnit.MINUTES)
 .distinctUntilChanged()
 .filter(value -> value > 0)
 .map(Object::toString)
 .subscribe(System.out::println);
 }

  • 32. ¿Como esta implementado el Observable? • ¿Tal vez ejecuta su lógica en el hilo del subscriptor? • ¿Tal vez delega parte del trabajo a otros hilos? • ¿Usará NIO? • ¿Tal vez es un actor? • ¿Devolverá datos de un cache? • ¡Al Observer no le importa!
  • 33. Consumiendo Observables Modo largo… 
 rx.Observable.just(1, 2, 3)
 .subscribe(new rx.Observer<Integer>() {
 @Override
 public void onCompleted() {
 System.out.println("No más elementos.");
 }
 
 @Override
 public void onError(Throwable e) {
 System.out.println(
 String.format("Ocurrio un problema: %s", e.getMessage()));
 }
 
 @Override
 public void onNext(Integer integer) {
 System.out.println(
 String.format("Valor recibido: %d", integer));
 }
 });
  • 34. Consumiendo Observables Modo corto Java 8. 
 rx.Observable.just(1, 2, 3)
 .subscribe(
 value ->
 System.out.println(
 String.format("Valor recibido: %d", value)),
 throwable ->
 System.out.println(
 String.format("Ocurrio un problema: %s",
 throwable.getMessage())),
 () -> System.out.println("No más elementos."));
  • 35. Operadores doOn* rx.Observable.just(1, 2, 3, 4, 5)
 .doOnNext(value -> {
 if (Integer.valueOf(4).equals(value)) {
 throw new RuntimeException("El cuatro es feo.");
 }
 })
 .doOnError(throwable -> System.out.println(
 String.format("Ocurrio un problema: %s",
 throwable.getMessage())))
 .doOnCompleted(() -> System.out.println("No más elementos."))
 .subscribe(value ->
 System.out.println(
 String.format("Valor recibido: %d", value)));
  • 36.
  • 37. Creando Observable de forma explicita. rx.Observable.<Integer>create(subscriber -> {
 try {
 for (int i = 0; i < 5; i++) {
 subscriber.onNext(i);
 }
 // Si olvidamos invocar onCompleted se
 // pueden crear Observables sin fin.
 subscriber.onCompleted();
 } catch (Throwable cause) {
 subscriber.onError(cause);
 }
 });
  • 38.
  • 41. Transformando data map rx.Observable.just(1, 2, 3, 4, 5)
 .map(value -> String .format("Value: %s", value.toString()))
 .subscribe(System.out::println);
  • 45. Ejercicio 1 Implementar la kata FizzBuzz http://codingdojo.org/cgi-bin/index.pl?KataFizzBuzz https://en.wikipedia.org/wiki/Fizz_buzz Hasta el número 20
  • 46. Backpressure • ¿Que ocurre si un Observable esta emitiendo elementos más rápido de lo que el Observer puede procesarlos? • Cold Observable: • Emite una secuencia particular de elementos, puede empezar a emitirla cuando su Observer lo considere conveniente y a la tasa de entrega que el Observer desee, sin interferir la integridad de la secuencia. • Hot Observable: • Es un Observable que empieza a generar elementos inmediatamente cuando es creado. Los subscriptores pueden empezar a observar la secuencia de elementos emitidos a la mitad de la secuencia, empezando con el primer elemento emitido posterior al establecimiento de la subscripción. Dicho Observable emite elementos a su propio ritmo y es responsabilidad de los Observers mantener ese mismo ritmo.
  • 50. List<Observable<byte[]>> observables =
 //obtengo todas las instancias de los servicios
 discoveryClient.getInstances("service_id").stream()
 //Obtengo su URI remota (host:port)
 .map(serviceInstance -> serviceInstance.getUri().toString())
 //Genera un Worker que hará el trabajo de pedirle //a cada instancia del servicio el archivo. //DownloadCacheWorker implementa java.util.concurrent.Callable
 .map(baseUrl -> new DownloadLocalCacheWorker(baseUrl, bucket, key))
 //Genero un Future para hacerlo asíncrono
 .map(callable -> ((ThreadPoolTaskExecutor) taskExecutor).submit(callable))
 //Lo convierto a Observable para facilitar //el manejo de errores
 .map(Observable::from)
 //Genero una lista de Observables
 .collect(Collectors.toList());
  • 51. 
 //Genero un solo Observable a partir de todos
 Observable.merge(observables)
 //Si algo falla al obtener el archivo del //servicio remoto, simplemente regreso null
 .onErrorReturn(throwable -> {
 log.warn("No se encontró algo", throwable);
 return null;
 }).doOnCompleted(() -> {})
 //Descarto todos los null
 .filter(fileContent -> fileContent != null)
 //obtengo el primer resultado exitoso //(en teoría solo debe existir en un solo servidor)
 .firstOrDefault(null)
 //hago la llamada bloqueante
 .toBlocking()
 //aplico la lógica de manejo del archivo
 .subscribe(new DownloadLocalCacheObserver(response, key, notFound));

  • 52. A seguir • Project Reactor • https://projectreactor.io/ • Akka • http://akka.io/ • Reactive Streams • http://www.reactive-streams.org/