reactor-workshop
reactor-workshop copied to clipboard
Spring Reactor hands-on training (3 days)
Reactor training
Spring Reactor hands-on training (3 days)
See also workshop notes.
Day 1: Introduction
- What is reactive programming
- Crash course to
CompletableFuture
and thread pools - Introducing Reactor
- How to create a stream?
-
just()
,generate()
,create()
,fromCallable()
,fromStream()
-
- Laziness
- Hot vs. cold
- Basic operators
-
map()
,filter()
,filterWhen()
flatMap()
,handle()
,take()
,skip()
-
doOn*()
operators -
window()
,buffer()
,distinct()
-
cast()
,ofType()
,index()
-
timestamp()
,elapsed()
-
zip()
,merge()
-
- Error handling
-
timeout()
,retry*()
,retryBackoff()
-
onError*()
-
- Blocking and reactive, back and forth
- Concurrency with blocking code and thread pools
-
subscribeOn()
,parallel()
-
- Unit testing
Day 2: Reactor advanced
- Concurrency with non-blocking code
- Advanced error handling and retries
-
transform()
vs.transformDeferred()
- Advanced operators
-
groupBy()
,window()
-
reduce()
,scan()
-
expand*()
-
- Backpressure
-
onBackpressure*()
-
-
Processor
API-
Unicast
,Emitter
,Replay
-
- Advanced testing with virtual time
-
Context
- Speculative execution example
- RxJava interoperability
Day 3: Practical
- Comparison to blocking and asynchronous servlets
- Refactoring existing application to Reactor
-
Spring Boot
- Reactive database access
- Reactive controllers
-
WebFilter
- Global error handling
- Payload validation
- Web sockets
- Streaming data in and out
- Troubleshooting and debugging
-
checkpoint()
,onOperatorDebug()
,doOn*()
-
Reference materials
- Reactor 3 Reference Guide
- Web on Reactive Stack in Spring Framework Documentation
- The "Spring WebFlux Framework" in Spring Boot Reference Guide
Troubleshooting, tips and tricks
IntelliJ test runner
In IntelliJ it's much faster to run tests directly, rather than through Gradle.
Go to Preferences
-> Build, Execution, Deployment
-> Build Tools
-> Gradle
and select IntelliJ IDEA
from Run Tests Using
drop-down.
Error Can not connect to Ryuk at localhost:...
Add this environment variable:
TESTCONTAINERS_RYUK_DISABLED=true
See: Disabling Ryuk
Reusing containers in testcontainers
In .testcontainers.properties
in your $HOME
folder put the following line:
testcontainers.reuse.enable=true