如何通过Mutiny实现服务的顺序调用:A→B→C(用B数据)→D
使用Mutiny实现服务顺序调用
Mutiny中实现严格顺序的异步服务调用,核心是利用chain()(或flatMap(),两者在顺序执行场景下行为一致)操作符——它会等待前一个Uni任务完成后,再执行后续的异步操作,还能传递前一步的执行结果。
场景适配代码示例
假设你的四个服务都返回Uni类型的异步结果(Mutiny的核心异步类型),定义如下:
// 服务A:无依赖,返回任意类型结果 Uni<String> callServiceA() { return Uni.createFrom().item("A完成"); } // 服务B:无前置依赖,返回Integer类型结果 Uni<Integer> callServiceB() { return Uni.createFrom().item(100); } // 服务C:依赖服务B的返回结果 Uni<Boolean> callServiceC(Integer bResult) { return Uni.createFrom().item(bResult > 50); } // 服务D:无前置依赖,仅需等待C完成 Uni<Void> callServiceD() { return Uni.createFrom().voidItem(); }
按照你要求的A→B→C(使用B的结果)→D顺序,实现代码如下:
callServiceA() // A完成后调用B,忽略A的结果 .chain(ignored -> callServiceB()) // B完成后,将其结果传入C .chain(bResult -> callServiceC(bResult)) // C完成后调用D,忽略C的结果 .chain(ignored -> callServiceD()) // 订阅执行整个流程 .subscribe() .with( success -> System.out.println("所有服务调用执行完成"), failure -> System.err.println("流程执行失败: " + failure.getMessage()) );
关键细节说明
- 顺序保证:
chain()操作符会严格等待前一个Uni完成(无论成功还是失败),才会触发后续的服务调用,完全满足你"每个服务仅在前一个执行完成后启动"的要求。 - 结果传递:如果后续服务需要依赖前一步的结果,直接在
chain()的lambda表达式中接收参数并传入即可(比如示例中B的结果传给C)。 - 错误处理:如果需要针对某个服务的失败做重试或降级,可以在对应步骤后添加
onFailure()操作符,例如:
callServiceA() .onFailure().retry().atMost(2) // 服务A失败时重试最多2次 .chain(ignored -> callServiceB()) .chain(bResult -> callServiceC(bResult)) .chain(ignored -> callServiceD()) .subscribe() .with( success -> System.out.println("所有服务调用执行完成"), failure -> System.err.println("流程执行失败: " + failure.getMessage()) );
内容的提问来源于stack exchange,提问作者ColdDeath
相关产品推荐
相关产品推荐

