rxjava, getting started - david wursteisen - 16 octobre 2014

184

Upload: soat

Post on 31-May-2015

962 views

Category:

Technology


2 download

DESCRIPTION

Les applications sont de plus en plus interconnectées. Une architecture type WOA (Web Oriented Archiecture) et l’utilisation des micros-services nécessitent de faire de plus en plus appel à différents services web. Comment composer un résultat à partir de ces différents services, sans avoir à ce soucier de l’ordre dans lequel les serveurs vont répondre ? RxJava offre une manière élégante de faire de l’asynchrone et de la composition au sein de son application. David vous exposera les concepts de Rx (Reactive eXtension) avant de vous montrer une mise en application avec des exemples de code venant d’une application Android.

TRANSCRIPT

Page 1: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014
Page 2: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Getting Started

RxJava

David Wursteisen 16 Octobre 2014

Page 3: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

David Wursteisen

@dwursteisen

Direction Expertise Innovation

Page 4: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

David Wursteisen

Page 5: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Architecture distribuée

Sync/Async/Concurrence

Page 6: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Architecture distribuée

Page 7: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Architecture distribuée

Page 8: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Architecture distribuée

The Internet

Page 9: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Architecture distribuée

The Internet

Page 10: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Synchrone

Page 11: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Synchrone

Appel bloquant

Page 12: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Asynchrone

Page 13: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Asynchrone

Appel non bloquant

Page 14: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Complexité

Page 15: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Complexité

future.get();

Page 16: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Complexité

future1.get();future2.get();future3.get();future4.get();future5.get();future6.get();future7.get();

Page 17: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Complexité

future1.get();future2.get();future3.get();future4.get();future5.get();future6.get();future7.get();

Ordonnancement optimal ?

Page 18: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Complexité

client.execute(new Callback() { @Override public void completed(HttpResponse response) { }});

Page 19: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Complexité

client.execute(new Callback() { @Override public void completed(HttpResponse response) { client.execute(new Callback() { @Override public void completed(HttpResponse response) { } });

}});

Page 20: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Complexité

client.execute(new Callback() { @Override public void completed(HttpResponse response) { client.execute(new Callback() { @Override public void completed(HttpResponse response) { client.execute(new Callback() { @Override public void completed(HttpResponse response) { } }); }});

}});

Page 21: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Complexité

client.execute(new Callback() { @Override public void completed(HttpResponse response) { client.execute(new Callback() { @Override public void completed(HttpResponse response) { client.execute(new Callback() { @Override public void completed(HttpResponse response) { } }); }});

}});

Callback hell

Page 22: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Concurrence

Page 23: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Concurrence

Page 24: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Concurrence

Concurrence

Page 25: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Concurrence

Page 26: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Concurrence

RxJava permet de manipuler des évènements d’une manière synchrone et/ou asynchrone.

Page 27: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Historique

Il était une fois...

Page 28: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Historique

Page 29: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Historique

Page 30: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Historique

Page 31: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Historique

Page 32: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Historique

ReactiveX.io

Page 33: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Observables

Travailler avec des flux

Page 34: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Flux d’évènements fini

Évènements Fin du flux

Page 35: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Flux d’évènements en erreur

Évènements Erreur

Page 36: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Flux d’évènements infini

Évènements

Page 37: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Flux d’évènements

Observable.never()

Observable.empty()

Observable.just(1)

Observable.from(1, 2, 3)

Observable.range(1, 4400)

Observable.timer(5, TimeUnit.SECONDS)

Observable.create(...)

Page 38: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Flux d’évènements

Observable.never()

Observable.empty()

Observable.just(1)

Observable.from(1, 2, 3)

Observable.range(1, 4400)

Observable.timer(5, TimeUnit.SECONDS)

Observable.create(...)

Page 39: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Flux d’évènements

Observable.never()

Observable.empty()

Observable.just(1)

Observable.from(1, 2, 3)

Observable.range(1, 4400)

Observable.timer(5, TimeUnit.SECONDS)

Observable.create(...)

1

Page 40: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Flux d’évènements

Observable.never()

Observable.empty()

Observable.just(1)

Observable.from(1, 2, 3)

Observable.range(1, 4400)

Observable.timer(5, TimeUnit.SECONDS)

Observable.create(...)

1 2 3

Page 41: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Flux d’évènements

Observable.never()

Observable.empty()

Observable.just(1)

Observable.from(1, 2, 3)

Observable.range(1, 4400)

Observable.timer(5, TimeUnit.SECONDS)

