ReactiveX mit RxJava - Java Forum StuttgartIm Kleinen Strom von Daten: Liste Änderungen verfolgen:...

32
ReactiveX mit RxJava Roman Roelofsen - w11k GmbH / theCodeCampus Twitter & GitHub: romanroe 1

Transcript of ReactiveX mit RxJava - Java Forum StuttgartIm Kleinen Strom von Daten: Liste Änderungen verfolgen:...

Page 1: ReactiveX mit RxJava - Java Forum StuttgartIm Kleinen Strom von Daten: Liste Änderungen verfolgen: Events (Mouse-Clicks, ...) Im Großen Strom von Daten: Web-Sockets Änderungen verfolgen:

ReactiveX mit RxJava

Roman Roelofsen - w11k GmbH / theCodeCampusTwitter & GitHub: romanroe

1

Page 2: ReactiveX mit RxJava - Java Forum StuttgartIm Kleinen Strom von Daten: Liste Änderungen verfolgen: Events (Mouse-Clicks, ...) Im Großen Strom von Daten: Web-Sockets Änderungen verfolgen:

Über mich

Alpha Geek, Entwickler, Trainerw11k GmbH - The Web Engineers

IndividualsoftwaretheCodeCampus

Schulungsanbieter Angular &TypeScript

1

Page 3: ReactiveX mit RxJava - Java Forum StuttgartIm Kleinen Strom von Daten: Liste Änderungen verfolgen: Events (Mouse-Clicks, ...) Im Großen Strom von Daten: Web-Sockets Änderungen verfolgen:

Reaktive Programmierung

1

Page 4: ReactiveX mit RxJava - Java Forum StuttgartIm Kleinen Strom von Daten: Liste Änderungen verfolgen: Events (Mouse-Clicks, ...) Im Großen Strom von Daten: Web-Sockets Änderungen verfolgen:

... a programming paradigm orientedaround data flows and the propagationof change."

1

Page 5: ReactiveX mit RxJava - Java Forum StuttgartIm Kleinen Strom von Daten: Liste Änderungen verfolgen: Events (Mouse-Clicks, ...) Im Großen Strom von Daten: Web-Sockets Änderungen verfolgen:

Im Kleinen

Strom von Daten: ListeÄnderungen verfolgen: Events (Mouse-Clicks, ...)

Im Großen

Strom von Daten: Web-SocketsÄnderungen verfolgen: Message Bus

1

Page 6: ReactiveX mit RxJava - Java Forum StuttgartIm Kleinen Strom von Daten: Liste Änderungen verfolgen: Events (Mouse-Clicks, ...) Im Großen Strom von Daten: Web-Sockets Änderungen verfolgen:

Iterator

java.util.IteratorSynchron, PullKeine Fehler-Konzept

Callback

java.util.function.Funtion<T, R>Asynchron, PushKein standardisiertes Fehler -Konzept

1

Page 7: ReactiveX mit RxJava - Java Forum StuttgartIm Kleinen Strom von Daten: Liste Änderungen verfolgen: Events (Mouse-Clicks, ...) Im Großen Strom von Daten: Web-Sockets Änderungen verfolgen:

Reactive Programming = Iterator + Callback

(+ Fehlerbehandlung)

1

Page 8: ReactiveX mit RxJava - Java Forum StuttgartIm Kleinen Strom von Daten: Liste Änderungen verfolgen: Events (Mouse-Clicks, ...) Im Großen Strom von Daten: Web-Sockets Änderungen verfolgen:

ReactiveX

RxJava

Implementierungen fürJava, JavaScript/TypeScript, .NET, Scala, Clojure,Swift, etc.

http://reactivex.io

1

Page 9: ReactiveX mit RxJava - Java Forum StuttgartIm Kleinen Strom von Daten: Liste Änderungen verfolgen: Events (Mouse-Clicks, ...) Im Großen Strom von Daten: Web-Sockets Änderungen verfolgen:

API

ObservableLiefert Daten

ObserverBekommt Daten

subscribe am Observable -> Disposable

1

Page 10: ReactiveX mit RxJava - Java Forum StuttgartIm Kleinen Strom von Daten: Liste Änderungen verfolgen: Events (Mouse-Clicks, ...) Im Großen Strom von Daten: Web-Sockets Änderungen verfolgen:

Operatoren

Methoden am Observablemap/filter/...

Kombination von ObservablesflatMap/withLatestFrom/...

Operatoren erzeugen immer neue Observables

1

Page 11: ReactiveX mit RxJava - Java Forum StuttgartIm Kleinen Strom von Daten: Liste Änderungen verfolgen: Events (Mouse-Clicks, ...) Im Großen Strom von Daten: Web-Sockets Änderungen verfolgen:

Demo - Operatoren

1

Page 12: ReactiveX mit RxJava - Java Forum StuttgartIm Kleinen Strom von Daten: Liste Änderungen verfolgen: Events (Mouse-Clicks, ...) Im Großen Strom von Daten: Web-Sockets Änderungen verfolgen:

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

Page 13: ReactiveX mit RxJava - Java Forum StuttgartIm Kleinen Strom von Daten: Liste Änderungen verfolgen: Events (Mouse-Clicks, ...) Im Großen Strom von Daten: Web-Sockets Änderungen verfolgen:

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

Page 14: ReactiveX mit RxJava - Java Forum StuttgartIm Kleinen Strom von Daten: Liste Änderungen verfolgen: Events (Mouse-Clicks, ...) Im Großen Strom von Daten: Web-Sockets Änderungen verfolgen:

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

