SlideShare uma empresa Scribd logo
PROGRAMAÇÃO
REATIVA
Mateus Parente
reação
1.ato ou efeito de reagir.
resposta a uma ação anterior.
2.comportamento de um ser vivo
manifestado em presença de um
estímulo.
movimento de opinião que age em sentido oposto ao que o precedeu.
força, princípio ou tendência contrária; oposição, resistência
O MUNDO É
ASSINCRONO !
VOCÊ
É ASSINCRONO !
E SUA APLICAÇÃO?
TRABALHAR DE FORMA ASSÍNCRONA
MAS
ORQUESTRADA
motivações
ONTEM HOJE
resposta em segundos
horas de manutenção
gigabyte de dados
dezenas de servidores
resposta em milissegundos
100% de disponibilidade
Petabytes de dados
aplicações em nuvem com clusters rodando
milhares processadores multi-core
ARQUITETURA DE
ONTEM
O método padrão de desenvolvimento precisa
ser alterado
pra acompanhar toda essa evolução. Criar uma
rotina, e trabalhar com respostas síncronas, não
atende mais essa necessidade.
@RestController
@RequestMapping("/v1/categorias")
public class CategoriaController {
@GetMapping
public Iterable<Categoria> findAll(){
System.out.println(Thread.currentThread().getName());
return repository.findAll();
}
}
10x
@RestController
@RequestMapping("/v1/categorias")
public class CategoriaController {
@GetMapping
public Iterable<Categoria> findAll(){
System.out.println(Thread.currentThread().getName());
return repository.findAll();
}
}
CONSOLE
http-nio-9000-exec-1
http-nio-9000-exec-2
http-nio-9000-exec-3
http-nio-9000-exec-4
http-nio-9000-exec-5
http-nio-9000-exec-6
http-nio-9000-exec-7
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
20
seg
20
seg
20
seg
20
seg
20
seg
20
seg
20
seg
20
seg
20
seg
20
seg
request
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
20
seg
20
seg
20
seg
20
seg
20
seg
20
seg
20
seg
20
seg
20
seg
20
seg
20 SEGUNDOS 10 REQUISIÇÕES
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
20
seg
20
seg
20
seg
20
seg
20
seg
20
seg
20
seg
20
seg
20
seg
20
seg
80
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
20
seg
20
seg
20
seg
20
seg
20
seg
20
seg
20
seg
20
seg
20
seg
20
seg
80
Timeout = 60 segundos
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
20 SEGUNDOS 10 REQUISIÇÕES
20
seg
20
seg
20
seg
20
seg
20
seg
20
seg
20
seg
20
seg
20
seg
20
seg
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
20 SEGUNDOS 10 REQUISIÇÕES
60 SEGUNDOS 30 REQUISIÇÕES
20
seg
20
seg
20
seg
20
seg
20
seg
20
seg
20
seg
20
seg
20
seg
20
seg
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
80
50
20
seg
20
seg
20
seg
20
seg
20
seg
20
seg
20
seg
20
seg
20
seg
20
seg
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
2
seg
2
seg
2
seg
2
seg
2
seg
2
seg
2
seg
2
seg
2
seg
2
seg
80
50
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
2
seg
2
seg
2
seg
2
seg
2
seg
2
seg
2
seg
2
seg
100
ms
request
100
ms
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
THR
EAD
ESCALÁ
VEL
ELÁSTIC
A
ELÁSTICO
PILARES
RESILIE
NTERESPONSIV
OORIENTADO A
ELÁSTICO
PILARES
O sistema continua responsivo mesmo sob
variações de demanda.
RESILIENTE
PILARES
O sistema continua respondendo em caso de
falha.
PILARES
PILARES
PILARES
RESPONSIV
O
PILARES
O sistema responde em um tempo hábil se
possível.
ORIENTAD
O A
MENSAGEN
S
PILARES
Reage à eventos (event driven): em vez de compor
aplicações por múltiplas threads síncrona, sistemas
são compostos de gerenciadores de eventos
assíncronos e não bloqueantes
RXJAVA?
Q DIABE ISSO
Erik Meijer
Microsoft .NET
A programação reativa funcional surgiu como uma ideia no final dos anos 90
Microsoft Rx
Ben Christensen Jafar Husain
fevereiro de 2013
RxJava
Observado Observador
Observado
PRODUTOR
Observado
VENDEDORES
DE
LARANJA
FABRICA DE
SUCO
PRODUTOR
DE
DOCES
OBSERVADOR OBSERVADOR OBSERVADOR
Observado
VENDEDORES
DE
LARANJA
FABRICA DE
SUCO
PRODUTOR
DE
DOCES
OBSERVADOR OBSERVADOR OBSERVADOR
VENDEDOR SUCOS DOCEIRO
PRODUTO FINAL PRODUTO FINAL PRODUTO FINAL
VENDEDOR SUCOS DOCEIRO
CONSUMIDOR
FINAL
OBSERVADOR
PRODUTO FINAL PRODUTO FINAL PRODUTO FINAL
CONSUMIDOR
FINAL
OBSERVADOR
SUCOS DOCEIROVENDEDOR
PRODUTO FINAL PRODUTO FINAL PRODUTO FINAL
vamos ao mundo real
Observable Observer
Observable Observer
EMISSÃO DE ITENS
PUSH MODEL
CONSUMO DE ITENS
PUSHED MODEL
CRIANDO UM OBSERVABLE
Observable<String> evento = Observable.just(“JAVOU”);
CRIANDO UM OBSERVER
Observable<String> evento = Observable.just(“JAVOU”);
evento.subscribe(new Observer<String>() {
@Override
public void onNext(String item) {
System.out.println(item);
}
@Override
public void onCompleted() {}
@Override
public void onError(Throwable e) {}
});
CRIANDO UM OBSERVER
Evento Iterable Observer<T>
Recuperar T next() onNext(T)
Lançar exception throws Exception onError(Exception)
Saber se terminou !hasNext() onCompleted()
CRIANDO UM OBSERVER
Observable<String> evento = Observable.just(“JAVOU”);
evento.subscribe(new Observer<String>() {
@Override
public void onNext(String item) {
System.out.println(item);
}
@Override
public void onCompleted() {}
@Override
public void onError(Throwable e) {}
});
CRIANDO UM OBSERVER
Observable<String> evento = Observable.just(“JAVOU”);
evento.subscribe(new Observer<String>() {
@Override
public void onNext(String item) {
System.out.println(item);
}
@Override
public void onCompleted() {}
@Override
public void onError(Throwable e) {}
});
CONSOLE
CRIANDO UM OBSERVER
Observable<String> evento = Observable.just(“JAVOU”);
evento.subscribe(new Observer<String>() {
@Override
public void onNext(String item) {
System.out.println(item);
}
@Override
public void onCompleted() {}
@Override
public void onError(Throwable e) {}
});
CONSOLE
JAVOU
reação
1.ato ou efeito de reagir.
resposta a uma ação anterior.
2.comportamento de um ser vivo
manifestado em presença de um
estímulo.
movimento de opinião que age em sentido oposto ao que o precedeu.
força, princípio ou tendência contrária; oposição, resistência
E caso eu tenha mais de um objeto para
transmitir?
CRIANDO UM OBSERVABLE
Observable<String> evento =
Observable.just(“PERA”, “UVA”, “MACA”, “SALADA
MISTA”);
CRIANDO UM OBSERVABLE
Observable<String> evento =
Observable.just(“PERA”, “UVA”, “MACA”, “SALADA
MISTA”);
10 PARAMETROS!
CRIANDO UM OBSERVABLE
List<String> itens =
Lists.newArrayList(“PERA”, “UVA”, “MACA”, “SALADA MISTA”);
Observable<String> evento = Observable.from(itens);
OPERADORES DE CRIAÇÃO
just from empty never
fromCallable create
...
Observable ObservableOperators
Observable Observable
Operators
TRANSFORMAÇÃO
FILTRAGEM
COMBINAÇÃO
MATEMÁTICOS
...
PARTIU IMPLEMENTAR COM OPERATORS
PROPAGAR A PARTIR DE UMA LISTA DE CLIENTES O
ENDERECO CRIPTOGRAFADO DO PRIMEIRO CLIENTE
PREMIADO.
public class Cliente {
private Long id;
private boolean premiado;
private String endereco;
List<Cliente> clientes = new ArrayList<Cliente>();
clientes.add(new Cliente(1L, false, "Rua 1"));
clientes.add(new Cliente(2L, false, "Rua 2"));
clientes.add(new Cliente(3L, true, "Rua 3"));
clientes.add(new Cliente(4L, false, "Rua 4"));
List<Cliente> clientes = new ArrayList<Cliente>();
clientes.add(new Cliente(1L, false, "Rua 1"));
clientes.add(new Cliente(2L, false, "Rua 2"));
clientes.add(new Cliente(3L, true, "Rua 3"));
clientes.add(new Cliente(4L, false, "Rua 4"));
Observable<String> evento =
Observable.from(clientes)
Observable<String> evento =
Observable.from(clientes)
.filter(cliente -> cliente.isPremiado())
Observable<String> evento =
Observable.from(clientes)
.filter(cliente -> cliente.isPremiado())
.first()
Observable<String> evento =
Observable.from(clientes)
.filter(cliente -> cliente.isPremiado())
.first()
.map(clientePremiado ->
clientePremiado.getEndereco())
Observable<String> evento =
Observable.from(clientes)
.filter(cliente -> cliente.isPremiado())
.first()
.map(clientePremiado ->
clientePremiado.getEndereco())
.flatMap(endereco ->
Observable.just(cripto(endereco)));
TÁ.. MAS E O PROBLEMA INICIAL DAS
THREADS?
10x
@RestController
@RequestMapping("/v1/categorias")
public class CategoriaController {
@GetMapping
public Iterable<Categoria> findAll(){
System.out.println(Thread.currentThread().getName());
return repository.findAll();
}
}
CONSOLE
http-nio-9000-exec-1
http-nio-9000-exec-2
http-nio-9000-exec-3
http-nio-9000-exec-4
http-nio-9000-exec-5
http-nio-9000-exec-6
http-nio-9000-exec-7
Observable<String> evento =
Observable.from(clientes)
.filter(cliente -> cliente.isPremiado())
.first()
.map(clientePremiado ->
clientePremiado.getEndereco())
.flatMap(endereco ->
Observable.just(cripto(endereco)));
SCHEDULER
evento
.subscribeOn(Schedulers.io())
.subscribe(item -> {
System.out.println(Thread.currentThread().getName());
// System.out.println(item);
});
CONSOLE
SCHEDULER
evento
.subscribeOn(Schedulers.io())
.subscribe(item -> {
System.out.println(Thread.currentThread().getName());
// System.out.println(item);
});
CONSOLE
RxIoScheduler-2
SCHEDULER
io computation newThread test
...
OBRIGADOMPRIPARDO@GMAIL.COM

Mais conteúdo relacionado

Semelhante a Programação reativa com RxJava

Programação funcional em JavaScript: como e por quê?
Programação funcional em JavaScript: como e por quê?Programação funcional em JavaScript: como e por quê?
Programação funcional em JavaScript: como e por quê?
Arthur Xavier
 
Testes em Aplicações Web com Cactus
Testes em Aplicações Web com CactusTestes em Aplicações Web com Cactus
Testes em Aplicações Web com Cactus
Denis L Presciliano
 
Java para iniciantes
Java para iniciantesJava para iniciantes
Java para iniciantes
Guilherme André Turci
 
Android wear
Android wearAndroid wear
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
tdc-globalcode
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
tdc-globalcode
 
RxJava - Programação assíncrona para Android.
RxJava - Programação assíncrona para Android.RxJava - Programação assíncrona para Android.
RxJava - Programação assíncrona para Android.
Clerton Leal
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_jav
Julio Viegas
 
Testes de Unidade com JUnit
Testes de Unidade com JUnitTestes de Unidade com JUnit
Testes de Unidade com JUnit
elliando dias
 
TDC 2015 - Execução em Background e Live Tiles em Universal Apps
TDC 2015 - Execução em Background e Live Tiles em Universal AppsTDC 2015 - Execução em Background e Live Tiles em Universal Apps
TDC 2015 - Execução em Background e Live Tiles em Universal Apps
Diego Castro
 
Oficina Android - Games com AndEngine - Dia 3
Oficina Android - Games com AndEngine - Dia 3Oficina Android - Games com AndEngine - Dia 3
Oficina Android - Games com AndEngine - Dia 3
Odair Bonin Borges
 
Conectando o Android a outros sistemas
Conectando o Android a outros sistemasConectando o Android a outros sistemas
Conectando o Android a outros sistemas
Elias Junior
 
Ajax em java
Ajax em javaAjax em java
Ajax em java
Maurício Linhares
 
Construindo sua primeira aplicação android
Construindo sua primeira aplicação androidConstruindo sua primeira aplicação android
Construindo sua primeira aplicação android
666Insanity
 
Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira
Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo SilveiraServlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira
Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira
Caelum
 
Regras de Produção: o Motor de Inferência JESS
Regras de Produção:o Motor de Inferência JESSRegras de Produção:o Motor de Inferência JESS
Regras de Produção: o Motor de Inferência JESS
elliando dias
 
Algoritmos de ordenação
Algoritmos de ordenaçãoAlgoritmos de ordenação
Algoritmos de ordenação
Lorival Smolski Chapuis
 
Tutorial java swing
Tutorial java swingTutorial java swing
Tutorial java swing
izalem nascimento
 
TDC - Introdução ao Actor Model com Microsoft Orleans
TDC - Introdução ao Actor Model com Microsoft OrleansTDC - Introdução ao Actor Model com Microsoft Orleans
TDC - Introdução ao Actor Model com Microsoft Orleans
Fabio Gouw
 
JUnit: framework de testes unitários
JUnit: framework de testes unitáriosJUnit: framework de testes unitários
JUnit: framework de testes unitários
elliando dias
 

Semelhante a Programação reativa com RxJava (20)

Programação funcional em JavaScript: como e por quê?
Programação funcional em JavaScript: como e por quê?Programação funcional em JavaScript: como e por quê?
Programação funcional em JavaScript: como e por quê?
 
Testes em Aplicações Web com Cactus
Testes em Aplicações Web com CactusTestes em Aplicações Web com Cactus
Testes em Aplicações Web com Cactus
 
Java para iniciantes
Java para iniciantesJava para iniciantes
Java para iniciantes
 
Android wear
Android wearAndroid wear
Android wear
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
 
RxJava - Programação assíncrona para Android.
RxJava - Programação assíncrona para Android.RxJava - Programação assíncrona para Android.
RxJava - Programação assíncrona para Android.
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_jav
 
Testes de Unidade com JUnit
Testes de Unidade com JUnitTestes de Unidade com JUnit
Testes de Unidade com JUnit
 
TDC 2015 - Execução em Background e Live Tiles em Universal Apps
TDC 2015 - Execução em Background e Live Tiles em Universal AppsTDC 2015 - Execução em Background e Live Tiles em Universal Apps
TDC 2015 - Execução em Background e Live Tiles em Universal Apps
 
Oficina Android - Games com AndEngine - Dia 3
Oficina Android - Games com AndEngine - Dia 3Oficina Android - Games com AndEngine - Dia 3
Oficina Android - Games com AndEngine - Dia 3
 
Conectando o Android a outros sistemas
Conectando o Android a outros sistemasConectando o Android a outros sistemas
Conectando o Android a outros sistemas
 
Ajax em java
Ajax em javaAjax em java
Ajax em java
 
Construindo sua primeira aplicação android
Construindo sua primeira aplicação androidConstruindo sua primeira aplicação android
Construindo sua primeira aplicação android
 
Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira
Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo SilveiraServlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira
Servlets 3: o contexto assíncrono - JavaOne 2010 - Paulo Silveira
 
Regras de Produção: o Motor de Inferência JESS
Regras de Produção:o Motor de Inferência JESSRegras de Produção:o Motor de Inferência JESS
Regras de Produção: o Motor de Inferência JESS
 
Algoritmos de ordenação
Algoritmos de ordenaçãoAlgoritmos de ordenação
Algoritmos de ordenação
 
Tutorial java swing
Tutorial java swingTutorial java swing
Tutorial java swing
 
TDC - Introdução ao Actor Model com Microsoft Orleans
TDC - Introdução ao Actor Model com Microsoft OrleansTDC - Introdução ao Actor Model com Microsoft Orleans
TDC - Introdução ao Actor Model com Microsoft Orleans
 
JUnit: framework de testes unitários
JUnit: framework de testes unitáriosJUnit: framework de testes unitários
JUnit: framework de testes unitários
 

Programação reativa com RxJava

Notas do Editor

  1. Microsoft, a criar uma forma de se utilizar este paradigma dentro do mundo .NET. Surgiu assim a biblioteca Microsoft Rx (de Reactive eXtension), que permite ao desenvolvedor criar aplicações assíncronas e baseadas em eventos de forma simplificad
  2. Em fevereiro de 2013, Ben Christensen e Jafar Husain, engenheiros da Netflix, mostraram a biblioteca RxJava