reactivex mit rxjava - java forum stuttgartim kleinen strom von daten: liste Änderungen verfolgen:...

Post on 21-May-2020

8 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

top related