リアクティブシーケンスのログ
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のにあります。