Регистрация реактивной последовательности

Регистрация реактивной последовательности

1. обзор

С введениемSpring WebFlux мы получили еще один мощный инструмент для написания реактивных неблокирующих приложений. Хотя использовать эту технологию теперь намного проще, чем раньше,debugging reactive sequences in Spring WebFlux can be quite cumbersome.

В этом кратком руководстве мы увидим, как легко регистрировать события в асинхронной последовательности и как избежать некоторых простых ошибок.

2. Maven Dependency

Давайте добавим в наш проект зависимость Spring WebFlux, чтобы мы могли создавать реактивные потоки:


    org.springframework.boot
    spring-boot-starter-webflux

Мы можем получить последнюю зависимостьspring-boot-starter-webflux от Maven Central.

3. Создание реактивного потока

Для начала создадим реактивный поток, используяFlux, и воспользуемся методомlog() , чтобы включить ведение журнала:

Flux reactiveStream = Flux.range(1, 5).log();

Далее мы подпишемся на него, чтобы использовать сгенерированные значения:

reactiveStream.subscribe();

4. Регистрация реактивного потока

После запуска вышеуказанного приложения мы видим наш регистратор в действии:

2018-11-11 22:37:04 INFO | onSubscribe([Synchronous Fuseable] FluxRange.RangeSubscription)
2018-11-11 22:37:04 INFO | request(unbounded)
2018-11-11 22:37:04 INFO | onNext(1)
2018-11-11 22:37:04 INFO | onNext(2)
2018-11-11 22:37:04 INFO | onNext(3)
2018-11-11 22:37:04 INFO | onNext(4)
2018-11-11 22:37:04 INFO | onNext(5)
2018-11-11 22:37:04 INFO | onComplete()

Мы видим каждое событие, которое произошло в нашем потоке. Было отправлено пять значений, а затем поток был закрыт с событиемonComplete().

5. Расширенный сценарий ведения журнала

Мы можем изменить наше приложение, чтобы увидеть более интересный сценарий. Давайте добавимtake() кFlux, что даст указание потоку предоставлять только определенное количество событий:

Flux reactiveStream = Flux.range(1, 5).log().take(3);

После выполнения кода мы увидим следующий результат:

2018-11-11 22:45:35 INFO | onSubscribe([Synchronous Fuseable] FluxRange.RangeSubscription)
2018-11-11 22:45:35 INFO | request(unbounded)
2018-11-11 22:45:35 INFO | onNext(1)
2018-11-11 22:45:35 INFO | onNext(2)
2018-11-11 22:45:35 INFO | onNext(3)
2018-11-11 22:45:35 INFO | cancel()

Как мы видим,take() привел к отмене потока после выдачи трех событий.

The placement of log() in your stream is crucial. Давайте посмотрим, как размещениеlog() послеtake() даст другой результат:

Flux reactiveStream = Flux.range(1, 5).take(3).log();

И вывод:

2018-11-11 22:49:23 INFO | onSubscribe([Fuseable] FluxTake.TakeFuseableSubscriber)
2018-11-11 22:49:23 INFO | request(unbounded)
2018-11-11 22:49:23 INFO | onNext(1)
2018-11-11 22:49:23 INFO | onNext(2)
2018-11-11 22:49:23 INFO | onNext(3)
2018-11-11 22:49:23 INFO | onComplete()

Как мы видим, изменение точки наблюдения изменило результат. Теперь поток произвел три события, но вместоcancel(), мы видимonComplete(). This is because we observe the output of using take() instead of what was requested by this method.

6. Заключение

В этой быстрой статье мы увидели, как регистрировать реактивные потоки с помощью встроенного методаlog().

И, как всегда, исходный код для приведенного выше примера можно найтиover on GitHub.