Froscon 2017 Final Reactive Programming in Java
Froscon 2017 Final Reactive Programming in Java
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Agenda
• RxJava 2
• Spring Reactor 3
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Reactive Streams
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Subscriber/Publisher
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Subscription
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Publisher Implementations
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
RxJava 2
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Classic vs. Reactive (Cold Publisher)
public List<Photo> getPhotos() {
List<Photo> result = … for (Item item : getPhoto()) {
while (...) { System.out.println(item.toString());
result.add(...); }
}
return result;
}
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
RxJava 2 Basics
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Example. Print Photo Book
Load meta data from Database (ID, Dimentions, Source etc.) 10 x 100ms
Load images from server HDD if avaliable
90 x 50ms
Load images from source (for example Cloud Service)
10 x 500ms
Validate Image
100 x 50ms
+
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Loading Meta Data. Buffer.
Observable<MetaData> metadata =
idBatches.flatMap(ids -> metadataDao.loadingMetadata(ids));
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Loading Picture from HDD. FlatMap with at most a single result
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Loading from Cloud. Filter
Observable<PictureFile> fromCloud =
metadata.filter(m->m.cloud).
flatMap(id -> loadingFromCloud(id.id));
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Merging Cloud and HDD
metadata 1 disk-file 1
metadata 2 cloud-file 3
metadata 3 disk-file 2
metadata 4 disk-file 4
metadata 5 cloud-file 5
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Joining Metadata with Picture Files
metadata 1 + disk-file 1
metadata 2 + disk-file 1
metadata 3 + disk-file 1
metadata 2 + disk-file 2
metadata 3 + cloud-file 3
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Joining Metadata with Picture Files
Observable<Picture> pictures =
pairs.filter(p->p.fst.id == p.snd.id).map(p->new Picture(p.snd,
p.fst));
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Validating Result
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Adding Authentication
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Back in the Real World
BlockingObservableNext<Pair<Boolean, Picture>> b =
new BlockingObservableNext<>(result);
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Compare Results
Observable<Integer> ids = loadingIds();
Observable<MetaData> metadata = ids.buffer(10).flatMap(id -> loadingMetadata(id));
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Spring Reactor Timeline
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Spring Reactor 3 Big Picture
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Reactive Stream Interfaces
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Spring Reactor 3 Main Types
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Spring Reactor 3 Main Types
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Spring Reactor 3 Examples
Publisher creation
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Spring Reactor 3 Examples
Event subscription
productTitles.subscribe(System.out::println);
Output:
Print 9x13
Photobook A4
Calendar A4
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Spring Reactor 3 Examples
Logging
Output:
@Override
public void onSubscribe(Subscription s) {
s.request(Long.MAX_VALUE);
}
@Override
public void onNext(String t) {
System.out.println(t);
}
@Override
public void onError(Throwable t) {
}
@Override
public void onComplete() {
}
});
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Spring Reactor 3 Examples
Output:
INFO reactor.Flux.Array.2 - | onSubscribe()
INFO reactor.Flux.Array.2 - | request(2)
INFO reactor.Flux.Array.2 - | onNext(Print 9x13)
Print 9x13
INFO reactor.Flux.Array.2 - | onNext(Photobook A4)
Photobook A4
INFO reactor.Flux.Array.2 - | request(2)
INFO reactor.Flux.Array.2 - | onNext(Calendar A4)
Calendar A4
INFO reactor.Flux.Array.2 - | onComplete()
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Spring Reactor 3 Operations
Source: http://rxmarbles.com
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Spring Reactor 3 Examples
Elements filtering
Flux<String> productTitlesStartingWithP =
productTitles.filter(productTitle-> productTitle.startsWith("P"));
productTitlesStartingWithP.subscribe(System.out::println);
Output:
Print 9x13
Photobook A4
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Spring Reactor 3 Examples
Elements counter
productTitlesCount.subscribe(System.out::println);
Output:
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Spring Reactor 3 Examples
Mono<Boolean> allProductTitlesLengthBiggerThan5=
productTitles.all(productTitle-> productTitle.length() > 5);
allProductTitlesLengthBiggerThan5.subscribe(System.out::println);
Output:
true
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Spring Reactor 3 Examples
Element mapping
Flux<Integer> productTitlesLength =
productTitles.map(productTitle-> productTitle.length()) ;
productTitlesLength.subscribe(System.out::println);
Output:
10
12
11
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Spring Reactor 3 Examples
Concatenation of 2 Publishers
Flux<String> concatProductTitles =
productTitles.concatWith(anotherProductTitle);
concatProductTitles.subscribe(System.out::println);
Output:
Print 9x13
Photobook A4
Calendar A4
Teddy
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Spring Reactor 3 Examples
Zipping of 2 Publishers
Output:
[Print 9x13,0.09]
[Photobook A4,29.99]
[Calendar A4,15.99]
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Spring Reactor 3 Examples
Parallel processing
Flux.zip(productTitles, productPrices)
.parallel() //returns ParallelFlux, uses all available CPUs or call
parallel(numberOfCPUs)
.runOn(Schedulers.parallel())
.sequential()
.subscribe(System.out::println);
Output:
[Print 9x13,0.09]
[Photobook A4,29.99]
[Calendar A4,15.99]
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Spring Reactor 3 Examples
Blocking Publisher
Blocking Flux:
Flux<String> productTitles = Flux.just("Print 9x13", "Photobook A4", "Calendar A4");
Iterable<String> blockingConcatProductTitles =
productTitles.concatWith(anotherProductTitle) .toIterable();
or
Stream<String> blockingConcatProductTitles =
productTitles.concatWith(anotherProductTitle) .toStream();
Blocking Mono:
String blockingProductTitles = Mono.just("Print 9x13") .block();
or
CompletableFuture blockingProductTitles = Mono.just("Print 9x13").toFuture();
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
LMAX Disruptor
Source: https://github.com/LMAX-Exchange/disruptor/wiki/Introduction
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Spring Reactor 3 Examples
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Spring Reactor 3 Examples
StepVerifier.create(productTitles).
expectNextMatches(productTitle -> productTitle.equals("Print 9x13")).
expectNextMatches(productTitle -> productTitle.equals("Photobook A4")).
expectNextMatches(productTitle -> productTitle.equals("Calendar A4")).
expectComplete().
verify())
Output:
Exception in thread "main" java.lang.AssertionError: expectation
"expectComplete" failed (expected: onComplete(); actual: onNext(Calendar
A4));
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Spring Reactor Compatibility to Java 9 Flow API
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
RxJava 2 vs Spring Reactor 3
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Comparing reactive and streaming implementations
Source: http://akarnokd.blogspot.de/2016/12/the-reactive-scrabble-benchmarks.html
Source: https://twitter.com/akarnokd/status/808995627237601280
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
The future of Reactive StreamAPIs
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Spring 5 / Spring Web Reactive
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Spring 5 / Spring Web Reactive
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Dependencies
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Non-blocking Netty Web Client
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
MongoDB Reactive Database Template
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Model
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Repository
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Thymeleaf Reactive View Resolver
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Controller
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
View
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Non-blocking JSON Parsing with Jackson
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Testing
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Benefits of the Reactive Applications
Source: https://spring.io/blog/2016/06/07/notes-on-reactive-programming-part-i-the-reactive-landscape
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Uses Cases for Reactive Applications
Source: https://spring.io/blog/2016/06/07/notes-on-reactive-programming-part-i-the-reactive-landscape
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Pitfalls of reactive programming
Source: https://spring.io/blog/2016/07/20/notes-on-reactive-programming-part-iii-a-simple-http-server-application
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Questions?
Reactive Programming in Java by Vadym Kazulkin and Rodion Alukhanov, ip.labs GmbH
Contact
Vadym Kazulkin :
Email : v.kazulkin@iplabs.de
Xing : https://www.xing.com/profile/Vadym_Kazulkin
Rodion Alukhanov :
Email : r.alukhanov@iplabs.de
Xing : https://www.xing.com/profile/Rodion_Alukhanov
Th an k You !
w w w.i p l ab s.d e