Spring Reactor hands-on training (3 days)
See also workshop notes.
Day 1: Introduction
- What is reactive programming
- Crash course to
CompletableFutureand 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*()
ProcessorAPIUnicast,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