web-dev-qa-db-ja.com

Monoを並行して起動して結果を集約することは可能ですか?

私はモノのチェインが可能であることを知っています、例えば、...

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

12
posthumecaver

2つのセマンティクス、それらを並列に実行する1つの方法

以下に示す2つのオプションはどちらも、AとBのMonoを並行して実行するためにいくつかの追加の調整が必要です。つまり、各MonosubscribeOn(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を使用して、このようなケースから保護します。

12
Simon Baslé