SlideShare a Scribd company logo
1 of 90
Download to read offline
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Reactor 3. 

Reactive Foundation for Java 8 and Spring
Stephane Maldini
@smaldini
Reactive ?
Reactive ?
Publisher Subscriber
Reactive Streams

reactive-streams.org
Publisher Subscriber
Reactive Streams

reactive-streams.org
Standard definition
Publisher Subscriber
Reactive Streams

reactive-streams.org
Standard definition
0..N Data 

+ 0..1 (Error | Complete)
Publisher Subscriber
Backpressure
Reactive Streams

reactive-streams.org
Standard definition
0..N Data 

+ 0..1 (Error | Complete)
Publisher Subscriber
Backpressure
Reactive Streams

reactive-streams.org
Standard definition
0..N Data 

+ 0..1 (Error | Complete)
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Reactor Core provides for a minimalist set of
Reactive Streams ready 

generators and transformers
4
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Reactor Core provides for a minimalist set of
Reactive Streams ready 

generators and transformers
4
WHY ?
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 5
DIY Reactive Streams
Publisher<User> rickSanchez =
userRepository.findUser(“rick”);
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 5
DIY Reactive Streams
Publisher<User> rickSanchez =
userRepository.findUser(“rick”);
Produce User when ready
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 5
DIY Reactive Streams
Publisher<User> rickSanchez =
userRepository.findUser(“rick”);
Might produce 0, 1 or N Users !
Produce User when ready
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 5
DIY Reactive Streams
Publisher<User> rickSanchez =
userRepository.findUser(“rick”);
Might produce 0, 1 or N Users !
Produce User when ready
rickSanchez.subscribe(new Subscriber<User>(){ … });
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 5
DIY Reactive Streams
Publisher<User> rickSanchez =
userRepository.findUser(“rick”);
Might produce 0, 1 or N Users !
Produce User when ready
Callback for start, result, error or complete
rickSanchez.subscribe(new Subscriber<User>(){ … });
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
DIY Reactive Streams
6
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
DIY Reactive Streams
6
Can I have an API ?
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
DIY Reactive Streams - top issues
• Should Work with RS TCK
• Address reentrance
• Address thread safety
• Address efficiency
• Address state
• For Many-To-One flows, implement your own merging operation
• For One-To-Many lows, implement your own broadcasting operation
• ….
7
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
DIY Reactive Streams - top issues
• Should Work with RS TCK
• Address reentrance
• Address thread safety
• Address efficiency
• Address state
• For Many-To-One flows, implement your own merging operation
• For One-To-Many lows, implement your own broadcasting operation
• ….
7
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 8
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
3 years to mature
9
R e a c t i v e S t r e a m s
C o m m o n s
I P C
A D D O N S
S p r i n g R x
C O R E
2013: 1.x 2014: 2.x 2016: 3.0
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
3 years to mature
9
R e a c t i v e S t r e a m s
C o m m o n s
I P C
A D D O N S
S p r i n g R x
C O R E
Existential
questions
2013: 1.x 2014: 2.x 2016: 3.0
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
3 years to mature
9
R e a c t i v e S t r e a m s
C o m m o n s
I P C
A D D O N S
S p r i n g R x
C O R E
Existential
questions
2013: 1.x 2014: 2.x 2016: 3.0
Microservices
become the norm
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
3 years to mature
9
R e a c t i v e S t r e a m s
C o m m o n s
I P C
A D D O N S
S p r i n g R x
C O R E
Existential
questions
2013: 1.x 2014: 2.x 2016: 3.0
Microservices
become the norm
Rocky style revival
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
3x Influences and Collaborations
10
R e a c t i v e S t r e a m s
C o m m o n s
I P C
A D D O N S
S p r i n g R x
C O R E
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
3x Influences and Collaborations
10
R e a c t i v e S t r e a m s
C o m m o n s
I P C
A D D O N S
S p r i n g R x
C O R E
Flux
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Flux.just("red", "white", "blue")

.flatMap(carRepository::findByColor)

.collect(Result::new, Result::add)

.doOnNext(Result::stop)

.subscribe(doWithResult);
A smarter Publisher ? Flux !
12
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Flux.just("red", "white", "blue")

.flatMap(carRepository::findByColor)

.collect(Result::new, Result::add)

.doOnNext(Result::stop)

.subscribe(doWithResult);
A smarter Publisher ? Flux !
12
interface CarRepository {
Flux<Car> findByColor(String color);
}
Mono
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Mono, push/pull CompletionStage
14
Mono.delayMillis(3000)

.map(d -> "Spring 4")

.or(Mono.delayMillis(2000).map(d -> "Spring 5"))

.then(t -> Mono.just(t+ " world"))

.elapsed()

.block();
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Mono, push/pull CompletionStage
14
Mono.delayMillis(3000)

.map(d -> "Spring 4")

.or(Mono.delayMillis(2000).map(d -> "Spring 5"))

.then(t -> Mono.just(t+ " world"))

.elapsed()

.block();
Non!
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Mono, push/pull CompletionStage
15
Mono.delayMillis(3000)

.map(d -> "Spring 4")

.or(Mono.delayMillis(2000).map(d -> "Spring 5"))

.then(t -> Mono.just(t+ " world"))

.elapsed()

.subscribe();
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Mono, push/pull CompletionStage
15
Mono.delayMillis(3000)

.map(d -> "Spring 4")

.or(Mono.delayMillis(2000).map(d -> "Spring 5"))

.then(t -> Mono.just(t+ " world"))

.elapsed()

.subscribe();
Oui!
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Non Blocking and RS types around
16
Type Semantic /Library Java 8
Reactive Streams
/Java 9
RxJava1

(java6)
Reactor3

(java8)
RxJava2

(java6)
0 or 1 result CompletableFuture<T> Publisher<T> Observable<T> Mono<T> Maybe<T>
0 or N results Publisher<T> Observable<T> Flux<T>
Observable<T>

Flowable<T>
1 result CompletableFuture<T> Publisher<T> Single<T> Mono<T> Single<T>
No result CompletableFuture<Void> Publisher<Void> Completable Mono<Void> Completable
*Reactive Streams types are in bold
**Akka Streams is also a notable RS implementor
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 17
3x Simpler API
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
ONE JAR

reactor-core.jar
17
3x Simpler API
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
ONE JAR

reactor-core.jar
17
3x Simpler API
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
ONE JAR

reactor-core.jar
17
3x Simpler API Where Flux and Mono live
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
ONE JAR

reactor-core.jar
17
3x Simpler API Where Flux and Mono live
Make task execution great again and FIFO
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Execution Model Freedom
18
Synchronous
Asynchronous
Scheduler /
Scheduler.Worker
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Execution Model Freedom
19
Publisher Subscriber
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Execution Model Freedom
19
Publisher Subscriber
Thread: MAIN
Thread: MAIN
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Execution Model Freedom
20
Publisher Subscriber
+publishOn()

Thread: Worker A
Thread: Worker A
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Execution Model Freedom
21
Publisher Subscriber
Thread: Worker B
+subscribeOn()
Thread: Worker B
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Execution Model Freedom
22
Publisher Subscriber
+publishOn()