Observable.create(...)

1 4400

Page 42: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Flux d’évènements

Observable.never()

Observable.empty()

Observable.just(1)

Observable.from(1, 2, 3)

Observable.range(1, 4400)

Observable.timer(5, TimeUnit.SECONDS)

Observable.create(...)

0

t

t + 5 secondes

Page 43: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Flux d’évènements

Observable.never()

Observable.empty()

Observable.just(1)

Observable.from(1, 2, 3)

Observable.range(1, 4400)

Observable.timer(5, TimeUnit.SECONDS)

Observable.create(...)

A C

Page 44: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Flux d’évènements

λ ϕ φ

json json jsonObservable<json>

Observable<Integer>

Observable<Click>

Page 45: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Observer

Push des données

Page 46: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Observer

OnNext* (OnCompleted|OnError)?

Page 47: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Observer

OnNext* (OnCompleted|OnError)?

Page 48: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Observer

OnNext* (OnCompleted|OnError)?

Page 49: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Observer

OnNext* (OnCompleted|OnError)?

Page 50: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Observer

Observable.range(1, 4400)

Page 51: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Observer

Observable.range(1, 4400).subscribe()

Page 52: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Observer

Observable.range(1, 4400).subscribe(onNext)

Page 53: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Observer

Observable.range(1, 4400).subscribe(System.out::println)

Page 54: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Observer

Observable.range(1, 4400).subscribe(System.out::println, onError)

Page 55: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Observer

Observable.range(1, 4400).subscribe(System.out::println, System.err::println)

Page 56: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Observer

Observable.range(1, 4400).subscribe(System.out::println, System.err::println,onCompleted)

Page 57: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Observer

Observable.range(1, 4400).subscribe(System.out::println, System.err::println,

() -> System.out.println(“finished”))

Page 58: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

Quand l’écoute ne suffit plus

Page 59: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

0 1

Page 60: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

0 1

map

Page 61: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

0 1

A B

map

Page 62: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

1 4

Page 63: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

1 4

filter ( x <= 2 )

Page 64: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

1 4

1

filter ( x <= 2 )

Page 65: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

1 2

Page 66: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

1 2

delay ( 5, SECONDS )

Page 67: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

1 2

1

delay ( 5, SECONDS )

2

Page 68: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

Observable.from(0, 1, 2, 3, 4)

Observable<Integer>

Page 69: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

Observable.from(0, 1, 2, 3, 4) .filter((i) -> i < 3)

Observable<Integer>Observable<Integer>

Page 70: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

Observable.from(0, 1, 2, 3, 4) .filter((i) -> i < 3) .delay(5, TimeUnit.SECONDS)

Observable<Integer>Observable<Integer>Observable<Integer>

Page 71: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

Observable.from(0, 1, 2, 3, 4) .filter((i) -> i < 3) .delay(5, TimeUnit.SECONDS) .map((i) -> Character.toString((char)(i + 'A')))

Observable<Integer>Observable<Integer>Observable<Integer>

Observable<String>

Page 72: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

Observable.from(0, 1, 2, 3, 4) .filter((i) -> i < 3) .delay(5, TimeUnit.SECONDS) .map((i) -> Character.toString((char)(i + 'A'))) .subscribe(System.out::println);

Observable<Integer>Observable<Integer>Observable<Integer>

Observable<String>

Page 73: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

Observable.from(0, 1, 2, 3, 4) .filter((i) -> i < 3) .delay(5, TimeUnit.SECONDS) .map((i) -> Character.toString((char)(i + 'A'))) .subscribe(System.out::println);

0, 1, 2, 3, 4 => A, B, C

Observable<Integer>Observable<Integer>Observable<Integer>

Observable<String>

Page 74: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

Page 75: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

Page 76: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Manipulation d’évènements

Page 77: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Composition

Création d’un flux à partir d’un ensemble de flux

Page 78: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Composition

Page 79: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Composition

Page 80: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Composition

Page 81: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Mise en pratique de composition

Learn from the trenches

Page 82: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Composition

Page 83: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Composition

Page 84: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Composition

Page 85: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Composition

Page 86: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Composition

Page 87: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Composition

merge

Page 88: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Composition

merge

Page 89: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Composition

Page 90: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Composition

Page 91: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Composition

zip

Page 92: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Composition

zip

Page 93: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Subscription

Et gestion de l’unsubscribe

Page 94: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Subscription

Observable.create(new OnSubscribe<T>() { … });

Page 95: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Subscription

