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
相关产品推荐
相关产品推荐

