Spring Webflux – odpowiednik Spring MVC. Wprowadzony w Spring 5. Umożliwia pisanie aplikacji w stylu reaktywnym.
Jeśli przetwarzamy dużo danych i mamy wiele użytkowników, potrzebujemy przetwarzania asynchronicznego, ponieważ wtedy aplikacje będą szybsze i wydajniejsze.
W Javie korzystanie z asynchroniczności może być kłopotliwe, ponieważ może sprawić, że kod będzie trudny do czytania i utrzymywania.
Programowanie reaktywne to rozwiązuje.
Programowanie reaktywne polega na asynchronicznym, nieblokującym przetwarzaniu danych.
Operujemy na zdarzeniach.
Jest to programowanie z asynchronicznymi strumieniami danych, ponieważ gdy tylko dane stają się dostępne, wysyłane są do klienta. Część po części. Dlatego umożliwia to programistom pisanie kodu, który może szybko i asynchronicznie reagować na te zmiany stanu, przychodzące z serwera.
Strumienie mogą emitować trzy różne zdarzenia:
- kolejna wartość
- błąd
- sygnał “zakończenia”
Zdarzenia są przechwytywane asynchronicznie, poprzez zdefiniowanie funkcji, która będzie wykonywana po wyemitowaniu zdarzenia w zależności od jego typu.
“Słuchanie” strumienia nazywa się subskrybowaniem, ponieważ definiowane przez nas funkcje tych 3 zdarzeń są obserwatorami. Strumień to obserwowany podmiot.
Publisher – odpowiada za publikowanie zebranych danych.
Subscriber – nasłuchuje czy Publisher wysyła dane i je odczytuje. Subscriber może też przekazać info do Publishera, że nie nadąża z przetwarzaniem. Może też przerwać wysyłanie.
Spring Webflux wykorzystuje Projekt Reactor (biblioteka do programowania reaktywnego). Najważniejsze elementy to Flux i Mono. DlategoWebflux opakowuje je w wygodne interfejsy. Pozwala na wykorzystanie ich w Springu.
Flux – pozwala na przetwarzanie sekwencji od zera do wielu elementów. Jest to Publisher. Mamy do dyspozycji dużo metod działających na zwykłych streamach i nie tylko. Można sprawdzić w dokumentacji: link
Mono – podobne do Flux, ponieważ zwraca uwagę, że może zostać zwrócone zero albo jeden element.
Spring Webflux i modele
Spring Webflux wspiera dwa modele:
- funkcjonalny routing i handling – tutaj więcej – link
- tworzenie komponentów reaktywnych przy pomocy adnotacji. W przykładzie poniżej.
Aby programować reaktywnie trzeba korzystać z reaktywnych narzędzi. Aby stworzyć aplikację reaktywną w Springu trzeba dodać zależność spring-boot-starter-webflux. Musimy też korzystać z reaktywnej bazy danych. Możemy użyć np. Reactive MongoDb.
Przykład z: link
Po jednej stronie serwer z reaktywną bazą.
Po drugiej stronie wywołanie endpointa z serwera, subscribe, pobieranie co minutę.
Definiujemy endpoint w stylu reaktywnym. Pobieramy jednego pracownika korzystając z reaktywnej bazy do Mono.
![]()
![]()
![]()
Endpoint. Wiele pracowników. Wykorzystujemy Flux.
![]()
![]()
![]()
Od Springa 5 WebClient jest nie blokującym klientem. Jest dostosowany do programowania reaktywnego. Tworzymy klienta.
![]()
![]()
![]()
Przy pomocy WebClienta wykonujemy zapytanie na wcześniej przygotowany endpoint na serwerze. Pobieramy jeden obiekt, dlatego Mono. Wywołujemy metodę subscribe. Umożliwia pobranie danych z serwera. Subscriber łączy się z Publisherem. Aby wyemitował dane musi być co najmniej jeden Subscriber.
Sygnatury metody subscribe
- Metoda subscribe ma kilka rodzajów sygnatur. W pełnej sygnaturze przyjmuje, co ma wykonać, gdy:
- przyjdzie kolejny element
- wystąpi błąd
- przetwarzanie zostanie zakończone
![]()
![]()
![]()
Tutaj to samo. Pobieramy całą listę pracowników. Flux.
![]()
![]()
![]()
Programowanie reaktywne podnosi złożoność kodu. Używa się tylko w określonych sytuacjach.
Tutaj video z wykorzystaniem Webfluxa: link
Źródła:
https://www.baeldung.com/spring-webflux
https://bykowski.pl/spring-webflux-programowanie-reaktywne-w-spring/



