Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant Backpressure TweetStream 1/47 Confusing Concurrency RxJava in Action Moritz Richter, Tim Wedde Enterprise System Whatever FH Techniek en Logistiek Venlo May 6, 2018
47
Embed
Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro RxJava Streams in Java 8+ Functional Progr. Stream Operators Task: Donald’s Restaurant
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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