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

时间:2018-01-09 16:27:20

标签: project-reactor spring-webflux

我知道可以链接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);

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

获得答案......

1 个答案:

答案 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来防范此情况。