Reactive方法搭配flatMap仍返回不一致结果如何解决?
问题根因
你遇到的时灵时不灵的问题核心是响应式异步执行的时序不匹配:
subscribe()触发的响应式流执行是异步非阻塞的,不会阻塞当前调用线程generateComplianceResponse是void返回类型,调用后会直接返回,不会等待内部flatMap里的setCountry赋值逻辑执行完成- 上层
createComplianceResponseMono在调用完方法后直接返回BOLCompliance对象时,赋值逻辑可能还没执行,就会出现country字段偶尔为空的情况
解决方案(不修改任何方法签名)
直接把generateComplianceResponse方法末尾的subscribe()替换为block()即可,block()会阻塞等待响应式流执行完成,保证setCountry逻辑执行结束后方法才会返回,完全避免时序问题:
private void generateComplianceResponse(BOLCompliance complianceResponse) { // locationsMap().subscribe(); locationsMap().flatMap(entry -> { Set<java.util.Map.Entry<String, String>> set = entry.entrySet(); set.forEach(e -> { if (complianceResponse.getCompliancePort().substring(0, 2).equalsIgnoreCase(e.getKey())) { complianceResponse.setCountry(e.getValue()); } }); return Mono.just(complianceResponse); }).block(); // 替换原有的subscribe() }
注意事项
如果你的代码运行在响应式非阻塞线程池(比如Netty EventLoop线程)中,阻塞操作会触发线程警告,这种场景下建议后续调整方法返回值为Mono<Void>,把赋值逻辑串联到上层的响应式流中,完全避免阻塞操作,更符合响应式编程规范。
另外你给出的代码中,createComplianceResponseMono调用generateComplianceResponse时传入了两个参数,但你贴出的方法定义只有一个入参,属于笔误,实际开发时注意匹配参数即可。
内容的提问来源于stack exchange,提问作者Mira Devi
相关产品推荐
相关产品推荐