Thread: Worker A
+subscribeOn()
Thread: Worker B
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
3x more focus on Javadoc
23
http://projectreactor.io/core/docs/api
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Learning to Flux & Mono
24
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Learning to Flux & Mono
24
https://spring.io/blog/2016/06/07/notes-on-
reactive-programming-part-i-the-reactive-
landscape
https://spring.io/blog/2016/06/13/notes-on-
reactive-programming-part-ii-writing-some-code
https://spring.io/blog/2016/07/20/notes-on-
reactive-programming-part-iii-a-simple-http-server-
application
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Learning to Flux & Mono
24
https://spring.io/blog/2016/06/07/notes-on-
reactive-programming-part-i-the-reactive-
landscape
https://spring.io/blog/2016/06/13/notes-on-
reactive-programming-part-ii-writing-some-code
https://spring.io/blog/2016/07/20/notes-on-
reactive-programming-part-iii-a-simple-http-server-
application
Just browse spring.io/blog already
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Bridge Existing Asynchronous Code
Mono<String> response = Mono.create(sink -> {

HttpListener listener = event -> {

if (event.getResponseCode() >= 400) {

sink.error(new RuntimeExeption("Failed"));

} else {

String body = event.getBody();

if (body.isEmpty()) {

sink.success();

} else {

sink.success(body.toLowerCase());

}

}

};



client.addListener(listener);



emitter.setCancellation(() -> client.removeListener(listener));

});
•
25
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Bridge Existing Asynchronous Code
Mono<String> response = Mono.create(sink -> {

HttpListener listener = event -> {

if (event.getResponseCode() >= 400) {

sink.error(new RuntimeExeption("Failed"));

} else {

String body = event.getBody();

if (body.isEmpty()) {

sink.success();

} else {

sink.success(body.toLowerCase());

}

}

};



client.addListener(listener);



emitter.setCancellation(() -> client.removeListener(listener));

});
•
25
Also exists for Flux of N items
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Debug Mode
26
215 Hooks.onOperator(op -> op.operatorStacktrace());
216 try {
217 Mono.just(1)
218 .map(d -> {
219 throw new RuntimeException();
220 })
221 .filter(d -> true)
222 .timestamp()
223 .elapsed()
224 .map(d -> d)
225 .block();
226 }
227 catch(Exception e){
228 e.printStackTrace();
229 }
230 finally {
231 Hooks.resetOnOperator();
232 }
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Debug Mode
26
215 Hooks.onOperator(op -> op.operatorStacktrace());
216 try {
217 Mono.just(1)
218 .map(d -> {
219 throw new RuntimeException();
220 })
221 .filter(d -> true)
222 .timestamp()
223 .elapsed()
224 .map(d -> d)
225 .block();
226 }
227 catch(Exception e){
228 e.printStackTrace();
229 }
230 finally {
231 Hooks.resetOnOperator();
232 }
Capture stack for each
operator declared after
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Debug Mode
26
215 Hooks.onOperator(op -> op.operatorStacktrace());
216 try {
217 Mono.just(1)
218 .map(d -> {
219 throw new RuntimeException();
220 })
221 .filter(d -> true)
222 .timestamp()
223 .elapsed()
224 .map(d -> d)
225 .block();
226 }
227 catch(Exception e){
228 e.printStackTrace();
229 }
230 finally {
231 Hooks.resetOnOperator();
232 }
Capture stack for each
operator declared after
Assembly trace from producer [reactor.core.publisher.MonoMapFuseable] :
reactor.core.publisher.Mono.map(Mono.java:1795)
reactor.HooksTest.testTrace2(HooksTest.java:218)
Composition chain until failing Operator :
|_ Mono.map(HooksTest.java:218)
|_ Mono.filter(HooksTest.java:221)
|_ Mono.timestamp(HooksTest.java:222)
|_ Mono.elapsed(HooksTest.java:223)
|_ Mono.map(HooksTest.java:224)
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Create Gateways to Flux And Mono
27
EmitterProcessor<Integer> processor = EmitterProcessor.create();



int n = 100_000;

processor.publishOn(Schedulers.single())

.subscribe(someService::handleData);



BlockingSink<Integer> session = processor.connectSink();



for (int i = 0; i < n; i++) {

while (!session.emit(i).isOk()) {

if (session.hasFailed()) {

throw session.getError();

}
//fake throttling
Thread.sleep(1);

}

}

session.finish();
•
EmitterProcessor
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Create Gateways to Flux And Mono
27
EmitterProcessor<Integer> processor = EmitterProcessor.create();



int n = 100_000;

processor.publishOn(Schedulers.single())

.subscribe(someService::handleData);



BlockingSink<Integer> session = processor.connectSink();



for (int i = 0; i < n; i++) {

while (!session.emit(i).isOk()) {

if (session.hasFailed()) {

throw session.getError();

}
//fake throttling
Thread.sleep(1);

}

}

session.finish();
•
EmitterProcessor
Backpressure Companion
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
EmitterProcessor<Integer> processor = EmitterProcessor.create();



int n = 100_000;

processor.publishOn(Schedulers.single())

.subscribe(someService::handleData);



BlockingSink<Integer> session = processor.connectSink();



for (int i = 0; i < n; i++) {

while (!session.emit(i).isOk()) {

if (session.hasFailed()) {

throw session.getError();

}
Thread.sleep(1); //fake throttling

}

}

session.finish();
•
Create Gateways to Flux And Mono
28
EmitterProcessor
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Operation Fusion
• Reactor has a mission to limit the overhead in stack and message
passing
• 2 key categories :
• “Macro Fusion” : merge operators in one (assembly time)
• “Micro Fusion” : avoid queue creation and short circuit where
possible request lifecycle.
29
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Starve CPU’s with ParallelFlux…
30
Flux.range(1, 100000)

.parallel(3)

.runOn(Schedulers.parallel())

.collect(ArrayList::new, ArrayList::add)

.sequential()

.reduce(0, (a, b) -> a + b.size())

.subscribeWith(TestSubscriber.create())

.await(Duration.ofSeconds(5))

.assertValues(100_000)

.assertNoError()

.assertComplete();
•
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Starve CPU’s with ParallelFlux…
30
Flux.range(1, 100000)

.parallel(3)

.runOn(Schedulers.parallel())

.collect(ArrayList::new, ArrayList::add)

.sequential()

.reduce(0, (a, b) -> a + b.size())

.subscribeWith(TestSubscriber.create())

.await(Duration.ofSeconds(5))

.assertValues(100_000)

.assertNoError()

.assertComplete();
•
x3
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Efficient and micro bench ready
31
https://github.com/akarnokd/akarnokd-misc/tree/master/src/jmh/java/hu/akarnokd/comparison
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Efficient and micro bench ready
31
https://github.com/akarnokd/akarnokd-misc/tree/master/src/jmh/java/hu/akarnokd/comparison
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Efficient and micro bench ready
31
https://github.com/akarnokd/akarnokd-misc/tree/master/src/jmh/java/hu/akarnokd/comparison
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Bridge Fabulous RxJava
32
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Bridge Fabulous RxJava
32
RxJava1Adapter
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Bridge Java 9 Reactive Streams
33
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Bridge Java 9 Reactive Streams
33
JdkFlowAdapter
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Play with Reactor Core .NET
34
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Play with Reactor Core .NET
34
https://www.nuget.org/packages/Reactor.Core/
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Backpressure for JS: Reactor Core TypeScript
35
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Backpressure for JS: Reactor Core TypeScript
35
https://www.npmjs.com/package/reactor-core-js
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
EVERYTHING REACTIVE ?
36
µ Service A
Data
Cloud
Messaging
Web
Service B
Message

Broker
Datastore
20 ms
50 ms
150 ms
250 ms
20 ms
15 ms
3 ms
GATEWAY
µ Service A
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Reactor Ecosystem roadmap
39
Reactor Netty
Reactor IPC
Spring Framework
Spring 5, 

Spring Cloud Stream, 

Spring Integration,

Spring Data, 

Spring Boot, 

Spring Cloud, 

Spring Security,

…
Reactor Kafka
Extra add-ons

dashboard, bus,
codecs, more
operations &
schedulers…
Reactor Redis
Reactor Aeron
Spring Framework 5
Spring Web MVC
@Controller, @RequestMapping
Servlet API
Servlet Container
Spring Web MVC
@Controller, @RequestMapping
Servlet API
Servlet Container
Reactive
Non-blocking
…
Spring Web MVC Spring Web Reactive
@Controller, @RequestMapping
Servlet API
Servlet Container
Spring Web MVC Spring Web Reactive
@Controller, @RequestMapping
Servlet API
Servlet Container
Reactive HTTP
Spring Web MVC Spring Web Reactive
@Controller, @RequestMapping
Servlet API
Servlet Container
Reactive HTTP
Servlet 3.1 Container
Spring Web MVC Spring Web Reactive
@Controller, @RequestMapping
Servlet API
Servlet Container
Reactive HTTP
Servlet 3.1 ContainerServlet 3.1, Netty
Spring Web MVC Spring Web Reactive
@Controller, @RequestMapping
Servlet API
Servlet Container
Reactive HTTP
Servlet 3.1 ContainerServlet 3.1, Netty, Undertow
Non-Blocking HTTP GET
Non-Blocking HTTP POST
WebClient Scatter/Gather
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 51
SpringBootApplication