Observable.create(new OnSubscribe<T>() {

@Override public void call(Subscriber<? super T> s) { s.onNext(123); s.onCompleted(); }

});

Page 96: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Subscription

Observable.create(new OnSubscribe<T>() {

@Override public void call(Subscriber<? super T> s) { s.onNext(123); s.onCompleted(); }

});

Émission synchronne

Page 97: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Subscription

Observable.create(new OnSubscribe<T>() { @Override public void call(Subscriber<? super T> subscriber) { // ... httpClient.execute(httpRequest, new FutureCallback<HttpResponse>() { @Override public void completed(String content) { subscriber.onNext(content); subscriber.onCompleted(); }

@Override public void failed(Exception e) { subscriber.onError(e); } }); }});

Page 98: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Subscription

Observable.create(new OnSubscribe<T>() { @Override public void call(Subscriber<? super T> subscriber) { // ... httpClient.execute(httpRequest, new FutureCallback<HttpResponse>() { @Override public void completed(String content) { subscriber.onNext(content); subscriber.onCompleted(); }

@Override public void failed(Exception e) { subscriber.onError(e); } }); }});

Page 99: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Subscription

Observable.create(new OnSubscribe<T>() { @Override public void call(Subscriber<? super T> subscriber) { // ... httpClient.execute(httpRequest, new FutureCallback<HttpResponse>() { @Override public void completed(String content) { subscriber.onNext(content); subscriber.onCompleted(); }

@Override public void failed(Exception e) { subscriber.onError(e); } }); }});

Page 100: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Subscription

Observable.create(new OnSubscribe<T>() { @Override public void call(Subscriber<? super T> subscriber) { // ... httpClient.execute(httpRequest, new FutureCallback<HttpResponse>() { @Override public void completed(String content) { subscriber.onNext(content); subscriber.onCompleted(); }

@Override public void failed(Exception e) { subscriber.onError(e); } }); }});

Émission asynchronne

Page 101: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Subscription

Observable.create(new OnSubscribe<T>() { @Override public void call(Subscriber<? super T> subscriber) { // ... httpClient.execute(httpRequest, new FutureCallback<HttpResponse>() { @Override public void completed(String content) { subscriber.onNext(content); subscriber.onCompleted(); }

@Override public void failed(Exception e) { subscriber.onError(e); } }); }});

Propagation des erreurs

Page 102: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Subscription

La souscription permet d’uniformiser des API différentes par leurs natures (Callback, etc...)

Page 103: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Unsubscribe

Subscription subscription = Observable.interval(1, TimeUnit.SECONDS).subscribe();

Page 104: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Unsubscribe

Subscription subscription = Observable.interval(1, TimeUnit.SECONDS).subscribe();

Souscription

Page 105: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Unsubscribe

Subscription subscription = Observable.interval(1, TimeUnit.SECONDS).subscribe();

Handler sur la souscription

Page 106: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Unsubscribe

Subscription subscription = Observable.interval(1, TimeUnit.SECONDS).subscribe();/* ... */subscription.unsubscribe();

Page 107: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Unsubscribe

Subscription subscription = Observable.interval(1, TimeUnit.SECONDS).subscribe();/* ... */subscription.unsubscribe();

Arrêt de la souscription

Page 108: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Schedulers

Page 109: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Schedulers

observableReadingSynchronously(“strings.txt”)

.take(10) .delay(1, SECONDS) .map(parse())

.map(n -> “=> ” + n)) .subscribe(to_the_view())

Page 110: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Schedulers

main

Page 111: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Schedulers

observableReadingSynchronously(“strings.txt”)

.take(10) .delay(1, SECONDS) .map(parse())

.map(n -> “=> ” + n)) .subscribe(to_the_view())

Page 112: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Schedulers

Computation

IO

UI

main

Page 113: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Schedulers

Computation

IO

UI

main

Page 114: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Schedulers

Computation

IO

UI

main

Page 115: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Schedulers

Computation

IO

UI

main

Page 116: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Schedulers

Computation

IO

UI

main

Page 117: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Schedulers

Computation

IO

UI

main

Page 118: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Schedulers

observableReadingSynchronously(“strings.txt”) .subscribeOn(scheduler) .take(10) .delay(1, SECONDS, scheduler) .map(parse()) .observeOn(scheduler) .map(n -> “=> ” + n)) .subscribe(to_the_view())

Page 119: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Schedulers

observableReadingSynchronously(“strings.txt”) .subscribeOn(Schedulers.io()) .take(10) .delay(1, SECONDS, Schedulers.computation()) .map(parse()) .observeOn(Schedulers.from(uiExecutor())) .map(n -> “=> ” + n)) .subscribe(to_the_view())

