如何在Reactor中调用非响应式参数方法且避免使用block()
问题描述
我的代码实现如下:
protected Flux<ProspectContact> transformAndCallUpdateAPI(String eventHubMessage) { Mono.justOrEmpty(eventHubMessage) .map(this::parser) .map(this::parseToRequest) // 这个方法返回 Mono<ServiceRequest<ModelClass>> .map(updateMethod) // 这个方法的定义是 public Prospect updateProspectByContact(ServiceRequest<ModelClass> test) ); }
我遇到的问题是:updateProspectByContact方法需要接收ServiceRequest<ModelClass>类型的参数,但map(this::parseToRequest)返回的是Mono<ServiceRequest<ModelClass>>,直接用map会导致类型不匹配。我不想用block(),因为会影响性能,试过几种提取对象的方法都没成功,该怎么处理?
解决方案
核心问题是你用了map处理返回Mono的异步方法,map是同步转换操作符,它会把整个Mono<ServiceRequest<ModelClass>>当作参数传给下一个操作,而不是提取里面的ServiceRequest对象。换成flatMap就能解决这个问题:
protected Flux<ProspectContact> transformAndCallUpdateAPI(String eventHubMessage) { return Mono.justOrEmpty(eventHubMessage) .map(this::parser) .flatMap(this::parseToRequest) // 用flatMap替代map,提取Mono内部的ServiceRequest对象 .map(this::updateProspectByContact) // 现在能拿到ServiceRequest作为参数 .map(this::convertToProspectContact) // 将Prospect转换为ProspectContact,需实现该方法 .flux(); // 把Mono转为Flux,匹配方法返回类型 } // 根据业务逻辑实现Prospect到ProspectContact的转换 private ProspectContact convertToProspectContact(Prospect prospect) { ProspectContact contact = new ProspectContact(); // 示例赋值逻辑,按需调整 // contact.setContactId(prospect.getId()); // contact.setContactInfo(prospect.getContactInfo()); return contact; }
关键说明
flatMap是异步扁平化操作符,它会订阅上游返回的Mono,自动提取内部的ServiceRequest<ModelClass>对象传递给下一个操作,全程非阻塞,完全不需要block()。- 如果
updateProspectByContact本身是异步方法(返回Mono<Prospect>),把map(this::updateProspectByContact)改成flatMap(this::updateProspectByContact)即可,保持异步链式调用的一致性。
内容的提问来源于stack exchange,提问作者Nehal Gupta
相关产品推荐
相关产品推荐

