web-dev-qa-db-fra.com

Est-il possible de démarrer Mono en parallèle et d'agréger le résultat

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 ....

12
posthumecaver

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.

12
Simon Baslé