Resilience4j-Retry Spring注解:重试耗尽后的自定义异常处理
解决Resilience4j重试耗尽后执行自定义错误处理的三种方案
方案一:使用@Retry的fallback属性指定降级方法
这是最直接的实现方式,通过@Retry注解的fallback属性,指定重试全部耗尽后要执行的方法。方法签名需与目标方法匹配,也可额外接收Throwable参数获取失败原因。
示例代码:
import io.github.resilience4j.retry.annotation.Retry; import org.springframework.stereotype.Component; @Component public class CacheService { @Retry(name = "hydration", fallback = "hydrateCachesFallback") public void hydrateCaches() { // 缓存刷新业务逻辑,失败时触发重试 throw new RuntimeException("缓存刷新失败"); } // 重试耗尽后执行的自定义错误处理方法 public void hydrateCachesFallback(Throwable throwable) { // 这里编写你的错误处理逻辑:比如记录告警、触发通知、执行备选方案 System.err.println("所有重试已耗尽,原错误信息:" + throwable.getMessage()); } }
注意:fallback方法可与目标方法在同一类中,若目标方法有参数,fallback方法参数需与目标方法一致,末尾可添加Throwable参数接收异常。
方案二:自定义RetryEventListener监听重试事件
如果需要全局处理多个重试方法的失败逻辑,或者不想在每个方法上单独配置fallback,可通过监听Resilience4j的重试事件实现统一处理。
编写事件监听器
import io.github.resilience4j.retry.event.RetryEvent; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; @Component public class RetryFailureListener { @EventListener public void handleRetryExhaustedEvent(RetryEvent event) { // 判断是否为重试耗尽的失败事件 if (event.getEventType() == RetryEvent.Type.RETRY_EXHAUSTED) { String retryName = event.getRetryName(); Throwable failCause = event.getThrowable(); // 自定义全局错误处理逻辑 System.err.println("重试配置[" + retryName + "]已耗尽,失败原因:" + failCause.getMessage()); // 例如:发送告警邮件、写入监控日志、触发运维通知等 } } }
你的application.yml原有配置无需修改,该监听器会自动监听所有Retry的事件,适合统一处理重试失败场景。
方案三:编程式RetryTemplate实现灵活控制
若注解式实现不够灵活,可改用编程式的RetryTemplate,在重试耗尽后直接执行自定义逻辑。
1. 配置Retry实例
import io.github.resilience4j.retry.Retry; import io.github.resilience4j.retry.RetryConfig; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.time.Duration; @Configuration public class RetryConfig { @Bean(name = "hydrationRetry") public Retry hydrationRetry() { RetryConfig config = RetryConfig.custom() .maxAttempts(6) .waitDuration(Duration.ofSeconds(10)) .build(); return Retry.of("hydration", config); } }
2. 使用Retry执行业务逻辑
import io.github.resilience4j.retry.Retry; import io.vavr.control.Try; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; @Component public class CacheService { private final Retry hydrationRetry; public CacheService(@Qualifier("hydrationRetry") Retry hydrationRetry) { this.hydrationRetry = hydrationRetry; } public void hydrateCaches() { Try.run(() -> { // 缓存刷新业务逻辑 throw new RuntimeException("缓存刷新失败"); }).retry(hydrationRetry).onFailure(throwable -> { // 重试耗尽后执行的自定义错误处理 System.err.println("所有重试已耗尽,执行错误处理:" + throwable.getMessage()); // 这里添加具体的错误处理操作 }).get(); } }
这种方式适合需要根据不同异常类型执行差异化处理的场景,灵活性更强。
内容的提问来源于stack exchange,提问作者Geogrio
相关产品推荐
相关产品推荐

