Je sais qu'il est possible d'enchaîner Mono, par exemple, ...
Mono<String> resultAMono = loadA();
Mono<String> resultBMono = resultA.flatMap(resultA -> loadB());
Cela enchaînera et resultBMono s'exécutera lorsque resultAMono reviendra ....
Donc ma question est, est-il possible de démarrer 2 Mono en parallèle et quand les deux retours continuent 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 que cela fonctionnera en parallèle ou que puis-je faire pour fonctionner en parallèle ...
Merci pour les réponses ....
2 sémantiques, 1 façon de les faire fonctionner en parallèle
Les deux options que je présente ci-dessous nécessitent toutes deux un réglage supplémentaire pour faire fonctionner A et B Mono
en parallèle: à savoir, chaque Mono
devrait utiliser subscribeOn(Scheduler)
pour sortir du commun fil 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 Mono
complètement différent:
Mono.when(monoAwithSubscribeOn, monoBwithSubscribeOn)
.then(Mono.just("A and B finished, I don't know their value"));
Si vous vous souciez des valeurs A et B
Utilisez Zip
+ map
/flatMap
selon ce que vous voulez faire du 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 Zip
avant.
aussi, Zip
se traduira par un vide Mono
si l'un des A ou B est vide! Utilisez switchIfEmpty
/defaultIfEmpty
pour vous protéger contre ce cas.