Search code examples
javaspring-webfluxreactive-programmingproject-reactor

Execute Monos sequentially/parallel


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


Solution

  • 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.