10 votes

Est-il possible de lancer des Mono's en parallèle et d'agréger les résultats ?

Je sais qu'il est possible de chaîner des Mono, par exemple...

Mono<String> resultAMono = loadA();
Mono<String> resultBMono = resultA.flatMap(resultA -> loadB());

Ceci s'enchaînera et resultBMono s'exécutera lorsque resultAMono reviendra.....

Ma question est donc la suivante : est-il possible de lancer 2 Mono en parallèle et, lorsque les deux reviennent, de continuer avec un autre Mono ?

Je pense que ça ressemblera à quelque chose comme ça...

Mono<String> resultAMono = loadA();
Mono<String> resuktBMono = loadB();
Mono<Tuple2<Stirng, String> tupleMono = Mono.zip(resultAMono, resultBMono);

mais je n'ai aucune idée de ce qui va fonctionner en parallèle ou de ce que je peux faire pour fonctionner en parallèle...

Merci pour les réponses....

12voto

Simon Baslé Points 388

2 sémantiques, 1 moyen de les faire fonctionner en parallèle

Les deux options que je présente ci-dessous nécessitent toutes deux quelques ajustements supplémentaires pour rendre A et B Mono fonctionnent en parallèle : à savoir, chaque Mono devrait utiliser subscribeOn(Scheduler) pour sortir du fil conducteur d'où ils sont fusionnés.

Si vous ne vous souciez que de l'achèvement de A et B

Utilisez when pour écouter l'achèvement de A et B et then pour continuer avec un tout autre Mono :

Mono.when(monoAwithSubscribeOn, monoBwithSubscribeOn)
    .then(Mono.just("A and B finished, I don't know their value"));

Si vous tenez aux valeurs A et B

Utilisez zip + map / flatMap en fonction de ce que vous voulez faire avec le résultat.

Mono.zip(monoAwithSubscribeOn, monoBwithSubscribeOn)
    .map(tuple2 -> new Foo(tuple2.getT1(), tuple2.getT2(), "bar");

ou

Mono.zip(monoAwithSubscribeOn, monoBwithSubscribeOn)
    .flatMap(tuple2 -> fetchMoreDataAsMono(tuple2.getT1(), tuple2.getT2()));

then ignorera les données précédentes, donc cela n'aurait pas beaucoup de sens d'utiliser la fonction zip avant elle.

également, zip se traduira par un vide Mono si l'un de A ou B est vide ! Utilisez switchIfEmpty / defaultIfEmpty pour se protéger contre ce cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X