«1. Обзор

В нашем введении в Project Reactor мы узнали о Mono\u003cT\u003e, который является публикатором экземпляра типа T.

В этом кратком руководстве мы покажем как блокирующий, так и неблокирующий -блокирующий способ извлечения T из Mono: заблокировать и подписаться.

2. Способ блокировки

В общем, Mono успешно завершается, испуская элемент в некоторый момент времени.

Начнем с примера издателя Mono\u003cString\u003e:

Mono<String> blockingHelloWorld() {
    return Mono.just("Hello world!");
}

String result = blockingHelloWorld().block();
assertEquals("Hello world!", result);

Здесь мы блокируем выполнение до тех пор, пока издатель не выдает значение. Тем не менее, это может занять любое количество времени, чтобы закончить.

Чтобы получить больше контроля, давайте установим явную продолжительность:

String result = blockingHelloWorld().block(Duration.of(1000, ChronoUnit.MILLIS));
assertEquals(expected, result);

Если издатель не выдает значение в течение установленной продолжительности, генерируется исключение RuntimeException.

Кроме того, Mono может быть пустым, и приведенный выше метод block() вернет null. Вместо этого мы можем использовать blockOptional в этом случае:

Optional<String> result = Mono.<String>empty().blockOptional();
assertEquals(Optional.empty(), result);

В общем, блокировка противоречит принципам реактивного программирования. Крайне не рекомендуется блокировать выполнение в реактивных приложениях.

Итак, теперь давайте посмотрим, как получить значение неблокирующим способом.

3. Неблокирующий способ

Прежде всего, мы должны подписаться неблокирующим способом, используя метод subscribe(). Кроме того, мы укажем потребителя конечного значения:

blockingHelloWorld()
  .subscribe(result -> assertEquals(expected, result));

Здесь, даже если для создания значения требуется некоторое время, выполнение немедленно продолжается без блокировки на вызове subscribe().

В некоторых случаях мы хотим использовать значение на промежуточных этапах. Поэтому мы можем использовать оператор для добавления поведения:

blockingHelloWorld()
  .doOnNext(result -> assertEquals(expected, result))
  .subscribe();

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

В этой короткой статье мы рассмотрели два способа использования значения, созданного Mono\u003cString\u003e.

Как всегда, пример кода можно найти на GitHub.