Page 120: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Schedulers

UI

Computation

Page 121: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Schedulers

UI

Computation

Page 122: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Schedulers

UI

Computation

Page 123: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Schedulers

UI

Computation

Page 124: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Schedulers

UI

Computation

Page 125: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Hot & Cold Observable

Page 126: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Cold Observable

Observable<Integer> obs = Observable.from(1, 2, 3, 4);

obs.subscribe(System.out::println);

obs.subscribe(System.out::println);

Page 127: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Cold Observable

Observable<Integer> obs = Observable.from(1, 2, 3, 4);

obs.subscribe(System.out::println);

obs.subscribe(System.out::println);

Page 128: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Cold Observable

Observable<Integer> obs = Observable.from(1, 2, 3, 4);

obs.subscribe(System.out::println);

obs.subscribe(System.out::println);

Subscribe

Page 129: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Cold Observable

Observable<Integer> obs = Observable.from(1, 2, 3, 4);

obs.subscribe(System.out::println);

obs.subscribe(System.out::println); Subscribe

Page 130: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Cold Observable

Observable<Integer> obs = Observable.from(1, 2, 3, 4);

obs.subscribe(System.out::println);

obs.subscribe(System.out::println);Souscription différente

Page 131: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Hot Observable

ConnectableObservable<Integer> obs = Observable.from(1, 2, 3, 4).publish();

obs.subscribe(System.out::println);

obs.subscribe(System.out::println);

obs.connect();

Page 132: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Hot Observable

ConnectableObservable<Integer> obs = Observable.from(1, 2, 3, 4).publish();

obs.subscribe(System.out::println);

obs.subscribe(System.out::println);

obs.connect();

Page 133: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Hot Observable

ConnectableObservable<Integer> obs = Observable.from(1, 2, 3, 4).publish();

obs.subscribe(System.out::println);

obs.subscribe(System.out::println);

obs.connect();

Page 134: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Hot Observable

ConnectableObservable<Integer> obs = Observable.from(1, 2, 3, 4).publish();

obs.subscribe(System.out::println);

obs.subscribe(System.out::println);

obs.connect();

Page 135: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Hot Observable

ConnectableObservable<Integer> obs = Observable.from(1, 2, 3, 4).publish();

obs.subscribe(System.out::println);

obs.subscribe(System.out::println);

obs.connect();

Page 136: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Hot Observable

ConnectableObservable<Integer> obs = Observable.from(1, 2, 3, 4).publish();

obs.subscribe(System.out::println);

obs.subscribe(System.out::println);

obs.connect();Subscribe

Page 137: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Hot Observable

ConnectableObservable<Integer> obs = Observable.from(1, 2, 3, 4).publish();

obs.subscribe(System.out::println);

obs.subscribe(System.out::println);

obs.connect();

Partage la même souscription

Page 138: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Hot Observable

ConnectableObservable<Integer> obs = Observable.from(1, 2, 3, 4).publish();

obs.subscribe(System.out::println);

obs.subscribe(System.out::println);

obs.connect();

Page 139: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Hot Observable

ConnectableObservable<Integer> obs = Observable.from(1, 2, 3, 4).publish();

obs.connect();

obs.subscribe(System.out::println);

obs.subscribe(System.out::println);

Souscription

Page 140: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Cold & Hot Observable

Cold Observable = flux passif

Hot Observable = flux actif

Page 141: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Back Pressure

Contrôler la production

Page 142: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Back Pressure

Production

Page 143: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Back Pressure

Production

buffer

Page 144: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Back Pressure

Production

Pression arrière

Page 145: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Back Pressure

Production

Pression arrière

Demande de production de n élements

Page 146: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Retour d’expérience

Page 147: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Opérateurs

Observable.from(1, 2, 3, 4) .reduce(new LinkedList<Integer>(), (seed, value) -> { seed.add(value); return seed; }) .first() .subscribe(System.out::println);

Page 148: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Opérateurs

Observable.from(1, 2, 3, 4) .reduce(new LinkedList<Integer>(), (seed, value) -> { seed.add(value); return seed; }) .first() .subscribe(System.out::println);

Page 149: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Opérateurs

Observable.from(1, 2, 3, 4) .toList() .first() .subscribe(System.out::println);

Page 150: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Opérateurs

Observable.from(1, 2, 3, 4) .toList() .first() .subscribe(System.out::println);

Page 151: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Opérateurs

