Enregistrement d’une séquence réactive

Enregistrer une séquence réactive

1. Vue d'ensemble

Avec l'introduction deSpring WebFlux, nous avons obtenu un autre outil puissant pour écrire des applications réactives et non bloquantes. Bien que l'utilisation de cette technologie soit maintenant beaucoup plus facile qu'avant,debugging reactive sequences in Spring WebFlux can be quite cumbersome.

Dans ce rapide didacticiel, nous verrons comment consigner facilement des événements dans des séquences asynchrones et comment éviter certaines erreurs simples.

2. Dépendance Maven

Ajoutons la dépendance Spring WebFlux à notre projet afin que nous puissions créer des flux réactifs:


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

Nous pouvons obtenir la dernière dépendancespring-boot-starter-webflux de Maven Central.

3. Créer un flux réactif

Pour commencer, créons un flux réactif en utilisantFlux et utilisons la méthodelog() pour activer la journalisation:

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

Ensuite, nous y souscrirons pour consommer les valeurs générées:

reactiveStream.subscribe();

4. Journalisation du flux réactif

Après avoir exécuté l'application ci-dessus, nous voyons notre enregistreur en action:

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

Nous voyons tous les événements qui se sont produits sur notre flux. Cinq valeurs ont été émises, puis le flux fermé avec un événementonComplete().

5. Scénario de journalisation avancé

Nous pouvons modifier notre application pour voir un scénario plus intéressant. Ajoutonstake() àFlux pour indiquer au flux de ne fournir qu’un nombre spécifique d’événements:

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

Après avoir exécuté le code, nous verrons le résultat suivant:

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

Comme nous pouvons le voir,take() a provoqué l'annulation du flux après l'émission de trois événements.

The placement of log() in your stream is crucial. Voyons comment placerlog() aprèstake() produira une sortie différente:

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

Et la sortie:

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

Comme nous pouvons le voir, changer le point d'observation a changé la sortie. Maintenant, le flux a produit trois événements, mais au lieu decancel(),, nous voyonsonComplete(). This is because we observe the output of using take() instead of what was requested by this method.

6. Conclusion

Dans cet article rapide, nous avons vu comment consigner des flux réactifs à l'aide de la méthodelog() intégrée.

Et comme toujours, le code source de l'exemple ci-dessus peut être trouvéover on GitHub.