是否可以并行启动 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
来防止这种情况。
我知道可以链接 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
来防止这种情况。