1. 概要

私たちの中で Project Reactorの紹介、 私たちはについて学びました単核症 タイプのインスタンスの発行者です T

このクイックチュートリアルでは、MonoからTを抽出するためのブロッキングと非ブロッキングの両方の方法を示します:ブロックサブスクライブ

2. ブロッキングウェイ

一般に、 Mono は、ある時点で要素を放出することによって正常に完了します。

サンプルパブリッシャーから始めましょう単核症

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<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. 結論

この短い記事では、によって生み出された価値を消費する2つの方法を探求しました単核症

いつものように、コード例はGitHubにあります。