私はモノのチェインが可能であることを知っています、例えば、...
Mono<String> resultAMono = loadA();
Mono<String> resultBMono = resultA.flatMap(resultA -> loadB());
これは連鎖し、resultAMonoが戻るとresultBMonoが実行されます。
だから私の質問は、2つのMonoを同時に開始することは可能であり、両方のリターンが別のMonoで継続するのですか?
こんな感じになると思います...
Mono<String> resultAMono = loadA();
Mono<String> resuktBMono = loadB();
Mono<Tuple2<Stirng, String> tupleMono = Mono.Zip(resultAMono, resultBMono);
しかし、これが並列で実行されるかどうか、または並列で実行するために何ができるかわかりません...
Thx for answer ....
2つのセマンティクス、それらを並列に実行する1つの方法
以下に示す2つのオプションはどちらも、AとBのMono
を並行して実行するためにいくつかの追加の調整が必要です。つまり、各Mono
はsubscribeOn(Scheduler)
を使用して、マージされた場所から共通のスレッドから抜け出す必要があります。
AとBの完成だけを気にするなら
when
を使用してAとBの完了をリッスンし、then
を使用して完全に異なるMono
を続行します。
Mono.when(monoAwithSubscribeOn, monoBwithSubscribeOn)
.then(Mono.just("A and B finished, I don't know their value"));
AとBの値が気になる場合
結果の処理方法に応じて、Zip
+ map
/flatMap
を使用します。
Mono.Zip(monoAwithSubscribeOn, monoBwithSubscribeOn)
.map(Tuple2 -> new Foo(Tuple2.getT1(), Tuple2.getT2(), "bar");
または
Mono.Zip(monoAwithSubscribeOn, monoBwithSubscribeOn)
.flatMap(Tuple2 -> fetchMoreDataAsMono(Tuple2.getT1(), Tuple2.getT2()));
then
は前のデータを無視するため、その前にZip
を使用してもあまり意味がありません。
また、Zip
は、emptyMono
になります(AまたはBのいずれかが空の場合)!switchIfEmpty
を使用します/ defaultIfEmpty
を使用して、このようなケースから保護します。