1. 概要

Spring WebFlux の導入により、リアクティブで非ブロッキングのアプリケーションを作成するためのもう1つの強力なツールが手に入りました。 このテクノロジーの使用は以前よりもはるかに簡単になりましたが、SpringWebFluxでのリアクティブシーケンスのデバッグは非常に面倒な場合があります

このクイックチュートリアルでは、非同期シーケンスでイベントを簡単にログに記録する方法と、いくつかの単純な間違いを回避する方法を説明します。

2. Mavenの依存関係

Spring WebFlux依存関係をプロジェクトに追加して、リアクティブストリームを作成できるようにします。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

MavenCentralから最新のspring-boot-starter-webflux依存関係を取得できます。

3. リアクティブストリームの作成

まず、 Flux を使用してリアクティブストリームを作成し、 log()メソッドを使用してロギングを有効にします。

Flux<Integer> 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()

ストリームで発生したすべてのイベントが表示されます。 5つの値が発行され、 onComplete()イベントでストリームが閉じられました。

5. 高度なロギングシナリオ

アプリケーションを変更して、より興味深いシナリオを確認できます。 take() Flux に追加して、特定の数のイベントのみを提供するようにストリームに指示します。

Flux<Integer> 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()により、3つのイベントが発生した後、ストリームがキャンセルされました。

ストリーム内のlog()の配置は重要です take()の後に log()を配置すると、どのように異なる出力が生成されるかを見てみましょう。

Flux<Integer> 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()

ご覧のとおり、観測点を変更すると出力が変更されました。 これで、ストリームは3つのイベントを生成しましたが、 cancel()、の代わりに、 onComplete()が表示されます。 これは、このメソッドによって要求されたものの代わりにtake()を使用した結果を観察するためです。

6. 結論

このクイック記事では、組み込みの log()メソッドを使用してリアクティブストリームをログに記録する方法を説明しました。

そしていつものように、上記の例のソースコードはGitHubにあります。