Spring Webflux 实现先调用单个API再执行多个并行调用的方案咨询
实现思路修正说明
你当前的代码存在核心逻辑问题,没有达成「先执行第一个API/DB操作成功后再并行执行后续两个操作」的需求,具体问题和修正方案如下:
现有代码的核心问题
你定义的saveFirstObject返回的Mono没有被加入响应式流的执行链,不会被实际订阅执行,代码运行时会直接跳过第一个操作,直接触发后面两个并行操作,完全不符合你的业务要求。
正确的实现方案
用flatMap串联第一个操作和后续的并行操作即可,flatMap会等待上游Mono(也就是第一个操作)执行成功返回结果后,再触发内部的逻辑,刚好匹配你的前置依赖要求,修正后的代码示例如下:
Mono<SomeReturnObject> saveStateOfMultipleObjectsinTheDB(SO request){ // 先执行第一个保存操作,成功后再走后续逻辑 return saveFirstObject(request.getFirstObject()) .flatMap(firstCallResult -> // 内部的两个操作用zip组合,默认就是并行执行 Mono.zip( saveSecondObject(request.getSecondObject()).subscribeOn(Schedulers.boundedElastic()), saveThirdObject(request.getThirdObject()).subscribeOn(Schedulers.boundedElastic()), // 这里可以直接写lambda处理两个并行操作的返回结果 (secondRes, thirdRes) -> maptoSomeReturnObject(secondRes, thirdRes, firstCallResult) ) ); }
额外注意事项
- Java变量名不能以数字开头,你原有代码里的
1stCallResult是非法命名,需要调整 - 你用到的
Schedulers.elastic()已经在新版Reactor中被废弃,推荐替换为Schedulers.boundedElastic(),更适合DB调用这类IO密集型操作 - 如果要求两个并行操作其中一个失败时另一个也终止,当前zip的逻辑已经符合要求;如果需要容忍部分失败、拿到所有执行结果再处理,可以替换为
Mono.zipDelayError - 如果需要用到第一个操作的返回结果给后续处理,可以直接在flatMap的lambda中拿到
firstCallResult使用,不需要额外存储
内容的提问来源于stack exchange,提问作者SoftwareSavant
相关产品推荐
相关产品推荐