Observable.from(1, 2, 3, 4) .toList() .first() .subscribe(System.out::println);

Différence entre first() / single() / take(1) ?

Page 152: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Gestion des erreurs

Observable.from(1, 2, 3, 4) .toList() .single() .subscribe(System.out::println);

Page 153: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Gestion des erreurs

Observable.from(1, 2, 3, 4) .toList() .single() .subscribe(System.out::println);

Notification des erreurs absentes

Page 154: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Gestion des erreurs

static { RxJavaPlugins.getInstance().registerErrorHandler(new RxJavaErrorHandler() { @Override public void handleError(Throwable e) { e.printStackTrace(); } });}

Page 155: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Lambda & Java 8

Observable.from(1, 2, 3, 4) .filter(new Func1<Integer, Boolean>() { @Override public Boolean call(Integer i) { return i > 3; } }) .subscribe(new Action1<Integer>() { @Override public void call(Integer x) { System.out.println(x); } });

Page 156: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Lambda & Java 8

Observable.from(1, 2, 3, 4) .filter(new Func1<Integer, Boolean>() { @Override public Boolean call(Integer i) { return i > 3; } }) .subscribe(new Action1<Integer>() { @Override public void call(Integer x) { System.out.println(x); } });

Bruit

Page 157: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Lambda & Java 8

Observable.from(1, 2, 3, 4) .filter(i -> i > 3) .subscribe(System.out::println);

Page 158: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Lambda & Java 8

Observable.from(1, 2, 3, 4) .filter(new Func1<Integer, Boolean>() { @Override public Boolean call(Integer i) { return i > 3; } }) .subscribe(new Action1<Integer>() { @Override public void call(Integer x) { System.out.println(x); } });

Observable.from(1, 2, 3, 4) .filter(i -> i > 3) .subscribe(System.out::println);

Retrolambda

Page 159: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Concurrence

obs1.mergeWith(obs2) .take(5) .subscribe(System.out::println);

Page 160: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Concurrence

obs1.mergeWith(obs2) .take(5) .subscribe(System.out::println);

Page 161: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Concurrence

obs1.mergeWith(obs2) .take(5) .subscribe(System.out::println);

Doit gérer la concurrence

Page 162: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Concurrence

obs1.mergeWith(obs2) .take(5) .subscribe(System.out::println);

Page 163: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Concurrence

obs1.mergeWith(obs2) .take(5) .subscribe(System.out::println);

non concurrence

Page 164: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Sync & Async

Observable<Integer> generator();

Page 165: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Sync & Async

Observable<Integer> generator();

Sync ?

Page 166: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Sync & Async

Observable<Integer> generator();

Sync ? Async ?

Page 167: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Sync & Async

Observable<Integer> generator();

Sync ? Async ?

Computation ?

Page 168: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Sync & Async

Observable<Integer> generator();

Sync ? Async ?

Computation ? Acteur ?

Page 169: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

“Leak” des Observables

everything is an event

Page 170: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

“Leak” des Observables

ViewPager

Page 171: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

“Leak” des Observables

ViewPager

Preferences

Observable

Page 172: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

“Leak” des Observables

ViewPager

Preferences

UserService

Observable

Observable

Page 173: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Future<RxJava>

Page 174: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Future<RxJava>

Support RxJava

Page 175: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Reactive Streams

Page 176: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Reactive Streams

Reactive Streams is an initiative to provide a standard for asynchronous stream processing with non-blocking back pressure on the JVM.

http://www.reactive-streams.org/

Page 177: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Reactive Streams

RxJava | Akka Streams | Reactor Composable | Ratpack

Page 178: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Reactive Streams

RxJava | Akka Streams | Reactor Composable | Ratpack

> 700 Ko | Java | Android

Page 179: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Reactive Streams

RxJava | Akka Streams | Reactor Composable | Ratpack

> 2.5 Mo | Scala | Akka

Page 180: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Reactive Streams

RxJava | Akka Streams | Reactor Composable | Ratpack

~1Mo | Java | RingBufferDispatcher

Page 181: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Reactive Streams

RxJava | Akka Streams | Reactor Composable | Ratpack

Java 8 | Http

Page 182: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Si il ne fallait retenir qu’une chose

Page 183: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Si il ne fallait retenir qu’une chose

RxJava est un modèle de programmation pour écrire des applications asynchrones

Frontend | Backend | Crossplatform

Page 184: RxJava, Getting Started - David Wursteisen - 16 Octobre 2014

Questions ?

[email protected]@dwursteisen