Рубрики
Без рубрики

Как извлечь содержимое Моно в Java

Узнайте, как подписаться или заблокировать опубликованное значение Mono.

Автор оригинала: baeldung.

1. Обзор

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

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

2. Блокирующий Путь

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

Давайте начнем с примера издателя Mono :

Mono 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 . Вместо этого мы можем использовать block Optional в этом случае:

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

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

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

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

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

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

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

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

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

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

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

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