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

在Reactor中如何正确使用Mono内容 解决subscribe取值偶发null问题

根本原因

你遇到的偶发null是响应式编程的异步非阻塞特性导致的:Mono 表示0/1个元素的异步流,调用subscribe()之后只会立刻触发流的执行,不会等待异步API返回结果、也不会等待回调逻辑执行。如果在subscribe()之后立刻访问complianceResponse的deadlineTimestamp字段,此时回调大概率还没被触发,字段自然是null;只有异步请求返回速度刚好快于你访问字段的速度时,才能拿到有效值。


解决方案

根据你的业务场景二选一即可:

场景1:项目整体为响应式架构

不要主动调用subscribe(),也不要提前实例化POJO单独赋值,把POJO的生成逻辑嵌入响应式流中,后续需要使用BOLCompliance的逻辑直接基于返回的Mono流处理即可:

Mono<BOLCompliance> complianceResponseMono = portCallServiceCaller.getDeadlineTSByComplianceId(compliance.getId())
        .map(deadlineTS -> {
            BOLCompliance complianceResponse = new BOLCompliance();
            complianceResponse.setDeadlineTimestamp(deadlineTS);
            // 其他字段赋值逻辑可放在此处
            return complianceResponse;
        });
// 后续使用BOLCompliance时直接通过flatMap/doOnNext等操作符处理流即可,不要单独subscribe

场景2:需要对接非响应式代码、必须拿到同步的POJO实例

使用block()方法主动阻塞等待异步结果返回,再执行赋值:

// block()会阻塞当前线程,直到Mono返回结果或抛出超时异常
String deadlineTS = portCallServiceCaller.getDeadlineTSByComplianceId(compliance.getId())
        .block();
BOLCompliance complianceResponse = new BOLCompliance();
complianceResponse.setDeadlineTimestamp(deadlineTS);

注意:block()不能在响应式IO线程(如Netty的EventLoop线程)中调用,否则会抛出线程阻塞异常,仅可在普通业务线程中使用。


内容的提问来源于stack exchange,提问作者Mira Devi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:24:02