Confusing Concurrency - RxJava in Action · Confusing Concurrency Moritz Richter, Tim Wedde Intro...

47
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

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