Page 15: ReactiveX mit RxJava - Java Forum StuttgartIm Kleinen Strom von Daten: Liste Änderungen verfolgen: Events (Mouse-Clicks, ...) Im Großen Strom von Daten: Web-Sockets Änderungen verfolgen:

Http Client - Netflix Ribbon

1

Page 16: ReactiveX mit RxJava - Java Forum StuttgartIm Kleinen Strom von Daten: Liste Änderungen verfolgen: Events (Mouse-Clicks, ...) Im Großen Strom von Daten: Web-Sockets Änderungen verfolgen:

User Interface

1

Page 17: ReactiveX mit RxJava - Java Forum StuttgartIm Kleinen Strom von Daten: Liste Änderungen verfolgen: Events (Mouse-Clicks, ...) Im Großen Strom von Daten: Web-Sockets Änderungen verfolgen:

Subject

1

Page 18: ReactiveX mit RxJava - Java Forum StuttgartIm Kleinen Strom von Daten: Liste Änderungen verfolgen: Events (Mouse-Clicks, ...) Im Großen Strom von Daten: Web-Sockets Änderungen verfolgen:

Observable und ObserverMultiplexerPuffer

1

Page 19: ReactiveX mit RxJava - Java Forum StuttgartIm Kleinen Strom von Daten: Liste Änderungen verfolgen: Events (Mouse-Clicks, ...) Im Großen Strom von Daten: Web-Sockets Änderungen verfolgen:

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

Page 20: ReactiveX mit RxJava - Java Forum StuttgartIm Kleinen Strom von Daten: Liste Änderungen verfolgen: Events (Mouse-Clicks, ...) Im Großen Strom von Daten: Web-Sockets Änderungen verfolgen:

PublishSubject

Ausgabe

Subject<Integer> sub1 = PublishSubject.create(); sub1.onNext(1); sub1.onNext(2); sub1.subscribe(System.out::println); sub1.onNext(3);

3

1

Page 21: ReactiveX mit RxJava - Java Forum StuttgartIm Kleinen Strom von Daten: Liste Änderungen verfolgen: Events (Mouse-Clicks, ...) Im Großen Strom von Daten: Web-Sockets Änderungen verfolgen:

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

Page 22: ReactiveX mit RxJava - Java Forum StuttgartIm Kleinen Strom von Daten: Liste Änderungen verfolgen: Events (Mouse-Clicks, ...) Im Großen Strom von Daten: Web-Sockets Änderungen verfolgen:

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

Page 23: ReactiveX mit RxJava - Java Forum StuttgartIm Kleinen Strom von Daten: Liste Änderungen verfolgen: Events (Mouse-Clicks, ...) Im Großen Strom von Daten: Web-Sockets Änderungen verfolgen:

Marble Diagramme

1

Page 24: ReactiveX mit RxJava - Java Forum StuttgartIm Kleinen Strom von Daten: Liste Änderungen verfolgen: Events (Mouse-Clicks, ...) Im Großen Strom von Daten: Web-Sockets Änderungen verfolgen:

zip

1

Page 25: ReactiveX mit RxJava - Java Forum StuttgartIm Kleinen Strom von Daten: Liste Änderungen verfolgen: Events (Mouse-Clicks, ...) Im Großen Strom von Daten: Web-Sockets Änderungen verfolgen:

map

1

Page 26: ReactiveX mit RxJava - Java Forum StuttgartIm Kleinen Strom von Daten: Liste Änderungen verfolgen: Events (Mouse-Clicks, ...) Im Großen Strom von Daten: Web-Sockets Änderungen verfolgen:

flatMap

1

Page 27: ReactiveX mit RxJava - Java Forum StuttgartIm Kleinen Strom von Daten: Liste Änderungen verfolgen: Events (Mouse-Clicks, ...) Im Großen Strom von Daten: Web-Sockets Änderungen verfolgen:

Schedulers

1

Page 28: ReactiveX mit RxJava - Java Forum StuttgartIm Kleinen Strom von Daten: Liste Änderungen verfolgen: Events (Mouse-Clicks, ...) Im Großen Strom von Daten: Web-Sockets Änderungen verfolgen:

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

Page 29: ReactiveX mit RxJava - Java Forum StuttgartIm Kleinen Strom von Daten: Liste Änderungen verfolgen: Events (Mouse-Clicks, ...) Im Großen Strom von Daten: Web-Sockets Änderungen verfolgen:

Java 9 Flow APIab Java 9Reactive Programming basierend aufhttp://www.reactive-streams.org/Observable -> Flowable*Subject -> *Processor

1

Page 30: ReactiveX mit RxJava - Java Forum StuttgartIm Kleinen Strom von Daten: Liste Änderungen verfolgen: Events (Mouse-Clicks, ...) Im Großen Strom von Daten: Web-Sockets Änderungen verfolgen:

DiversesRatpack - https://ratpack.io/Akka - http://akka.io/RxJS

1

Page 31: ReactiveX mit RxJava - Java Forum StuttgartIm Kleinen Strom von Daten: Liste Änderungen verfolgen: Events (Mouse-Clicks, ...) Im Großen Strom von Daten: Web-Sockets Änderungen verfolgen:

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

Page 32: ReactiveX mit RxJava - Java Forum StuttgartIm Kleinen Strom von Daten: Liste Änderungen verfolgen: Events (Mouse-Clicks, ...) Im Großen Strom von Daten: Web-Sockets Änderungen verfolgen:

Roman Roelofsen - w11k GmbH

@romanroe

1