@EnableBinding(Processor.class)

public class WordCountApplication {



@StreamListener

@Output("output")

public Flux<WordCount> countWords(@Input("input") Flux<String> words) {

return words.window(ofSeconds(5), ofSeconds(1))

.flatMap(window -> window.groupBy(word -> word)

.flatMap(group -> group.reduce(0, (counter, word) -> counter + 1)

.map(count -> new WordCount(group.key(), count))));

}
}
Spring Cloud Stream: 

Stateful processors
Boot Data Cloud IntegrationSecurity
Reactive Efforts
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
@ProjectReactor
http://github.com/reactor
http://projectreactor.io
Extra Slideware:
www.slideshare.net/SpringCentral/imperative-to-reactive-web-applications
www.slideshare.net/SpringCentral/designing-implementing-and-using-reactive-apis
http://www.slideshare.net/RobHarrop/going-reactive-63425158

More Related Content

What's hot

Practical non blocking microservices in java 8
Practical non blocking microservices in java 8Practical non blocking microservices in java 8
Practical non blocking microservices in java 8Michal Balinski
 
Being Functional on Reactive Streams with Spring Reactor
Being Functional on Reactive Streams with Spring ReactorBeing Functional on Reactive Streams with Spring Reactor
Being Functional on Reactive Streams with Spring ReactorMax Huang
 
Reactive programming
Reactive programmingReactive programming
Reactive programmingSUDIP GHOSH
 
Escalando aplicações no front-end com ReactJS
Escalando aplicações no front-end com ReactJSEscalando aplicações no front-end com ReactJS
Escalando aplicações no front-end com ReactJSCriciúma Dev
 
Introduction to Spring webflux
Introduction to Spring webfluxIntroduction to Spring webflux
Introduction to Spring webfluxKnoldus Inc.
 
Microservices Architecture Part 2 Event Sourcing and Saga
Microservices Architecture Part 2 Event Sourcing and SagaMicroservices Architecture Part 2 Event Sourcing and Saga
Microservices Architecture Part 2 Event Sourcing and SagaAraf Karsh Hamid
 
MEAN Stack - Introduction & Advantages - Why should you switch to MEAN stack ...
MEAN Stack - Introduction & Advantages - Why should you switch to MEAN stack ...MEAN Stack - Introduction & Advantages - Why should you switch to MEAN stack ...
MEAN Stack - Introduction & Advantages - Why should you switch to MEAN stack ...Hariharan Ganesan
 
ARCHITECTURE MICROSERVICE : TOUR D’HORIZON DU CONCEPT ET BONNES PRATIQUES
ARCHITECTURE MICROSERVICE : TOUR D’HORIZON DU CONCEPT ET BONNES PRATIQUESARCHITECTURE MICROSERVICE : TOUR D’HORIZON DU CONCEPT ET BONNES PRATIQUES
ARCHITECTURE MICROSERVICE : TOUR D’HORIZON DU CONCEPT ET BONNES PRATIQUESSOAT
 
Event Driven Microservices with Spring Cloud Stream #jjug_ccc #ccc_ab3
Event Driven Microservices with Spring Cloud Stream #jjug_ccc #ccc_ab3Event Driven Microservices with Spring Cloud Stream #jjug_ccc #ccc_ab3
Event Driven Microservices with Spring Cloud Stream #jjug_ccc #ccc_ab3Toshiaki Maki
 
Introduce of open swoole
Introduce of open swooleIntroduce of open swoole
Introduce of open swooleThanh Tai
 
React Router: React Meetup XXL
React Router: React Meetup XXLReact Router: React Meetup XXL
React Router: React Meetup XXLRob Gietema
 

What's hot (20)

Practical non blocking microservices in java 8
Practical non blocking microservices in java 8Practical non blocking microservices in java 8
Practical non blocking microservices in java 8
 
Being Functional on Reactive Streams with Spring Reactor
Being Functional on Reactive Streams with Spring ReactorBeing Functional on Reactive Streams with Spring Reactor
Being Functional on Reactive Streams with Spring Reactor
 
Jsp
JspJsp
Jsp
 
Reactive programming
Reactive programmingReactive programming
Reactive programming
 
React js basics
React js basicsReact js basics
React js basics
 
Escalando aplicações no front-end com ReactJS
Escalando aplicações no front-end com ReactJSEscalando aplicações no front-end com ReactJS
Escalando aplicações no front-end com ReactJS
 
Jsp presentation
Jsp presentationJsp presentation
Jsp presentation
 
Front end architecture patterns
Front end architecture patternsFront end architecture patterns
Front end architecture patterns
 
Introduction to Spring webflux
Introduction to Spring webfluxIntroduction to Spring webflux
Introduction to Spring webflux
 
Microservices Architecture Part 2 Event Sourcing and Saga
Microservices Architecture Part 2 Event Sourcing and SagaMicroservices Architecture Part 2 Event Sourcing and Saga
Microservices Architecture Part 2 Event Sourcing and Saga
 
MEAN Stack - Introduction & Advantages - Why should you switch to MEAN stack ...
MEAN Stack - Introduction & Advantages - Why should you switch to MEAN stack ...MEAN Stack - Introduction & Advantages - Why should you switch to MEAN stack ...
MEAN Stack - Introduction & Advantages - Why should you switch to MEAN stack ...
 
ARCHITECTURE MICROSERVICE : TOUR D’HORIZON DU CONCEPT ET BONNES PRATIQUES
ARCHITECTURE MICROSERVICE : TOUR D’HORIZON DU CONCEPT ET BONNES PRATIQUESARCHITECTURE MICROSERVICE : TOUR D’HORIZON DU CONCEPT ET BONNES PRATIQUES
ARCHITECTURE MICROSERVICE : TOUR D’HORIZON DU CONCEPT ET BONNES PRATIQUES
 
Event Driven Microservices with Spring Cloud Stream #jjug_ccc #ccc_ab3
Event Driven Microservices with Spring Cloud Stream #jjug_ccc #ccc_ab3Event Driven Microservices with Spring Cloud Stream #jjug_ccc #ccc_ab3
Event Driven Microservices with Spring Cloud Stream #jjug_ccc #ccc_ab3
 
Tomcat server
 Tomcat server Tomcat server
Tomcat server
 
Python開発者のためのHeroku入門
Python開発者のためのHeroku入門Python開発者のためのHeroku入門
Python開発者のためのHeroku入門
 
Introduce of open swoole
Introduce of open swooleIntroduce of open swoole
Introduce of open swoole
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
 
Introduction to Node.js
Introduction to Node.jsIntroduction to Node.js
Introduction to Node.js
 
Laravel Introduction
Laravel IntroductionLaravel Introduction
Laravel Introduction
 
React Router: React Meetup XXL
React Router: React Meetup XXLReact Router: React Meetup XXL
React Router: React Meetup XXL
 

Viewers also liked

Reactive Programming in Spring 5
Reactive Programming in Spring 5Reactive Programming in Spring 5
Reactive Programming in Spring 5poutsma
 
Reactor, Reactive streams and MicroServices
Reactor, Reactive streams and MicroServicesReactor, Reactive streams and MicroServices
Reactor, Reactive streams and MicroServicesStéphane Maldini
 
Going Reactive
Going ReactiveGoing Reactive
Going ReactiveRob Harrop
 
