Protokollieren einer reaktiven Sequenz

Protokollierung einer reaktiven Sequenz

1. Überblick

Mit der Einführung vonSpring WebFlux haben wir ein weiteres leistungsstarkes Tool zum Schreiben reaktiver, nicht blockierender Anwendungen erhalten. Während die Verwendung dieser Technologie jetzt viel einfacher ist als zuvor,debugging reactive sequences in Spring WebFlux can be quite cumbersome.

In diesem kurzen Tutorial erfahren Sie, wie Sie Ereignisse einfach in asynchronen Sequenzen protokollieren und einfache Fehler vermeiden können.

2. Maven-Abhängigkeit

Fügen wir unserem Projekt die Spring WebFlux-Abhängigkeit hinzu, damit wir reaktive Streams erstellen können:


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

Wir können die neuestenspring-boot-starter-webflux-abhängigkeiten von Maven Central erhalten.

3. Erstellen eines reaktiven Streams

Zunächst erstellen wir einen reaktiven Stream mitFlux und verwenden dielog() -Smethod, um die Protokollierung zu aktivieren:

Flux reactiveStream = Flux.range(1, 5).log();

Als Nächstes abonnieren wir es, um generierte Werte zu konsumieren:

reactiveStream.subscribe();

4. Reaktiven Stream protokollieren

Nach dem Ausführen der obigen Anwendung sehen wir unseren Logger in Aktion:

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

Wir sehen jedes Ereignis, das in unserem Stream aufgetreten ist. Es wurden fünf Werte ausgegeben und dann der Stream mit einemonComplete()-Ereignis geschlossen.

5. Erweitertes Protokollierungsszenario

Wir können unsere Anwendung ändern, um ein interessanteres Szenario zu sehen. Fügen wirtake() zuFlux hinzu, wodurch der Stream angewiesen wird, nur eine bestimmte Anzahl von Ereignissen bereitzustellen:

Flux reactiveStream = Flux.range(1, 5).log().take(3);

Nach dem Ausführen des Codes wird die folgende Ausgabe angezeigt:

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

Wie wir sehen können, hattake() dazu geführt, dass der Stream nach drei Ereignissen abgebrochen wurde.

The placement of log() in your stream is crucial. Mal sehen, wie das Platzieren vonlog() nachtake() zu unterschiedlichen Ergebnissen führt:

Flux reactiveStream = Flux.range(1, 5).take(3).log();

Und die Ausgabe:

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

Wie wir sehen können, hat sich die Ausgabe geändert, wenn sich der Beobachtungspunkt ändert. Jetzt hat der Stream drei Ereignisse erzeugt, aber anstelle voncancel(), sehen wironComplete(). This is because we observe the output of using take() instead of what was requested by this method.

6. Fazit

In diesem kurzen Artikel haben wir gesehen, wie reaktive Streams mit der integriertenlog()-Methode protokolliert werden.

Und wie immer kann der Quellcode für das obige Beispielover on GitHub gefunden werden.