函数式Java中如何在circuit breaker中添加重试与自定义恢复并调整执行顺序
Resilience4j 熔断自定义恢复与 Retry 执行顺序调整方案
Resilience4j 装饰器遵循从外到内的执行规则:越先声明/优先级越高的装饰器,越靠近调用链路的外层。要实现「业务调用失败先执行自定义恢复机制,恢复失败再触发重试」的效果,只需调整装饰器的嵌套顺序,将 Retry 放在 CircuitBreaker 外层,自定义恢复逻辑绑定到最内层的业务调用即可。
1. 函数式手动装配场景(无框架依赖)
装配顺序如下:
- 先定义原生业务调用方法
- 给业务方法绑定自定义 fallback 逻辑
- 用 CircuitBreaker 装饰带 fallback 的业务方法
- 最外层用 Retry 装饰 CircuitBreaker 封装后的方法
示例代码(Java):
// 1. 原生业务调用 CheckedFunction0<String> businessCall = () -> remoteApi.fetchData(); // 2. 绑定自定义恢复逻辑 CheckedFunction0<String> callWithFallback = Try.of(businessCall) .recover(throwable -> customRestoreLogic(throwable)) .toCheckedFunction(); // 3. 装配熔断器 CheckedFunction0<String> callWithCircuitBreaker = CircuitBreaker .decorateCheckedFunction(circuitBreakerInstance, callWithFallback); // 4. 最外层装配重试器 CheckedFunction0<String> finalCall = Retry .decorateCheckedFunction(retryInstance, callWithCircuitBreaker); // 执行调用 String result = finalCall.apply();
执行流程:
调用入口 → 进入 Retry 逻辑 → 进入 CircuitBreaker 逻辑 → 执行业务调用 → 业务失败触发自定义恢复 → 恢复失败抛出异常 → 异常上报 CircuitBreaker 统计 → 异常传到 Retry 触发重试,直到重试次数耗尽抛出最终异常。
2. Spring Boot 注解场景
注解的执行顺序由 order 配置控制,数值越小优先级越高,越靠近调用链路外层。你需要把 Retry 的优先级设置为高于 CircuitBreaker,自定义 fallback 直接绑定到 @CircuitBreaker 注解即可。
配置示例(application.yml)
resilience4j: retry: configs: default: order: 100 # 优先级更高,作为外层装饰器 circuitbreaker: configs: default: order: 200 # 优先级低于Retry,作为内层装饰器
代码示例
@Retry(name = "yourRetryConfig") @CircuitBreaker(name = "yourCbConfig", fallbackMethod = "customFallback") public String businessMethod() { return remoteApi.fetchData(); } // 自定义恢复逻辑 public String customFallback(Throwable throwable) { // 自定义恢复逻辑执行失败时,手动抛出异常即可触发重试 if (restoreFailed) { throw new RuntimeException("自定义恢复失败,触发重试"); } return restoreResult; }
注意:如果你的自定义恢复逻辑执行失败需要触发重试,必须抛出异常,不要返回默认值,否则Retry会判定调用成功,不会触发重试逻辑。
内容的提问来源于stack exchange,提问作者u13k
相关产品推荐
相关产品推荐

