Перейти к основному содержимому

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

· 2 мин. чтения

1. Обзор

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

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

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

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

Начнем с примера издателя Mono<String> :

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

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<String> .

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