Résumé
Dans Reactor, rien ne s’exécute avant l’abonnement: une chaîne est d’abord assemblée, puis exécutée quand quelqu’un s’y abonne. Mono.just fait exception sans le dire. Il reçoit une valeur, et Java évalue les arguments avant d’appeler la méthode: le calcul a déjà eu lieu, au moment de l’assemblage, sur le thread appelant.
L’article montre ce que ce calcul anticipé casse en production. Une exception levée à l’assemblage ne devient jamais un signal, si bien que onErrorResume ne la voit pas. Un appel bloquant placé dans Mono.just s’exécute sur la boucle d’événements, même suivi de subscribeOn. Un retry se réabonne à la même valeur capturée et ne rappelle jamais la méthode: un jeton expiré est renvoyé trois fois de plus.
Les remèdes tiennent en trois points: deux fabriques, Mono.fromCallable pour une valeur à calculer et Mono.defer pour un publisher à construire; une règle pour les contrôleurs, qui rendent le publisher sans jamais appeler subscribe; deux tests StepVerifier, dont l’un, avec un compteur, prouve que rien ne s’exécute avant l’abonnement.
Idées clés
- Une chaîne Reactor connaît deux moments, l’assemblage puis l’abonnement; la valeur passée à Mono.just est calculée dès le premier, avant que Reactor n’intervienne.
- Le calcul anticipé neutralise la gestion d’erreurs, laisse un appel bloquant sur la boucle d’événements et rend retry inutile, puisque chaque tentative rejoue la même valeur.
- Mono.fromCallable diffère le calcul d’une valeur, Mono.defer la construction d’un publisher; les replis de switchIfEmpty et onErrorResume doivent eux aussi attendre l’abonnement, sinon ils s’exécutent à chaque appel.
- Un contrôleur WebFlux rend son publisher et laisse le framework s’abonner; un test avec un compteur prouve que rien ne s’exécute avant l’abonnement.