Embracing Reactive Streams with Java 9 and Spring 5
Embracing Reactive Streams with Java 9 and Spring 5Embracing Reactive Streams with Java 9 and Spring 5
Embracing Reactive Streams with Java 9 and Spring 5Wilder Rodrigues
 
Designing for Distributed Systems with Reactor and Reactive Streams
Designing for Distributed Systems with Reactor and Reactive StreamsDesigning for Distributed Systems with Reactor and Reactive Streams
Designing for Distributed Systems with Reactor and Reactive StreamsStéphane Maldini
 
Introduction to Reactive Streams and Reactor 2.5
Introduction to Reactive Streams and Reactor 2.5Introduction to Reactive Streams and Reactor 2.5
Introduction to Reactive Streams and Reactor 2.5Stéphane Maldini
 
Supercharged java 8 : with cyclops-react
Supercharged java 8 : with cyclops-reactSupercharged java 8 : with cyclops-react
Supercharged java 8 : with cyclops-reactJohn McClean
 
โรงไฟฟ้านิวเคลียร์ 1
โรงไฟฟ้านิวเคลียร์ 1โรงไฟฟ้านิวเคลียร์ 1
โรงไฟฟ้านิวเคลียร์ 1nuchida suwapaet
 
Spring 5 + Kotlin (Rus)
Spring 5 + Kotlin (Rus)Spring 5 + Kotlin (Rus)
Spring 5 + Kotlin (Rus)Siarhei Krukau
 
Reactive Software Systems
Reactive Software SystemsReactive Software Systems
Reactive Software SystemsBehrad Zari
 
Asynchronous design with Spring and RTI: 1M events per second
Asynchronous design with Spring and RTI: 1M events per secondAsynchronous design with Spring and RTI: 1M events per second
Asynchronous design with Spring and RTI: 1M events per secondStuart (Pid) Williams
 
The Reactive Manifesto: Message-driven, Resilient, Elastic, Responsive - Stef...
The Reactive Manifesto: Message-driven, Resilient, Elastic, Responsive - Stef...The Reactive Manifesto: Message-driven, Resilient, Elastic, Responsive - Stef...
The Reactive Manifesto: Message-driven, Resilient, Elastic, Responsive - Stef...Codemotion
 
Spring Framework 5: History and Reactive features
Spring Framework 5: History and Reactive featuresSpring Framework 5: History and Reactive features
Spring Framework 5: History and Reactive featuresAliaksei Zhynhiarouski
 
Understanding Microservice Performance
Understanding Microservice PerformanceUnderstanding Microservice Performance
Understanding Microservice PerformanceRob Harrop
 

Viewers also liked (18)

Reactive Programming in Spring 5
Reactive Programming in Spring 5Reactive Programming in Spring 5
Reactive Programming in Spring 5
 
Reactive Spring Framework 5
Reactive Spring Framework 5Reactive Spring Framework 5
Reactive Spring Framework 5
 
Reactor, Reactive streams and MicroServices
Reactor, Reactive streams and MicroServicesReactor, Reactive streams and MicroServices
Reactor, Reactive streams and MicroServices
 
Going Reactive
Going ReactiveGoing Reactive
Going Reactive
 
Embracing Reactive Streams with Java 9 and Spring 5
Embracing Reactive Streams with Java 9 and Spring 5Embracing Reactive Streams with Java 9 and Spring 5
Embracing Reactive Streams with Java 9 and Spring 5
 
Designing for Distributed Systems with Reactor and Reactive Streams
Designing for Distributed Systems with Reactor and Reactive StreamsDesigning for Distributed Systems with Reactor and Reactive Streams
Designing for Distributed Systems with Reactor and Reactive Streams
 
Machine intelligence
Machine intelligenceMachine intelligence
Machine intelligence
 
Introduction to Reactive Streams and Reactor 2.5
Introduction to Reactive Streams and Reactor 2.5Introduction to Reactive Streams and Reactor 2.5
Introduction to Reactive Streams and Reactor 2.5
 
Reactive Web Applications
Reactive Web ApplicationsReactive Web Applications
Reactive Web Applications
 
Supercharged java 8 : with cyclops-react
Supercharged java 8 : with cyclops-reactSupercharged java 8 : with cyclops-react
Supercharged java 8 : with cyclops-react
 
Eventsggx
EventsggxEventsggx
Eventsggx
 
โรงไฟฟ้านิวเคลียร์ 1
โรงไฟฟ้านิวเคลียร์ 1โรงไฟฟ้านิวเคลียร์ 1
โรงไฟฟ้านิวเคลียร์ 1
 
Spring 5 + Kotlin (Rus)
Spring 5 + Kotlin (Rus)Spring 5 + Kotlin (Rus)
Spring 5 + Kotlin (Rus)
 
Reactive Software Systems
Reactive Software SystemsReactive Software Systems
Reactive Software Systems
 
Asynchronous design with Spring and RTI: 1M events per second
Asynchronous design with Spring and RTI: 1M events per secondAsynchronous design with Spring and RTI: 1M events per second
Asynchronous design with Spring and RTI: 1M events per second
 
The Reactive Manifesto: Message-driven, Resilient, Elastic, Responsive - Stef...
The Reactive Manifesto: Message-driven, Resilient, Elastic, Responsive - Stef...The Reactive Manifesto: Message-driven, Resilient, Elastic, Responsive - Stef...
The Reactive Manifesto: Message-driven, Resilient, Elastic, Responsive - Stef...
 
Spring Framework 5: History and Reactive features
Spring Framework 5: History and Reactive featuresSpring Framework 5: History and Reactive features
Spring Framework 5: History and Reactive features
 
Understanding Microservice Performance
Understanding Microservice PerformanceUnderstanding Microservice Performance
Understanding Microservice Performance
 

Similar to Reactor 3.0, a reactive foundation for java 8 and Spring

Avoiding that $1M Dollar AWS Bill
Avoiding that $1M Dollar AWS BillAvoiding that $1M Dollar AWS Bill
Avoiding that $1M Dollar AWS BillVMware Tanzu
 
Continuous Delivery for Microservice Architectures with Concourse & Cloud Fou...
Continuous Delivery for Microservice Architectures with Concourse & Cloud Fou...Continuous Delivery for Microservice Architectures with Concourse & Cloud Fou...
Continuous Delivery for Microservice Architectures with Concourse & Cloud Fou...VMware Tanzu
 
Reactive frontends with RxJS and Angular
Reactive frontends with RxJS and AngularReactive frontends with RxJS and Angular
Reactive frontends with RxJS and AngularVMware Tanzu
 
SpringOnePlatform2017 recap
SpringOnePlatform2017 recapSpringOnePlatform2017 recap
SpringOnePlatform2017 recapminseok kim
 
Implementing microservices tracing with spring cloud and zipkin (spring one)
Implementing microservices tracing with spring cloud and zipkin (spring one)Implementing microservices tracing with spring cloud and zipkin (spring one)
Implementing microservices tracing with spring cloud and zipkin (spring one)Reshmi Krishna
 
Cloud Native Java with Spring Cloud Services
Cloud Native Java with Spring Cloud ServicesCloud Native Java with Spring Cloud Services
Cloud Native Java with Spring Cloud ServicesVMware Tanzu
 
Under the Hood of Reactive Data Access (2/2)
Under the Hood of Reactive Data Access (2/2)Under the Hood of Reactive Data Access (2/2)
Under the Hood of Reactive Data Access (2/2)VMware Tanzu
 
Tools to Slay the Fire Breathing Monoliths in Your Enterprise
Tools to Slay the Fire Breathing Monoliths in Your EnterpriseTools to Slay the Fire Breathing Monoliths in Your Enterprise
Tools to Slay the Fire Breathing Monoliths in Your EnterpriseVMware Tanzu
 
Who Does What? Mapping Cloud Foundry Activities and Entitlements to IT Roles
Who Does What? Mapping Cloud Foundry Activities and Entitlements to IT RolesWho Does What? Mapping Cloud Foundry Activities and Entitlements to IT Roles
Who Does What? Mapping Cloud Foundry Activities and Entitlements to IT RolesVMware Tanzu
 
