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*()
operatorswindow()
,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
APIUnicast
,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.
Can not connect to Ryuk at localhost:...
Error 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