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.