In the workshop with GCP, Home Depot & Cloud Foundry
In the workshop with GCP, Home Depot & Cloud FoundryIn the workshop with GCP, Home Depot & Cloud Foundry
In the workshop with GCP, Home Depot & Cloud FoundryChristopher Grant
 
Under the Hood of Reactive Data Access (1/2)
Under the Hood of Reactive Data Access (1/2)Under the Hood of Reactive Data Access (1/2)
Under the Hood of Reactive Data Access (1/2)VMware Tanzu
 
What's new in Reactor Californium
What's new in Reactor CaliforniumWhat's new in Reactor Californium
What's new in Reactor CaliforniumStéphane Maldini
 
Caching for Microservives - Introduction to Pivotal Cloud Cache
Caching for Microservives - Introduction to Pivotal Cloud CacheCaching for Microservives - Introduction to Pivotal Cloud Cache
Caching for Microservives - Introduction to Pivotal Cloud CacheVMware Tanzu
 
Enable SQL/JDBC Access to Apache Geode/GemFire Using Apache Calcite
Enable SQL/JDBC Access to Apache Geode/GemFire Using Apache CalciteEnable SQL/JDBC Access to Apache Geode/GemFire Using Apache Calcite
Enable SQL/JDBC Access to Apache Geode/GemFire Using Apache CalciteChristian Tzolov
 
Marcin Grzejszczak - Contract Tests in the Enterprise
Marcin Grzejszczak - Contract Tests in the EnterpriseMarcin Grzejszczak - Contract Tests in the Enterprise
Marcin Grzejszczak - Contract Tests in the EnterpriseSegFaultConf
 
Latency analysis for your microservices using Spring Cloud & Zipkin
Latency analysis for your microservices using Spring Cloud & ZipkinLatency analysis for your microservices using Spring Cloud & Zipkin
Latency analysis for your microservices using Spring Cloud & ZipkinVMware Tanzu
 
Case Study of Batch Processing With Spring Cloud Data Flow Server in Cloud Fo...
Case Study of Batch Processing With Spring Cloud Data Flow Server in Cloud Fo...Case Study of Batch Processing With Spring Cloud Data Flow Server in Cloud Fo...
Case Study of Batch Processing With Spring Cloud Data Flow Server in Cloud Fo...VMware Tanzu
 
Cloud Native Key Management
Cloud Native Key ManagementCloud Native Key Management
Cloud Native Key ManagementVMware Tanzu
 
Documenting RESTful APIs with Spring REST Docs
Documenting RESTful APIs with Spring REST Docs Documenting RESTful APIs with Spring REST Docs
Documenting RESTful APIs with Spring REST Docs VMware Tanzu
 

Similar to Reactor 3.0, a reactive foundation for java 8 and Spring (20)

Avoiding that $1M Dollar AWS Bill
Avoiding that $1M Dollar AWS BillAvoiding that $1M Dollar AWS Bill
Avoiding that $1M Dollar AWS Bill
 
Continuous Delivery for Microservice Architectures with Concourse & Cloud Fou...
Continuous Delivery for Microservice Architectures with Concourse & Cloud Fou...Continuous Delivery for Microservice Architectures with Concourse & Cloud Fou...
Continuous Delivery for Microservice Architectures with Concourse & Cloud Fou...
 
Reactive frontends with RxJS and Angular
Reactive frontends with RxJS and AngularReactive frontends with RxJS and Angular
Reactive frontends with RxJS and Angular
 
SpringOnePlatform2017 recap
SpringOnePlatform2017 recapSpringOnePlatform2017 recap
SpringOnePlatform2017 recap
 
Zuul @ Netflix SpringOne Platform
Zuul @ Netflix SpringOne PlatformZuul @ Netflix SpringOne Platform
Zuul @ Netflix SpringOne Platform
 
Implementing microservices tracing with spring cloud and zipkin (spring one)
Implementing microservices tracing with spring cloud and zipkin (spring one)Implementing microservices tracing with spring cloud and zipkin (spring one)
Implementing microservices tracing with spring cloud and zipkin (spring one)
 
Cloud Native Java with Spring Cloud Services
Cloud Native Java with Spring Cloud ServicesCloud Native Java with Spring Cloud Services
Cloud Native Java with Spring Cloud Services
 
Under the Hood of Reactive Data Access (2/2)
Under the Hood of Reactive Data Access (2/2)Under the Hood of Reactive Data Access (2/2)
Under the Hood of Reactive Data Access (2/2)
 
Tools to Slay the Fire Breathing Monoliths in Your Enterprise
Tools to Slay the Fire Breathing Monoliths in Your EnterpriseTools to Slay the Fire Breathing Monoliths in Your Enterprise
Tools to Slay the Fire Breathing Monoliths in Your Enterprise
 
Who Does What? Mapping Cloud Foundry Activities and Entitlements to IT Roles
Who Does What? Mapping Cloud Foundry Activities and Entitlements to IT RolesWho Does What? Mapping Cloud Foundry Activities and Entitlements to IT Roles
Who Does What? Mapping Cloud Foundry Activities and Entitlements to IT Roles
 
In the workshop with GCP, Home Depot & Cloud Foundry
In the workshop with GCP, Home Depot & Cloud FoundryIn the workshop with GCP, Home Depot & Cloud Foundry
In the workshop with GCP, Home Depot & Cloud Foundry
 
Under the Hood of Reactive Data Access (1/2)
Under the Hood of Reactive Data Access (1/2)Under the Hood of Reactive Data Access (1/2)
Under the Hood of Reactive Data Access (1/2)
 
What's new in Reactor Californium
What's new in Reactor CaliforniumWhat's new in Reactor Californium
What's new in Reactor Californium
 
Caching for Microservives - Introduction to Pivotal Cloud Cache
Caching for Microservives - Introduction to Pivotal Cloud CacheCaching for Microservives - Introduction to Pivotal Cloud Cache
Caching for Microservives - Introduction to Pivotal Cloud Cache
 
Enable SQL/JDBC Access to Apache Geode/GemFire Using Apache Calcite
Enable SQL/JDBC Access to Apache Geode/GemFire Using Apache CalciteEnable SQL/JDBC Access to Apache Geode/GemFire Using Apache Calcite
Enable SQL/JDBC Access to Apache Geode/GemFire Using Apache Calcite
 
Marcin Grzejszczak - Contract Tests in the Enterprise
Marcin Grzejszczak - Contract Tests in the EnterpriseMarcin Grzejszczak - Contract Tests in the Enterprise
Marcin Grzejszczak - Contract Tests in the Enterprise
 
Latency analysis for your microservices using Spring Cloud & Zipkin
Latency analysis for your microservices using Spring Cloud & ZipkinLatency analysis for your microservices using Spring Cloud & Zipkin
Latency analysis for your microservices using Spring Cloud & Zipkin
 
Case Study of Batch Processing With Spring Cloud Data Flow Server in Cloud Fo...
Case Study of Batch Processing With Spring Cloud Data Flow Server in Cloud Fo...Case Study of Batch Processing With Spring Cloud Data Flow Server in Cloud Fo...
Case Study of Batch Processing With Spring Cloud Data Flow Server in Cloud Fo...
 
Cloud Native Key Management
Cloud Native Key ManagementCloud Native Key Management
Cloud Native Key Management
 
Documenting RESTful APIs with Spring REST Docs
Documenting RESTful APIs with Spring REST Docs Documenting RESTful APIs with Spring REST Docs
Documenting RESTful APIs with Spring REST Docs
 

More from Stéphane Maldini

Multi-service reactive streams using Spring, Reactor, RSocket
Multi-service reactive streams using Spring, Reactor, RSocketMulti-service reactive streams using Spring, Reactor, RSocket
Multi-service reactive streams using Spring, Reactor, RSocketStéphane Maldini
 
The Future of Reactive Architectures
The Future of Reactive ArchitecturesThe Future of Reactive Architectures
The Future of Reactive ArchitecturesStéphane Maldini
 
