是否可以并行启动 Mono 并汇总结果

Is it possible to start Mono's in parallel and aggregate the result

我知道可以链接 Mono,例如,...

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

这将链接并且 resultBMono 将 运行 当 resultAMono returns...

所以我的问题是,是否可以并行启动 2 个 Mono,并且当两个 returns 继续使用另一个 Mono 时?

我认为它看起来像这样...

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

但我不知道这会 运行 并行,或者我可以对 运行 并行做什么...

感谢解答....

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 没有多大意义。

此外,如果 A 或 B 之一为空,zip 将导致 Mono 使用 switchIfEmpty/defaultIfEmpty 来防止这种情况。