Java中能否用AsyncRabbitTemplate.RabbitConverterFuture实现异步调用链?
异步调用链式处理实现
我们需要实现异步调用的链式处理逻辑,在所有调用全部执行完成后仅返回单个回调响应,原始示例实现逻辑如下:
public invokeAsyncAPI1 () { AsyncRabbitTemplate.RabbitConverterFuture<Response1> futureResponse1 = asyncAPI1(); futureResponse1.addCallback { successCallBack (Response1 result1) { if(result != OK) { 立即返回false } else { invokeAsyncAPI2(result1); } } failureCallBack () { 立即返回false } } } public invokeAsyncAPI2 (result1) { AsyncRabbitTemplate.RabbitConverterFuture<Response2> futureResponse2 = asyncAPI2(); futureResponse2.addCallback { successCallBack (Response2 result2) { if(result != OK) { 立即返回false } else { 返回成功响应 } } failureCallBack () { 立即返回false } } }
上述嵌套回调的写法会产生回调地狱问题,后续维护成本高。可以用Future链式编排的方式优化,最终统一返回结果:
public CompletableFuture<Boolean> executeAsyncChain() { // 串行执行异步调用,统一处理结果与异常 return asyncAPI1() .thenCompose(result1 -> { // 第一步调用结果校验不通过直接返回失败 if (!result1.equals(OK)) { return CompletableFuture.completedFuture(false); } // 校验通过执行第二步异步调用 return asyncAPI2(result1); }) .thenApply(result2 -> { // 校验第二步调用结果,有效则返回成功 return result2.equals(OK); }) // 所有异常场景统一返回失败 .exceptionally(e -> false); }
最终只需要给executeAsyncChain()返回的Future添加单个回调,就能拿到全链路的执行结果,不需要分散处理多个异步调用的回调。
内容的提问来源于stack exchange,提问作者utpal sharma
相关产品推荐
相关产品推荐

