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

Java Reactor中Mono.zip操作异常:testMono3未执行问题求助

问题根源

你代码里的核心问题是**Mono.zip的使用逻辑不符合你的场景**:

  • Mono.zip的规则是必须等所有参与合并的Mono都发出至少一个元素,才会把这些元素组合成Tuple并往下传递。
  • 但你的testMono1()返回的是Mono<Void>——它只会发送「完成信号」,不会发射任何实际元素。这就导致zip一直卡在等待状态,永远不会触发后续的flatMap,连testMono3()都不会被订阅执行,所以test3和test flatmap都不会打印。

另外,取消subscribe()注释后会打印两次test1,是因为Mono是冷序列——每次调用block()或subscribe()都会重新跑一遍整个流的逻辑,你先调用了test.block(),又调用test.subscribe(),所以testMono1()被执行了两次。

解决办法

根据你的需求,有两种实用的调整方式:

方式一:让testMono1()发出元素,适配Mono.zip

如果需要保留Mono.zip来组合结果,把testMono1()改成能发出一个占位元素的Mono,这样zip就能正常触发:

public Mono<Boolean> testMono1() {
    return Mono.fromRunnable(() -> {
                   System.out.println("test1");
               })
               .thenReturn(true); // 发送一个占位元素,让zip能捕获到
}

方式二:改用Mono.when(仅需并行执行,无需组合元素)

如果只是要并行执行两个任务,最终拿到testMono3()的结果,用Mono.when更合适——它只要求所有Mono完成,不强制它们发出元素:

@Test
public void just() throws InterruptedException {
    // 先缓存testMono3的结果,避免重复执行
    Mono<Boolean> mono3Result = testMono3().cache();
    Mono<Boolean> test = Mono.when(testMono1(), mono3Result)
                             .then(mono3Result);
    
    test.block();
}

内容的提问来源于stack exchange,提问作者himanshu sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 07:31:38