如何从Mono<Order>获取truckId并无阻塞调用vehicleService方法
非阻塞传递truckId调用vehicleService的实现方案
在响应式编程(Reactor)场景下,要实现非阻塞的异步链式调用,核心是使用flatMap操作符——它能无缝衔接两个异步操作,无需阻塞线程等待第一个结果返回。
基础实现代码
// 假设已持有目标订单ID UUID orderId = ...; Mono<Truck> truckMono = orderService.getById(orderId) // 当Mono<Order>成功获取订单数据后,取出truckId调用车辆服务 .flatMap(order -> vehicleService.getByTruckId(order.getTruckId()));
代码说明
orderService.getById(orderId)返回Mono<Order>,代表一个异步的订单查询数据流,不会立即阻塞线程。flatMap操作符会订阅Mono<Order>,当订单数据就绪时,自动取出其中的truckId,并调用vehicleService.getByTruckId()生成新的Mono<Truck>数据流。- 整个流程基于响应式流的异步回调机制,无任何阻塞操作,符合Reactor的非阻塞设计原则。
增强版(处理空值/异常场景)
如果需要处理订单不存在、truckId为空的边界情况,可以添加过滤和兜底逻辑:
Mono<Truck> truckMono = orderService.getById(orderId) // 过滤掉truckId为空的订单 .filter(order -> order.getTruckId() != null) .flatMap(order -> vehicleService.getByTruckId(order.getTruckId())) // 当订单不存在或truckId为空时,返回自定义异常 .switchIfEmpty(Mono.error(new IllegalArgumentException("无效的订单或车辆ID")));
内容的提问来源于stack exchange,提问作者Alex Grimaldo
相关产品推荐
相关产品推荐

