ReactiveX mit RxJava - Java Forum StuttgartIm Kleinen Strom von Daten: Liste Änderungen verfolgen:...
Transcript of ReactiveX mit RxJava - Java Forum StuttgartIm Kleinen Strom von Daten: Liste Änderungen verfolgen:...
ReactiveX mit RxJava
Roman Roelofsen - w11k GmbH / theCodeCampusTwitter & GitHub: romanroe
1
Über mich
Alpha Geek, Entwickler, Trainerw11k GmbH - The Web Engineers
IndividualsoftwaretheCodeCampus
Schulungsanbieter Angular &TypeScript
1
Reaktive Programmierung
1
... a programming paradigm orientedaround data flows and the propagationof change."
1
Im Kleinen
Strom von Daten: ListeÄnderungen verfolgen: Events (Mouse-Clicks, ...)
Im Großen
Strom von Daten: Web-SocketsÄnderungen verfolgen: Message Bus
1
Iterator
java.util.IteratorSynchron, PullKeine Fehler-Konzept
Callback
java.util.function.Funtion<T, R>Asynchron, PushKein standardisiertes Fehler -Konzept
1
Reactive Programming = Iterator + Callback
(+ Fehlerbehandlung)
1
ReactiveX
RxJava
Implementierungen fürJava, JavaScript/TypeScript, .NET, Scala, Clojure,Swift, etc.
http://reactivex.io
1
API
ObservableLiefert Daten
ObserverBekommt Daten
subscribe am Observable -> Disposable
1
Operatoren
Methoden am Observablemap/filter/...
Kombination von ObservablesflatMap/withLatestFrom/...
Operatoren erzeugen immer neue Observables
1
Demo - Operatoren
1
API - cold/synchronObservable<Integer> observable = Observable.create(e -> { e.onNext(1); e.onNext(2); e.onComplete(); });
observable.subscribe(new Observer<Integer>() { public void onSubscribe(Disposable d) { } public void onNext(Integer i) { } public void onError(Throwable e) { } public void onComplete() { } });
1
Fehlerbehandung
Observer
Stream termininert bei einem Fehler!
Observable<Integer> observable = Observable.create(e -> { e.onNext(1); e.onNext(2); e.onError(new RuntimeException("error")); e.onNext(3); // wird nicht "gesendet" });
1
Use Cases
Http Client - RxNettyHttpClient.newClient(serverAddress) .enableWireLogging("hello-client", LogLevel.ERROR) .createGet("/hello") .doOnNext(resp -> logger.info(resp.toString())) .flatMap(resp -> resp.getContent() .map(bb -> bb.toString(Charset.defaultCharset())))
1
Http Client - Netflix Ribbon
1
User Interface
1
Subject
1
Observable und ObserverMultiplexerPuffer
1
Nützlich, wenn Datenquelle nicht verschachtelt werdenkann
z.B. Servlet -> Subject -> Observer
Observable.create(e -> { ... ... });
public class Servlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse res) { subject.onNext(Pair.of(req, res)); } }
1
PublishSubject
Ausgabe
Subject<Integer> sub1 = PublishSubject.create(); sub1.onNext(1); sub1.onNext(2); sub1.subscribe(System.out::println); sub1.onNext(3);
3
1
ReplaySubject
Ausgabe
Subject<Integer> sub1 = ReplaySubject.createWithSize(3); sub1.onNext(1); sub1.onNext(2); sub1.onNext(3); sub1.onNext(4); sub1.onNext(5); sub1.subscribe(System.out::println); sub1.onNext(6);
3 4 5 6
1
ReplaySubject
Ausgabe
Subject<Integer> sub1 = BehaviorSubject.createDefault(99); sub1.subscribe(System.out::println); sub1.onNext(1); sub1.onNext(2); sub1.onNext(3);
99 1 2 3
1
Marble Diagramme
1
zip
1
map
1
flatMap
1
Schedulers
1
Observable Streams sind nicht grundsätzlich asynchron!Schedulers verlagern den Observer und die Operatorenin Threads
obs$.observeOn(Schedulers.io()).map(i -> ioBound(i)); obs$.observeOn(Schedulers.computation()).map(i -> heavyOnCpu(i));
1
Java 9 Flow APIab Java 9Reactive Programming basierend aufhttp://www.reactive-streams.org/Observable -> Flowable*Subject -> *Processor
1
DiversesRatpack - https://ratpack.io/Akka - http://akka.io/RxJS
1
Fazit
Lernkurve:kurz flachdann lange steildann wieder flach
ReactiveX macht komplexe Datenflüsse "einfach"Keine komplexe Datenflüsse? Dann Finger weg...Kein echtes Projekt zum Lernen nehmen!http://rxmarbles.com
1
Roman Roelofsen - w11k GmbH
@romanroe
1