Spring boot 2.0 reactive bits (June 2018)
Spring boot 2.0 reactive bits (June 2018)Spring boot 2.0 reactive bits (June 2018)
Spring boot 2.0 reactive bits (June 2018)Stéphane Maldini
 
Springone2gx 2014 Reactive Streams and Reactor
Springone2gx 2014 Reactive Streams and ReactorSpringone2gx 2014 Reactive Streams and Reactor
Springone2gx 2014 Reactive Streams and ReactorStéphane Maldini
 
Reactor grails realtime web devoxx 2013
Reactor grails realtime web   devoxx 2013Reactor grails realtime web   devoxx 2013
Reactor grails realtime web devoxx 2013Stéphane Maldini
 
Groovy reactor grails realtime web devoxx 2013
Groovy reactor grails realtime web   devoxx 2013Groovy reactor grails realtime web   devoxx 2013
Groovy reactor grails realtime web devoxx 2013Stéphane Maldini
 
Reactor spring one2gx_2013_0902-final
Reactor spring one2gx_2013_0902-finalReactor spring one2gx_2013_0902-final
Reactor spring one2gx_2013_0902-finalStéphane Maldini
 

More from Stéphane Maldini (10)

The value of reactive
The value of reactiveThe value of reactive
The value of reactive
 
Multi-service reactive streams using Spring, Reactor, RSocket
Multi-service reactive streams using Spring, Reactor, RSocketMulti-service reactive streams using Spring, Reactor, RSocket
Multi-service reactive streams using Spring, Reactor, RSocket
 
The Future of Reactive Architectures
The Future of Reactive ArchitecturesThe Future of Reactive Architectures
The Future of Reactive Architectures
 
Spring Cloud Gateway
Spring Cloud GatewaySpring Cloud Gateway
Spring Cloud Gateway
 
Spring boot 2.0 reactive bits (June 2018)
Spring boot 2.0 reactive bits (June 2018)Spring boot 2.0 reactive bits (June 2018)
Spring boot 2.0 reactive bits (June 2018)
 
Springone2gx 2014 Reactive Streams and Reactor
Springone2gx 2014 Reactive Streams and ReactorSpringone2gx 2014 Reactive Streams and Reactor
Springone2gx 2014 Reactive Streams and Reactor
 
Reactor grails realtime web devoxx 2013
Reactor grails realtime web   devoxx 2013Reactor grails realtime web   devoxx 2013
Reactor grails realtime web devoxx 2013
 
Groovy reactor grails realtime web devoxx 2013
Groovy reactor grails realtime web   devoxx 2013Groovy reactor grails realtime web   devoxx 2013
Groovy reactor grails realtime web devoxx 2013
 
Ss2gx
Ss2gxSs2gx
Ss2gx
 
Reactor spring one2gx_2013_0902-final
Reactor spring one2gx_2013_0902-finalReactor spring one2gx_2013_0902-final
Reactor spring one2gx_2013_0902-final
 

Recently uploaded

Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...OnePlan Solutions
 
How to Track Employee Performance A Comprehensive Guide.pdf
How to Track Employee Performance A Comprehensive Guide.pdfHow to Track Employee Performance A Comprehensive Guide.pdf
How to Track Employee Performance A Comprehensive Guide.pdfLivetecs LLC
 
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...OnePlan Solutions
 
Introduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdfIntroduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdfFerryKemperman
 
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company OdishaBalasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odishasmiwainfosol
 
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Angel Borroy López
 
Unveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesUnveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesŁukasz Chruściel
 
Best Web Development Agency- Idiosys USA.pdf
Best Web Development Agency- Idiosys USA.pdfBest Web Development Agency- Idiosys USA.pdf
Best Web Development Agency- Idiosys USA.pdfIdiosysTechnologies1
 
Odoo 14 - eLearning Module In Odoo 14 Enterprise
Odoo 14 - eLearning Module In Odoo 14 EnterpriseOdoo 14 - eLearning Module In Odoo 14 Enterprise
Odoo 14 - eLearning Module In Odoo 14 Enterprisepreethippts
 
How to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationHow to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationBradBedford3
 
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...Cizo Technology Services
 
Implementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureImplementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureDinusha Kumarasiri
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaHanief Utama
 
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)jennyeacort
 
Folding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesFolding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesPhilip Schwarz
 
A healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfA healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfMarharyta Nedzelska
 
Intelligent Home Wi-Fi Solutions | ThinkPalm
Intelligent Home Wi-Fi Solutions | ThinkPalmIntelligent Home Wi-Fi Solutions | ThinkPalm
Intelligent Home Wi-Fi Solutions | ThinkPalmSujith Sukumaran
 
What is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWhat is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWave PLM
 
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...Natan Silnitsky
 

Recently uploaded (20)

Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
 
How to Track Employee Performance A Comprehensive Guide.pdf
How to Track Employee Performance A Comprehensive Guide.pdfHow to Track Employee Performance A Comprehensive Guide.pdf
How to Track Employee Performance A Comprehensive Guide.pdf
 
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
 
Introduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdfIntroduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdf
 
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company OdishaBalasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
 
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
 
Unveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesUnveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New Features
 
Best Web Development Agency- Idiosys USA.pdf
Best Web Development Agency- Idiosys USA.pdfBest Web Development Agency- Idiosys USA.pdf
Best Web Development Agency- Idiosys USA.pdf
 
Odoo 14 - eLearning Module In Odoo 14 Enterprise
Odoo 14 - eLearning Module In Odoo 14 EnterpriseOdoo 14 - eLearning Module In Odoo 14 Enterprise
Odoo 14 - eLearning Module In Odoo 14 Enterprise
 
How to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationHow to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion Application
 
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
 
Implementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureImplementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with Azure
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief Utama
 
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
 
Folding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesFolding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a series
 
A healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfA healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdf
 
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort ServiceHot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
 
Intelligent Home Wi-Fi Solutions | ThinkPalm
Intelligent Home Wi-Fi Solutions | ThinkPalmIntelligent Home Wi-Fi Solutions | ThinkPalm
Intelligent Home Wi-Fi Solutions | ThinkPalm
 
What is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWhat is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need It
 
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
 

