Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/nurkiewicz/reactor-workshop

Spring Reactor hands-on training (3 days)
https://github.com/nurkiewicz/reactor-workshop

concurrency java reactor spring spring-boot webflux

Last synced: 3 months ago
JSON representation

Spring Reactor hands-on training (3 days)

Awesome Lists containing this project

README

        

# Reactor training

[![Java CI master](https://github.com/nurkiewicz/reactor-workshop/actions/workflows/gradle.yml/badge.svg)](https://github.com/nurkiewicz/reactor-workshop/actions/workflows/gradle.yml) [![Java CI solutions](https://github.com/nurkiewicz/reactor-workshop/actions/workflows/gradle.yml/badge.svg?branch=solutions)](https://github.com/nurkiewicz/reactor-workshop/actions/workflows/gradle.yml)

Spring [Reactor](https://projectreactor.io) hands-on training (3 days)

See also [workshop notes](https://nurkiewicz.com/slides/reactor-workshop).

## 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](https://github.com/ReactiveX/RxJava) interoperability

## Day 3: Practical
- Comparison to blocking and asynchronous servlets
- Refactoring existing application to Reactor
- [Spring Boot](https://spring.io/projects/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](https://projectreactor.io/docs/core/release/reference/)
2. [Web on Reactive Stack](https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html#spring-webflux) in [Spring Framework Documentation](https://docs.spring.io/spring/docs/current/spring-framework-reference/index.html)
3. [The "Spring WebFlux Framework"](https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-web-applications.html#boot-features-webflux) in [Spring Boot Reference Guide](https://docs.spring.io/spring-boot/docs/current/reference/html/)

## 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](https://www.testcontainers.org/features/configuration/#disabling-ryuk)

### Reusing containers in testcontainers

In `.testcontainers.properties` in your `$HOME` folder put the following line:

```
testcontainers.reuse.enable=true
```