Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Reaktive Programmierung für Dummys

Reaktive Programmierung für Dummys

JAX 2017 Talk introducing reactive programming with RxJava

arthware

May 11, 2017
Tweet

Other Decks in Programming

Transcript

  1. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 ACTICO GmbH, alle Rechte vorbehalten. 11.05.2017 Reaktive Programmierung für Dummys Arthur Hupka – JAX 2017 - Mainz Einführung in Reaktive Programmierung
  2. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 2 About … Arthur Hupka Arthur Hupka @arthware84 32 Jahre Bodensee Entwickler und Architekt bei ACTICO GmbH ~11 Jahre Java
  3. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 3 Fahrplan Grundlagen & Historie Reaktive Programmierung Reactive Extensions (Rx) Observer, Observable, Operatoren Project Reactor Fazit Reactive Live Code
  4. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 4 http://reactivex.io/
  5. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 6 Neulich beim googlen … Grundlagen Rx.Observable.flatMapLatest(selector, [thisArg]) Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.
  6. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 7 Einstieg & Historie Grundlagen
  7. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 8 Grundlagen In computing, reactive programming is an asynchronous programming paradigm oriented around data streams and the propagation of change. Wikipedia
  8. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 9 Reaktive Rolltreppe Grundlagen
  9. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 10 Observer Design Pattern Grundlagen Aktion Reaktion = Reactive? public void actionPerformed(ActionEvent ae) { JButton o = (JButton) ae.getSource(); String value = o.getText(); if ("Apocalypse Now!".equals(value)){ launchNuclearWeapons(); } } +
  10. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 11 Motivation Grundlagen Online Shop zzz FRÜHER
  11. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 12 Motivation Grundlagen Streams Sensoren-Daten, Taps, Clicks, etc. Distributed Systems (Microservice Architecture) Account Service Location Service Stock Service Payment Service Pricing Service REST API REST API REST API Reputation Service Order Service REST API REST API REST API REST API HEUTE & ZUKÜNFTIG
  12. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 14 Sequenzen & Streams Grundlagen - Streams 1, 1, 2, 3, 5, 8, 13, 21, … Sequence t Stream e1 e2, e3, e4, e5, e6, e7, e8, … Daten/Events über Zeit
  13. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 15 Was sind Streams? Grundlagen - Streams Sensoren Wetterdaten Metriken News Updates Bestellungen GPS Daten eines Objektes Bild oder Dateiuploads Wikipedia Updates Herzfrequenz Datenbankänderungen Datenbankänderungen Konfigurationsänderungen Mausbewegungen Clicks bzw. Taps Modelländerungen Dateiänderungen Spielzustände Server Requests
  14. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 18 Reactive Extensions Rx*
  15. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 19 Reactive Extensions Ade oshineye at English Wikipedia [CC BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0)], via Wikimedia Commons  Initiiert etwa 2007 bei Microsoft  Rx initales Release Nov 2009 für .Net  „Rx is basically two interfaces IObserver and IObservable“  LINQ Standard Query Operators  „SQL-Like“ abfrage auf collections & xml  auch von Erik Meijer entworfen Rx Erik Meijer Erik Meijer - 2009 https://channel9.msdn.com/Blogs/Charles/Erik-Meijer-Rx-in-15-Minutes The main scenario where all this came from, the reason why we started to look at this, is to build distributed, cloud-based applications. Reactive Extensions - Historie
  16. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 20 Reactive Historie Reactive Extensions - Historie RxJava release 0.1.2 Feb. 2013 RxJava release 1.0.0 Nov. 2014 Mär. 2012 Netflix initiiert RxJava, als Adaption von Rx für die JVM. Grund: Verbesserung der Netflix API RxJava initial commit http://techblog.netflix.com/2013/02/rxjava-netflix-api.html RxJava 2 release 2.0.0 29. Oct. 2016 Re-write basierend auf reactive streams spec Reactor Core release 3.0.0 22. Aug. 2016 Basierend auf reactive streams spec Grundlage für reaktive Spring APIs
  17. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 22 Einstieg und Historie Reactive Extensions - Historie Umgebung Programm-Code  Umgebung  File System, Services, Datenbank, System Resourcen, Threads etc.  Interaktiv  Das Programm „fragt“ die Umgebung nach Dingen  Pull Modell  Reaktiv  Das Programm „reagiert“ auf Ereignisse aus der Umgebung  Push Modell reaktiv interaktiv Die (Laufzeit-) Umgebung „entscheidet“, wann Code ausgeführt wird. Der Programm-Code „reagiert“ mit Ablaufsequenzen
  18. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 23 Vom Iterator zum Observable Reactive Extensions - Historie  Observer<T>  void onComplete()  void onNext(T)  void onError(T)  Observable  subscribe(Observer<T>) Iterable & Iterator Observer & Observable Dualität !(A || B) !A && !B  Iterator<T>  boolean hasNext()  T next() throws Ex  T remove()  Iterable<T>  Iterator<T> iterator() https://channel9.msdn.com/Events/Lang-NEXT/Lang-NEXT-2014/Keynote-Duality „Müllabfuhr“ Endliche Strukturen Pull Collection „Mülldeponie“ Unendliche Strukturen möglich Push Collection Subscriber
  19. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 24 Anatomie eines RxJava-Aufrufes Reactive Extensions - Grundlagen Observable.just(1) .useFunkyOperator() .useOtherOperator() .subscribeOn(…) .observeOn(..) .subscribe( new Observer<Long>() { public void onCompleted() {} public void onNext(Long p) {} public void onError(Throwable e); }); Observable Operatoren Subscribe Scheduler Factory Methoden Thread bestimmen
  20. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 25 Observable als Marble Diagramm Reactive Extensions (RxJava) - Grundlagen onError(E) onCompleted() onNext(T) time onNext(T) onNext(T) XOR onNext(): blue onNext(): green onNext(): purple onCompleted()
  21. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 26 Observable - Zustände Reactive Extensions - Typen Endlicher Stream mit n Elementen Endlicher Stream mit n Elementen und Fehler Unendlicher Stream Leerer, unendlicher Stream Leerer, endlicher Stream Leerer, fehlerhafter Stream Endlicher Stream mit einem Element
  22. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 27 RxJava Observable Operatoren Beispiel Reactive Extensions - Operatoren Observable<Integer> numberStream = Observable.from(asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)); Observable<BigDecimal> evenNumbers = numberStream .filter(n -> n % 2 == 0) .skip(1) .take(5) .map(BigDecimal::valueOf); evenNumbers.subscribe(…) (!) Reaktive Ablaufsequenz Erst hier passiert was Deklarativ
  23. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 28 Operatoren-Ausführungskette als Marble Diagramm Reactive Extensions - Operatoren 0 1 2 3 4 5 6 7 0 2 4 6 2 4 6 2 4 .filter (n -> n % 2 == 0) .skip (1) .take (2) .map (val->new BigDecimal(val)) 2.0 4.0 evenNumbers.subscribe(…) subscribe() subscribe() subscribe() subscribe() downstream upstream
  24. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 29 Reactive Operator Onion Reactive Extensions - Operatoren origin stream filter skip take map Operatoren sind Decorator und fügen verhalten hinzu, ohne den ursprünglichen Stream zu verändern
  25. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 30 TODO Bild mit Springbrunnen Stream Operatoren
  26. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 31 Operatoren, Kombinatoren, Transformatoren, Filter, …  Operatoren  Creating • Create, Defer, Empty/Never/Throw, From, Interval, Just, Range, Repeat, Start, Timer  Transforming • Buffer, FlatMap, GroupBy, Map, Scan, Window  Filtering • Debounce, Distinct, ElementAt, Filter, First, IgnoreElements, Last, Sample, Skip, SkipLast, Take  Combining • And/Then/When, CombineLatest, etc.  Error Handling • Catch, Retry  Utility • Delay, Do, Timeout, Serialize  …  Verfügbare Operatoren in RxJava sind ursrprünglich inspiriert von LINQ Reactive Extensions – Operatoren http://reactivex.io/documentation/operators.html
  27. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 32 Operatoren ermöglichen eine Menge abgefahrener Dinge mit wenig Code
  28. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 33 Emotionen Reactive Extensions (Rx)
  29. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 34 Operator Voodoo Voodoo! Operator
  30. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 36 Operator Beispiel: .zip() Operator Voodoo “Returns an Observable that emits the results of a specified combiner function applied to combinations of two items emitted, in sequence, by two other Observables.” Observable<String> zip(Observable<String> o1, Observable<String> o2, BiFunction<String, String, Tuple> zipFunction) „Gib mir 2 Streams und ich kombiniere hintereinander folgende Elemente zu Paaren“ A B A1 B2 C3 zip( a,b -> a+b ) 1 2 C 3 Javadoc gründlich lesen! “Therefore, it is possible those other sources will never be able to run to completion”
  31. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 37 Operator Beispiel: .flatMap() “Returns an Observable that emits items based on applying a function that you supply to each item emitted by the source Observable, where that function returns an Observable, and then merging those resulting Observables and emitting the results of this merger” „Gib mir ein T und ich mache ein Stream von Rs daraus“ <R> Observable<R> flatMap(Function<T, Observable<R>> func) flatMap Y2 Y3 Y1 Y4 Y5 Xn func(Xn) X1 X2 X3 X4 X5 X6 Yn func(Yn) Y2 Y3 Y4 Y1 Y5 X1 X3 X2 X5 X6 X4
  32. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 38 Metric Block Average Live Code https://github.com/arthware/reactive-programming-examples
  33. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 39 1 2 5 4 3 1 5 4 3 2 6 7 6 8 8 7 Metric Stream 2.5 2.5 6.5 6.5 Block Avg Stream
  34. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 40 1 2 5 4 3 1 5 4 3 2 6 7 6 8 8 7 groupBy(color) 1 2 5 4 3 6 7 8 5 4 3 1 2 6 8 7 2.5 6.5 2.5 6.5 Moving Avg map(List<Metric> -> MovingAvg) flatMap(Obsverable<Metric> -> Observable<MovingAvg>) buffer(4) 1 2 4 3 5 6 8 7 1 2 4 3 5 6 8 7
  35. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 41 Java Generics … Operator Voodoo The method flatMap(Function<? super GroupedObservable<String,RxJava2MetricsExample2.Metric>, ? extends ObservableSource<? extends R>>) in the type Observable<GroupedObservable<String,RxJava2MetricsExampl e2.Metric>> is not applicable for the arguments ((<no type> key, <no type> metric) -> {})
  36. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 42 Observable<T> als Rückgabewert in APIs API dient als “Fassade” und entkoppelt Clients  Basierend auf Bedingung Daten aus Cache oder DB/Service zurückliefern  Blockierend oder Asynchron, je nach verfügbaren Resourcen  Mehrere Threads zur Verarbeitung oder non-blocking I/O Implementierung kann variieren, ohne den Client anzupassen! Reactive Extensions (Rx) Observable<Order> getOrders(Single<Customer> c); Single<Customer> getCustomer(Long id); Observable<Order> orders = service.getOrders(service.getCustomer(17)); //Nichts passiert bis hierher! Single<OrderReport> r = orders.mergeWith(otherOrders)…
  37. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 43 .io  Java: RxJava  JavaScript: RxJS  C#: Rx.NET  C#(Unity): UniRx  Scala: RxScala  Clojure: RxClojure  C++: RxCpp  Lua: RxLua  Ruby: Rx.rb  Python: RxPY  Go: RxGo  Groovy: RxGroovy  JRuby: RxJRuby  Kotlin: RxKotlin  Swift: RxSwift  PHP: RxPHP  Elixir: reaxive  Dart: RxDart Java 6!
  38. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 44 Reaktive Programmierung Functional Neue Denkmuster für Anwendungsentwickler
  39. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 45 Backpressure
  40. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 46 Backpressure Emitter Stream Subscriber
  41. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 47 Emitter Subscriber zu langsam! Stream overflow
  42. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 48 Backpressure – request(n) Backpressure ist eine Mischung aus Pull & Push Modell!
  43. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 49 Reactive Streams
  44. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 50 reactive-streams.org Reactive Streams https://github.com/reactive-streams/reactive-streams-jvm/issues/46 RxJava Reactive Streams Typesafe/Lightbend Reactor (Spring) Netflix, Andere … Rx .NET Vorlage für inspiriert initiiert RxJava 2 Reactor Core 3 implementiert JDK9 – Flow API Volage für  Subscriber  onNext()  onError()  onComplete()  onSubscribe(Subscription)  Publisher  subscribe(Subscriber)  Subscription  request(n)  Backpressure  cancel()  Processor extends Subscriber, Publisher Observer Observable
  45. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 51 Reactor Java 8! Spring 5
  46. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 53 Flux Aufbau Reactor Flux.just(1) .useFunkyOperator() .useOtherOperator() .publishOn(…) .scheduleOn(..) .subscribe( item -> doSomething(item), error -> doSomething(error) ) Flux Operatoren Subscribe Scheduler
  47. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 54 RxJava-Konzepte können fast 1:1 auf Reactor 3 gemapped werden RxJava ReactiveStreams RxJava 2 Reactor 3 - Publisher Flowable Flux Observer, Subscriber Subscriber Subscriber Observable ohne Backpressure - Observable - Single - Single Mono - - Maybe Mono
  48. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 57 Vorteile Komplexität von Concurrency im Framework behandelt  Subscriber müssen sich nicht um Thread-Synchronisierung kümmern (!)  Auslagern von Ausführung auf Hintergrundthreads ist durch Scheduler ein Kinderspiel Mächtigkeit durch verfügbare Operatoren und deren Komposition  Viele komplexe Anwendungsfälle lassen sich mit wenigen Zeilen Code umsetzen  Sehr elegante Lösungen für die richtigen Problemstellungen möglich Einheitliche, einfache Fehlerbehandlung im Code Programmiermodell entkoppelt Verwender von Implementierung
  49. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 58 Nachteile Anderes Programmierparadigma  Code sieht „anders“ aus, im Vergleich zu imperativem Code  Der Teufel kann im Detail der Operatoren stecken • Funktionsweise der Operatoren kennen. Speziell, wenn man „lange“ Streams kombiniert  Observable Klasse besteht aus 13.515, Flux aus über 16.138 Codezeilen mit vielen kryptischen Methoden (Separation of Concerns?)  Neulinge sind erschlagen Verwirrung durch verschiedene Bezeichnungen für gleiche oder ähnliche Konzepte  Observable, Flux, Single, Mono, Subscriber, Observer, etc. „Stacktraces from Hell“  Callstack enthält nur einen Bruchteil von Aufruf  Fehler teilweise unmöglich nachzuvollziehen bzw. schwer zu debuggen
  50. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 59 java.lang.IllegalArgumentException at java.util.concurrent.ScheduledThreadPoolExecutor.scheduleAtFixedRate(ScheduledThreadPoolExecutor.java:565) at io.reactivex.internal.schedulers.NewThreadWorker.schedulePeriodicallyDirect(NewThreadWorker.java:90) at io.reactivex.internal.schedulers.ComputationScheduler.schedulePeriodicallyDirect(ComputationScheduler.java:139) at io.reactivex.internal.operators.observable.ObservableIntervalRange.subscribeActual(ObservableIntervalRange.java:45) at io.reactivex.Observable.subscribe(Observable.java:10700) at io.reactivex.internal.operators.observable.ObservableMap.subscribeActual(ObservableMap.java:33) at io.reactivex.Observable.subscribe(Observable.java:10700) at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.subscribeInner(ObservableFlatMap.java:162) at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onNext(ObservableFlatMap.java:139) at io.reactivex.internal.operators.observable.ObservableFromArray$FromArrayDisposable.run(ObservableFromArray.java:107) at io.reactivex.internal.operators.observable.ObservableFromArray.subscribeActual(ObservableFromArray.java:36) at io.reactivex.Observable.subscribe(Observable.java:10700) at io.reactivex.internal.operators.observable.ObservableFlatMap.subscribeActual(ObservableFlatMap.java:55) at io.reactivex.Observable.subscribe(Observable.java:10700) at io.reactivex.internal.operators.observable.ObservableGroupBy.subscribeActual(ObservableGroupBy.java:48) at io.reactivex.Observable.subscribe(Observable.java:10700) at io.reactivex.internal.operators.observable.ObservableFlatMap.subscribeActual(ObservableFlatMap.java:55) at io.reactivex.Observable.subscribe(Observable.java:10700) at io.reactivex.internal.operators.observable.ObservableSubscribeOn$1.run(ObservableSubscribeOn.java:39) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Exception in thread "RxComputationThreadPool-1" java.lang.IllegalArgumentException at java.util.concurrent.ScheduledThreadPoolExecutor.scheduleAtFixedRate(ScheduledThreadPoolExecutor.java:565) at io.reactivex.internal.schedulers.NewThreadWorker.schedulePeriodicallyDirect(NewThreadWorker.java:90) at io.reactivex.internal.schedulers.ComputationScheduler.schedulePeriodicallyDirect(ComputationScheduler.java:139) at io.reactivex.internal.operators.observable.ObservableIntervalRange.subscribeActual(ObservableIntervalRange.java:45) at io.reactivex.Observable.subscribe(Observable.java:10700) at io.reactivex.internal.operators.observable.ObservableMap.subscribeActual(ObservableMap.java:33) at io.reactivex.Observable.subscribe(Observable.java:10700) at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.subscribeInner(ObservableFlatMap.java:162) at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onNext(ObservableFlatMap.java:139) at io.reactivex.internal.operators.observable.ObservableFromArray$FromArrayDisposable.run(ObservableFromArray.java:107) at io.reactivex.internal.operators.observable.ObservableFromArray.subscribeActual(ObservableFromArray.java:36) at io.reactivex.Observable.subscribe(Observable.java:10700) at io.reactivex.internal.operators.observable.ObservableFlatMap.subscribeActual(ObservableFlatMap.java:55) at io.reactivex.Observable.subscribe(Observable.java:10700) at io.reactivex.internal.operators.observable.ObservableGroupBy.subscribeActual(ObservableGroupBy.java:48) Stacktraces from Hell …
  51. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 61 Wann einsetzen?
  52. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 62 Pragmatisch & gezielt einsetzen für Operationen, die Zeit benötigen Kaum Nutzen bei monolithisch Anfangs nicht übertreiben! aufgebauten „Klassikern“ oder orchestriert werden Aufrufe über Prozessgrenzen Rich Clients
  53. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 63 „With power comes responsibility“ Einzelne Services bei denen es auf Ressourceneffizienz ankommt Denkweise in „Streams“ muss erlernt werden hierbei helfen Marble-Diagramme und Sandkastenprojekte Stichwort: Fassade – APIs blockierend verwenden Werkzeug im Werkzeugkasten
  54. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 64 Weitere Themen  Hot / Cold Streams  Implementierung eigener Operatoren  Connectable Observable  Operatoren kennenlernen  Debugging  Scheduling  HTTP/2
  55. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 65 It’s radical, and it’s fundamental […] The benefits you get from using it might be outweighed by the costs of learning it […] https://spring.io/blog/2016/07/20/notes-on-reactive-programming-part-iii-a-simple-http-server- application
  56. Arthur Hupka - @arthware84 | ACTICO GmbH, alle Rechte vorbehalten

    - @actico_de - 11.05.2017 66 Happy Streaming! Danke! @arthware84