Skip to content

nurkiewicz/reactor-workshop

Repository files navigation

Reactor training

Java CI master Java CI solutions

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

  1. Reactor 3 Reference Guide
  2. Web on Reactive Stack in Spring Framework Documentation
  3. 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