You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何并行执行两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 02:10:09