2 semantics, 1 way to make them run in parallel
The two options I present below both need some additional tuning to make A and B Mono run in parallel: namely, each Mono should use subscribeOn(Scheduler) to get out of the common thread from where they’re merged.
If you only care about the completion of A and B
Use when to listen for A and B completion and then to continue with a completely different Mono:
Mono.when(monoAwithSubscribeOn, monoBwithSubscribeOn)
.then(Mono.just("A and B finished, I don't know their value"));
If you care about A and B values
Use zip + map/flatMap depending on what you want to do with the result.
Mono.zip(monoAwithSubscribeOn, monoBwithSubscribeOn)
.map(tuple2 -> new Foo(tuple2.getT1(), tuple2.getT2(), "bar");
or
Mono.zip(monoAwithSubscribeOn, monoBwithSubscribeOn)
.flatMap(tuple2 -> fetchMoreDataAsMono(tuple2.getT1(), tuple2.getT2()));
then will ignore the previous data, so it wouldn’t make much sense to use zip before it.
also, zip will result in an empty Mono if one of A or B is empty!
Use switchIfEmpty/defaultIfEmpty to protect against that case.