我知道可以链接Mono's,例如......
Mono<String> resultAMono = loadA();
Mono<String> resultBMono = resultA.flatMap(resultA -> loadB());
这将链和resultBMono将在resultAMono返回....
时运行所以我的问题是,是否有可能并行启动2个Mono并且当两个Mono都继续使用另一个Mono时?
我认为它看起来像这样......
Mono<String> resultAMono = loadA();
Mono<String> resuktBMono = loadB();
Mono<Tuple2<Stirng, String> tupleMono = Mono.zip(resultAMono, resultBMono);
但我不知道这将并行运行,或者我可以做什么来并行运行......
获得答案......
答案 0 :(得分:4)
2种语义,1种使它们并行运行的方法
我在下面提到的两个选项都需要一些额外的调整才能使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
来防范此情况。