如何并行执行两个Mono并单独处理,规避Mono.zip空值问题?
解决方案
要实现两个Mono并行执行且各自独立处理(即使其中一个未发射数据),核心思路是先为每个Mono单独配置处理逻辑,再用不强制要求所有源发射数据的合并操作符来并行执行。
步骤1:为每个Mono添加独立处理逻辑
先给mono1和mono2分别加上doOnNext,确保各自发射数据时能触发对应的处理逻辑,互不影响:
var mono1 = client.findId(nameClient) .subscribeOn(Schedulers.boundedElastic()) .doOnNext(clientId -> { // 此处编写mono1发射数据时的处理逻辑 // 比如保存clientId、打印日志等 System.out.println("已获取并处理客户端ID: " + clientId); }); var mono2 = shop.findId(nameShop) .subscribeOn(Schedulers.boundedElastic()) .doOnNext(shopId -> { // 此处编写mono2发射数据时的处理逻辑 System.out.println("已获取并处理店铺ID: " + shopId); });
如果需要处理Mono未发射数据的场景(比如没找到对应ID时的默认操作),可以搭配switchIfEmpty扩展逻辑:
var mono1 = client.findId(nameClient) .subscribeOn(Schedulers.boundedElastic()) .doOnNext(clientId -> { System.out.println("已获取并处理客户端ID: " + clientId); }) .switchIfEmpty(Mono.defer(() -> { // 当mono1无数据时执行的逻辑 System.out.println("未找到对应客户端ID"); return Mono.empty(); }));
步骤2:并行执行并等待完成
使用Mono.when来并行执行两个Mono,它会等待所有传入的Mono完成(不管是否发射数据),完美适配你的需求:
// 并行执行两个Mono,等待两者都完成(任一Mono为空不影响整体执行) var result = Mono.when(mono1, mono2);
为什么不用Mono.zip?
Mono.zip要求所有源Mono都必须发射数据才会触发合并逻辑,只要有一个Mono为空(未发射数据),整个zip操作就不会执行,这就是它不适合你场景的原因。而Mono.when只关注Mono是否完成,不强制要求发射数据,因此能满足你“即使任一Mono未发射数据,仍需完成相应处理”的需求。
内容的提问来源于stack exchange,提问作者fernando1979
相关产品推荐
相关产品推荐

