反応性シーケンスのログ記録

リアクティブシーケンスのログ記録

1. 概要

Spring WebFluxの導入により、リアクティブで非ブロッキングのアプリケーションを作成するためのもう1つの強力なツールが手に入りました。 このテクノロジーの使用は以前よりもはるかに簡単になりましたが、debugging reactive sequences in Spring WebFlux can be quite cumbersomeです。

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

2. メーベン依存

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


    org.springframework.boot
    spring-boot-starter-webflux

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

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

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

Flux 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 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つのイベントが発行された後にストリームがキャンセルされました。

The placement of log() in your stream is crucialtake()の後にlog()を配置すると、どのように異なる出力が生成されるかを見てみましょう。

Flux 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()が表示されます。 This is because we observe the output of using take() instead of what was requested by this method.

6. 結論

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

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