I have this situation:
Mono<List<String>> resultAMono = listA();
Mono<Void> resultBMono = loadB(resultAMono.block());
Mono<Void> resultCMono = loadC();
I want to execute resultAMono sequentially, and the resultBMono and resultCMono parallelly, because resultBMono depends of the result of resultAMono
You don't need to block
here. In reactive you need to build a flow combining different operators
Mono<Void> res = resultAMono
.flatMap(a -> Flux.merge(loadB(a), loadC()).then());
We are using Flux.merge
here because both loadB
& loadC
return Mono<Void>
and we don't need results.
In case results are needed Mono<B> loadB(A a)
& Mono<C> loadC()
we can use Mono.zip
to resolve publishers in parallel.
Mono<Tuple2<B, C>> res = resultAMono
.flatMap(a -> Mono.zip(loadB(a), loadC()));
Both Flux.merge
& Mono.zip
subscribes to publishers eagerly.