Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro...
Transcript of Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro...
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
1/47
Confusing ConcurrencyRxJava in Action
Moritz Richter, Tim Wedde
Enterprise System Whatever
FH Techniek en LogistiekVenlo
May 6, 2018
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
2/47
What is RxJava?
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
3/47
Types of Concurrency
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
4/47
Types of Concurrency
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
5/47
Types of Concurrency
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
6/47
Types of Concurrency
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
7/47
Sequential Processing
try:
for item in collection:
onNext() -> doWithAndWaitFor(item)
except Exception e:
onError() -> panic(e)
onComplete() -> cleanup()
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
8/47
Types of Concurrency
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
9/47
Callback Hell
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
10/47
Callback Hell - Dante’s Inferno
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
11/47
Observer to the Rescue!
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
12/47
RxJava Observables
Event Iterable Observable
retrieve data T next() onNext(T)
discover error throws Ex. onError(Ex.)
complete !hasNext() onCompleted()
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
13/47
What is RxJava?
RxJava’s objective is to work on discretevalues that are emitted over time
(streams), using a push-basedarchitecture.
→ Reactive Programming ←
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
14/47
Streams in Java 8+
List<String> myList =
Arrays.asList("a1", "a2", "b1", "c2", "c1");
myList
.stream()
.filter(s -> s.startsWith("c"))
.map(String::toUpperCase)
.sorted()
.forEach(System.out::println);
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
15/47
Streams in Java 8+
I Pull-based
I Single-Use, no forking or reusing
I No merging
I No time-based operations
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
16/47
Back to the [Completable]Future?
CompletableFuture<String> helloText =
CompletableFuture.supplyAsync(() -> {
TimeUnit.SECONDS.sleep(1);
return "World";
}).thenApply(name -> {
return "Hello, " + name + "!";
}).thenApply(text -> {
return text + " This is callback chaining!";
});
System.out.println(helloText.get());
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
17/47
Functional Programming
I No side effects
I No mutating state
I Arbitrary data
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
18/47
concat()
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
19/47
merge()
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
20/47
map()
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
21/47
filter()
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
22/47
concatMap()
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
23/47
flatMap()
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
24/47
reduce()
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
25/47
sum()
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
26/47
scan()
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
27/47
Task: Donald’s Restaurant
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
28/47
A short recap
1. Orders are submitted as strings in the format:“<meal number>, <servings>”
2. Requests for meals are Lists that contain 1 to n Orders
3. Order strings are split at the comma and used toconstruct a new Order object
4. All Orders from one Request are put into an OrderLineobject
5. All Orders in a Request are assigned an increasing indexas the order number
6. Orders are turned into Meals while waiting for a timespecified in its recipe
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
29/47
Task: Donald’s Restaurant
I Download the zipped project from the workshoprepository
I Open the project in Netbeans or IntelliJ
I Open the class Main.java
https://git.io/vFPQB
http://reactivex.io/documentation/operators
RxJava GitHub wiki: https://git.io/vWHZx
Original Restaurant: https://git.io/vFPby
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
30/47
Task: Donald’s Restaurant
Create a stream of order strings and print them
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
31/47
Task: Donald’s Restaurant
Parse the order strings into Orders and putthem into OrderLines, then print those
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
32/47
Task: Donald’s Restaurant
Transform every Order in an OrderLine into aMeal and print it
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
33/47
Task: Donald’s Restaurant
Filter out invalid Orders, based on checkingtheir recipe number
Handle exceptions by skipping invalid items
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
34/47
Task: Donald’s Restaurant
Add an incrementing order number to eachnew OrderLine
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
35/47
Task: Donald’s Restaurant
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
36/47
Task: Donald’s Restaurant
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
37/47
Task: Donald’s Restaurant
Go multi-threaded by using parallel()
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
38/47
Backpressure
Hot vs Cold Observables
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
39/47
Backpressure
I Cold: Emit on subscribe(), starting from the beginning
I Hot: Emit constantly, subscribers “tune” in and out
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
40/47
Backpressure Strategies
I Error: Signals a MissingBackpressureException.
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
41/47
Backpressure Strategies
I Buffer: Buffers all onNext values.
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
42/47
Backpressure Strategies
I Drop: Drops the most recent onNext value.
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
43/47
Backpressure Strategies
I Latest: Keeps only the latest onNext value, overwritingany previous value.
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
44/47
Backpressure Strategies
I Missing: OnNext events are written without anybuffering or dropping.
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
45/47
TweetStream
ConfusingConcurrency
Moritz Richter,Tim Wedde
Intro
RxJava
Streams in Java 8+
Functional Progr.
Stream Operators
Task: Donald’sRestaurant
Backpressure
TweetStream
46/47
TweetStream
I Download the zipped project from the workshoprepository
I Open the project in Netbeans or IntelliJ
I Open the class Main.java
https://git.io/vFPQ8
http://reactivex.io/documentation/operators
ConfusingConcurrency
Moritz Richter,Tim Wedde
Sources
47/47
Sources I
Chris FroussiosIntro to RxJavahttps://git.io/vFocj
Andre StaltzThe introduction to Reactive Programming you’ve beenmissinghttps://git.io/bMkl
ReactiveX DocumentationOperators & Getting Startedhttp://reactivex.io/documentation
RxJava Workshop 2017https://git.io/vFEId