Reactor 3.0, a reactive foundation for java 8 and Spring

  • 1. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactor 3. 
 Reactive Foundation for Java 8 and Spring Stephane Maldini @smaldini
  • 6. Publisher Subscriber Reactive Streams
 reactive-streams.org Standard definition 0..N Data 
 + 0..1 (Error | Complete)
  • 9. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactor Core provides for a minimalist set of Reactive Streams ready 
 generators and transformers 4
  • 10. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactor Core provides for a minimalist set of Reactive Streams ready 
 generators and transformers 4 WHY ?
  • 11. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 5 DIY Reactive Streams Publisher<User> rickSanchez = userRepository.findUser(“rick”);
  • 12. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 5 DIY Reactive Streams Publisher<User> rickSanchez = userRepository.findUser(“rick”); Produce User when ready
  • 13. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 5 DIY Reactive Streams Publisher<User> rickSanchez = userRepository.findUser(“rick”); Might produce 0, 1 or N Users ! Produce User when ready
  • 14. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 5 DIY Reactive Streams Publisher<User> rickSanchez = userRepository.findUser(“rick”); Might produce 0, 1 or N Users ! Produce User when ready rickSanchez.subscribe(new Subscriber<User>(){ … });
  • 15. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 5 DIY Reactive Streams Publisher<User> rickSanchez = userRepository.findUser(“rick”); Might produce 0, 1 or N Users ! Produce User when ready Callback for start, result, error or complete rickSanchez.subscribe(new Subscriber<User>(){ … });
  • 16. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ DIY Reactive Streams 6
  • 17. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ DIY Reactive Streams 6 Can I have an API ?
  • 18. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ DIY Reactive Streams - top issues • Should Work with RS TCK • Address reentrance • Address thread safety • Address efficiency • Address state • For Many-To-One flows, implement your own merging operation • For One-To-Many lows, implement your own broadcasting operation • …. 7
  • 19. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ DIY Reactive Streams - top issues • Should Work with RS TCK • Address reentrance • Address thread safety • Address efficiency • Address state • For Many-To-One flows, implement your own merging operation • For One-To-Many lows, implement your own broadcasting operation • …. 7
  • 20. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 8
  • 21. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 3 years to mature 9 R e a c t i v e S t r e a m s C o m m o n s I P C A D D O N S S p r i n g R x C O R E 2013: 1.x 2014: 2.x 2016: 3.0
  • 22. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 3 years to mature 9 R e a c t i v e S t r e a m s C o m m o n s I P C A D D O N S S p r i n g R x C O R E Existential questions 2013: 1.x 2014: 2.x 2016: 3.0
  • 23. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 3 years to mature 9 R e a c t i v e S t r e a m s C o m m o n s I P C A D D O N S S p r i n g R x C O R E Existential questions 2013: 1.x 2014: 2.x 2016: 3.0 Microservices become the norm
  • 24. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 3 years to mature 9 R e a c t i v e S t r e a m s C o m m o n s I P C A D D O N S S p r i n g R x C O R E Existential questions 2013: 1.x 2014: 2.x 2016: 3.0 Microservices become the norm Rocky style revival
  • 25. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 3x Influences and Collaborations 10 R e a c t i v e S t r e a m s C o m m o n s I P C A D D O N S S p r i n g R x C O R E
  • 26. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 3x Influences and Collaborations 10 R e a c t i v e S t r e a m s C o m m o n s I P C A D D O N S S p r i n g R x C O R E
  • 27. Flux
  • 28. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Flux.just("red", "white", "blue")
 .flatMap(carRepository::findByColor)
 .collect(Result::new, Result::add)
 .doOnNext(Result::stop)
 .subscribe(doWithResult); A smarter Publisher ? Flux ! 12
  • 29. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Flux.just("red", "white", "blue")
 .flatMap(carRepository::findByColor)
 .collect(Result::new, Result::add)
 .doOnNext(Result::stop)
 .subscribe(doWithResult); A smarter Publisher ? Flux ! 12 interface CarRepository { Flux<Car> findByColor(String color); }
  • 30. Mono
  • 31. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Mono, push/pull CompletionStage 14 Mono.delayMillis(3000)
 .map(d -> "Spring 4")
 .or(Mono.delayMillis(2000).map(d -> "Spring 5"))
 .then(t -> Mono.just(t+ " world"))
 .elapsed()
 .block();
  • 32. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Mono, push/pull CompletionStage 14 Mono.delayMillis(3000)
 .map(d -> "Spring 4")
 .or(Mono.delayMillis(2000).map(d -> "Spring 5"))
 .then(t -> Mono.just(t+ " world"))
 .elapsed()
 .block(); Non!
  • 33. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Mono, push/pull CompletionStage 15 Mono.delayMillis(3000)
 .map(d -> "Spring 4")
 .or(Mono.delayMillis(2000).map(d -> "Spring 5"))
 .then(t -> Mono.just(t+ " world"))
 .elapsed()
 .subscribe();
  • 34. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Mono, push/pull CompletionStage 15 Mono.delayMillis(3000)
 .map(d -> "Spring 4")
 .or(Mono.delayMillis(2000).map(d -> "Spring 5"))
 .then(t -> Mono.just(t+ " world"))
 .elapsed()
 .subscribe(); Oui!
  • 35. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Non Blocking and RS types around 16 Type Semantic /Library Java 8 Reactive Streams /Java 9 RxJava1
 (java6) Reactor3
 (java8) RxJava2
 (java6) 0 or 1 result CompletableFuture<T> Publisher<T> Observable<T> Mono<T> Maybe<T> 0 or N results Publisher<T> Observable<T> Flux<T> Observable<T>
 Flowable<T> 1 result CompletableFuture<T> Publisher<T> Single<T> Mono<T> Single<T> No result CompletableFuture<Void> Publisher<Void> Completable Mono<Void> Completable *Reactive Streams types are in bold **Akka Streams is also a notable RS implementor
  • 36. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 17 3x Simpler API
  • 37. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ONE JAR
 reactor-core.jar 17 3x Simpler API
  • 38. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ONE JAR
 reactor-core.jar 17 3x Simpler API
  • 39. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ONE JAR
 reactor-core.jar 17 3x Simpler API Where Flux and Mono live
  • 40. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ONE JAR
 reactor-core.jar 17 3x Simpler API Where Flux and Mono live Make task execution great again and FIFO
  • 41. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Execution Model Freedom 18 Synchronous Asynchronous Scheduler / Scheduler.Worker
  • 42. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Execution Model Freedom 19 Publisher Subscriber
  • 43. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Execution Model Freedom 19 Publisher Subscriber Thread: MAIN Thread: MAIN
  • 44. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Execution Model Freedom 20 Publisher Subscriber +publishOn()
 Thread: Worker A Thread: Worker A
  • 45. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Execution Model Freedom 21 Publisher Subscriber Thread: Worker B +subscribeOn() Thread: Worker B
  • 46. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Execution Model Freedom 22 Publisher Subscriber +publishOn()
 Thread: Worker A +subscribeOn() Thread: Worker B
  • 47. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 3x more focus on Javadoc 23 http://projectreactor.io/core/docs/api
  • 48. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Learning to Flux & Mono 24
  • 49. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Learning to Flux & Mono 24 https://spring.io/blog/2016/06/07/notes-on- reactive-programming-part-i-the-reactive- landscape https://spring.io/blog/2016/06/13/notes-on- reactive-programming-part-ii-writing-some-code https://spring.io/blog/2016/07/20/notes-on- reactive-programming-part-iii-a-simple-http-server- application
  • 50. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Learning to Flux & Mono 24 https://spring.io/blog/2016/06/07/notes-on- reactive-programming-part-i-the-reactive- landscape https://spring.io/blog/2016/06/13/notes-on- reactive-programming-part-ii-writing-some-code https://spring.io/blog/2016/07/20/notes-on- reactive-programming-part-iii-a-simple-http-server- application Just browse spring.io/blog already
  • 51. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Bridge Existing Asynchronous Code Mono<String> response = Mono.create(sink -> {
 HttpListener listener = event -> {
 if (event.getResponseCode() >= 400) {
 sink.error(new RuntimeExeption("Failed"));
 } else {
 String body = event.getBody();
 if (body.isEmpty()) {
 sink.success();
 } else {
 sink.success(body.toLowerCase());
 }
 }
 };
 
 client.addListener(listener);
 
 emitter.setCancellation(() -> client.removeListener(listener));
 }); • 25
  • 52. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Bridge Existing Asynchronous Code Mono<String> response = Mono.create(sink -> {
 HttpListener listener = event -> {
 if (event.getResponseCode() >= 400) {
 sink.error(new RuntimeExeption("Failed"));
 } else {
 String body = event.getBody();
 if (body.isEmpty()) {
 sink.success();
 } else {
 sink.success(body.toLowerCase());
 }
 }
 };
 
 client.addListener(listener);
 
 emitter.setCancellation(() -> client.removeListener(listener));
 }); • 25 Also exists for Flux of N items
  • 53. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Debug Mode 26 215 Hooks.onOperator(op -> op.operatorStacktrace()); 216 try { 217 Mono.just(1) 218 .map(d -> { 219 throw new RuntimeException(); 220 }) 221 .filter(d -> true) 222 .timestamp() 223 .elapsed() 224 .map(d -> d) 225 .block(); 226 } 227 catch(Exception e){ 228 e.printStackTrace(); 229 } 230 finally { 231 Hooks.resetOnOperator(); 232 }
  • 54. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Debug Mode 26 215 Hooks.onOperator(op -> op.operatorStacktrace()); 216 try { 217 Mono.just(1) 218 .map(d -> { 219 throw new RuntimeException(); 220 }) 221 .filter(d -> true) 222 .timestamp() 223 .elapsed() 224 .map(d -> d) 225 .block(); 226 } 227 catch(Exception e){ 228 e.printStackTrace(); 229 } 230 finally { 231 Hooks.resetOnOperator(); 232 } Capture stack for each operator declared after
  • 55. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Debug Mode 26 215 Hooks.onOperator(op -> op.operatorStacktrace()); 216 try { 217 Mono.just(1) 218 .map(d -> { 219 throw new RuntimeException(); 220 }) 221 .filter(d -> true) 222 .timestamp() 223 .elapsed() 224 .map(d -> d) 225 .block(); 226 } 227 catch(Exception e){ 228 e.printStackTrace(); 229 } 230 finally { 231 Hooks.resetOnOperator(); 232 } Capture stack for each operator declared after Assembly trace from producer [reactor.core.publisher.MonoMapFuseable] : reactor.core.publisher.Mono.map(Mono.java:1795) reactor.HooksTest.testTrace2(HooksTest.java:218) Composition chain until failing Operator : |_ Mono.map(HooksTest.java:218) |_ Mono.filter(HooksTest.java:221) |_ Mono.timestamp(HooksTest.java:222) |_ Mono.elapsed(HooksTest.java:223) |_ Mono.map(HooksTest.java:224)
  • 56. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Create Gateways to Flux And Mono 27 EmitterProcessor<Integer> processor = EmitterProcessor.create();
 
 int n = 100_000;
 processor.publishOn(Schedulers.single())
 .subscribe(someService::handleData);
 
 BlockingSink<Integer> session = processor.connectSink();
 
 for (int i = 0; i < n; i++) {
 while (!session.emit(i).isOk()) {
 if (session.hasFailed()) {
 throw session.getError();
 } //fake throttling Thread.sleep(1);
 }
 }
 session.finish(); • EmitterProcessor
  • 57. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Create Gateways to Flux And Mono 27 EmitterProcessor<Integer> processor = EmitterProcessor.create();
 
 int n = 100_000;
 processor.publishOn(Schedulers.single())
 .subscribe(someService::handleData);
 
 BlockingSink<Integer> session = processor.connectSink();
 
 for (int i = 0; i < n; i++) {
 while (!session.emit(i).isOk()) {
 if (session.hasFailed()) {
 throw session.getError();
 } //fake throttling Thread.sleep(1);
 }
 }
 session.finish(); • EmitterProcessor Backpressure Companion
  • 58. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ EmitterProcessor<Integer> processor = EmitterProcessor.create();
 
 int n = 100_000;
 processor.publishOn(Schedulers.single())
 .subscribe(someService::handleData);
 
 BlockingSink<Integer> session = processor.connectSink();
 
 for (int i = 0; i < n; i++) {
 while (!session.emit(i).isOk()) {
 if (session.hasFailed()) {
 throw session.getError();
 } Thread.sleep(1); //fake throttling
 }
 }
 session.finish(); • Create Gateways to Flux And Mono 28 EmitterProcessor
  • 59. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Operation Fusion • Reactor has a mission to limit the overhead in stack and message passing • 2 key categories : • “Macro Fusion” : merge operators in one (assembly time) • “Micro Fusion” : avoid queue creation and short circuit where possible request lifecycle. 29
  • 60. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Starve CPU’s with ParallelFlux… 30 Flux.range(1, 100000)
 .parallel(3)
 .runOn(Schedulers.parallel())
 .collect(ArrayList::new, ArrayList::add)
 .sequential()
 .reduce(0, (a, b) -> a + b.size())
 .subscribeWith(TestSubscriber.create())
 .await(Duration.ofSeconds(5))
 .assertValues(100_000)
 .assertNoError()
 .assertComplete(); •
  • 61. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Starve CPU’s with ParallelFlux… 30 Flux.range(1, 100000)
 .parallel(3)
 .runOn(Schedulers.parallel())
 .collect(ArrayList::new, ArrayList::add)
 .sequential()
 .reduce(0, (a, b) -> a + b.size())
 .subscribeWith(TestSubscriber.create())
 .await(Duration.ofSeconds(5))
 .assertValues(100_000)
 .assertNoError()
 .assertComplete(); • x3
  • 62. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Efficient and micro bench ready 31 https://github.com/akarnokd/akarnokd-misc/tree/master/src/jmh/java/hu/akarnokd/comparison
  • 63. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Efficient and micro bench ready 31 https://github.com/akarnokd/akarnokd-misc/tree/master/src/jmh/java/hu/akarnokd/comparison
  • 64. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Efficient and micro bench ready 31 https://github.com/akarnokd/akarnokd-misc/tree/master/src/jmh/java/hu/akarnokd/comparison
  • 65. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Bridge Fabulous RxJava 32
  • 66. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Bridge Fabulous RxJava 32 RxJava1Adapter
  • 67. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Bridge Java 9 Reactive Streams 33
  • 68. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Bridge Java 9 Reactive Streams 33 JdkFlowAdapter
  • 69. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Play with Reactor Core .NET 34
  • 70. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Play with Reactor Core .NET 34 https://www.nuget.org/packages/Reactor.Core/
  • 71. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Backpressure for JS: Reactor Core TypeScript 35
  • 72. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Backpressure for JS: Reactor Core TypeScript 35 https://www.npmjs.com/package/reactor-core-js
  • 73. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ EVERYTHING REACTIVE ? 36
  • 75. Service B Message
 Broker Datastore 20 ms 50 ms 150 ms 250 ms 20 ms 15 ms 3 ms GATEWAY µ Service A
  • 76. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactor Ecosystem roadmap 39 Reactor Netty Reactor IPC Spring Framework Spring 5, 
 Spring Cloud Stream, 
 Spring Integration,
 Spring Data, 
 Spring Boot, 
 Spring Cloud, 
 Spring Security,
 … Reactor Kafka Extra add-ons
 dashboard, bus, codecs, more operations & schedulers… Reactor Redis Reactor Aeron
  • 78. Spring Web MVC @Controller, @RequestMapping Servlet API Servlet Container
  • 79. Spring Web MVC @Controller, @RequestMapping Servlet API Servlet Container Reactive Non-blocking …
  • 80. Spring Web MVC Spring Web Reactive @Controller, @RequestMapping Servlet API Servlet Container
  • 81. Spring Web MVC Spring Web Reactive @Controller, @RequestMapping Servlet API Servlet Container Reactive HTTP
  • 82. Spring Web MVC Spring Web Reactive @Controller, @RequestMapping Servlet API Servlet Container Reactive HTTP Servlet 3.1 Container
  • 83. Spring Web MVC Spring Web Reactive @Controller, @RequestMapping Servlet API Servlet Container Reactive HTTP Servlet 3.1 ContainerServlet 3.1, Netty
  • 84. Spring Web MVC Spring Web Reactive @Controller, @RequestMapping Servlet API Servlet Container Reactive HTTP Servlet 3.1 ContainerServlet 3.1, Netty, Undertow
  • 88. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 51 SpringBootApplication
 @EnableBinding(Processor.class)
 public class WordCountApplication {
 
 @StreamListener
 @Output("output")
 public Flux<WordCount> countWords(@Input("input") Flux<String> words) {
 return words.window(ofSeconds(5), ofSeconds(1))
 .flatMap(window -> window.groupBy(word -> word)
 .flatMap(group -> group.reduce(0, (counter, word) -> counter + 1)
 .map(count -> new WordCount(group.key(), count))));
 } } Spring Cloud Stream: 
 Stateful processors
  • 89. Boot Data Cloud IntegrationSecurity Reactive Efforts
  • 90. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ @ProjectReactor http://github.com/reactor http://projectreactor.io Extra Slideware: www.slideshare.net/SpringCentral/imperative-to-reactive-web-applications www.slideshare.net/SpringCentral/designing-implementing-and-using-reactive-apis http://www.slideshare.net/RobHarrop/going-reactive-63425158