spring boot 中使用 spring retry 实现失败重试需三步:添加 spring-retry 和 spring-boot-starter-aop 依赖,启动类加 @enableretry 启用,业务方法标 @retryable 注解并可配异常类型、重试次数与退避策略,还可通过 @recover 定义降级逻辑。

Spring Boot 中使用 Spring Retry 实现失败重试,核心是三步:加依赖、开开关、标方法。它不是手动写 while 循环或 try-catch 堆逻辑,而是通过声明式注解自动完成,干净且可复用。
添加必要依赖
Spring Retry 不在 spring-boot-starter-web 等基础 Starter 里,需显式引入:
- spring-retry:提供 @Retryable、@Recover 等核心注解和执行逻辑
- spring-aop(或 spring-boot-starter-aop):支撑 AOP 代理机制,这是重试生效的基础
Maven 示例:
<dependency><groupid>org.springframework.retry</groupid><artifactid>spring-retry</artifactid></dependency><dependency><groupid>org.springframework.boot</groupid><artifactid>spring-boot-starter-aop</artifactid></dependency>
启用重试功能
在启动类或任意配置类上添加 @EnableRetry 注解,告诉 Spring 容器开启重试代理支持:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
@SpringBootApplication
@EnableRetry
public class MyApp {
public static void main(String[] args) {
SpringApplication.run(MyApp.class, args);
}
}
没有这一步,@Retryable 注解不会生效。
在业务方法上标注 @Retryable
把注解加在 Spring 管理的 Bean 方法上(如 @Service、@Component 内的方法),注意:
- 只对抛出的异常触发重试,默认仅捕获 RuntimeException 及其子类
- 若需对检查异常(如 IOException)重试,必须显式指定 value 或 include
- 自调用无效(A 方法直接调 B 方法,B 有 @Retryable)——必须通过 Spring 容器代理调用才生效
常见配置示例:
@Service
public class ApiService {
@Retryable(
value = { RestClientException.class, SocketTimeoutException.class },
maxAttempts = 3,
backoff = @Backoff(delay = 1000, multiplier = 2)
)
public String callExternal() {
// 调用 HTTP 接口等易受网络影响的操作
throw new RestClientException("timeout");
}
}
说明:
• value:只对列出的异常类型重试
• maxAttempts = 3:最多执行 1 次原调用 + 2 次重试 = 共 3 次尝试
• @Backoff(delay=1000, multiplier=2):首次重试延迟 1s,第二次延迟 2s,第三次延迟 4s(指数退避)
可选:定义失败后降级处理(@Recover)
当所有重试都失败时,可自动调用一个兜底方法,用于记录日志、返回默认值或触发告警:
- 方法名任意,但参数列表需兼容:第一个参数必须是 Throwable(或其子类),后续参数可与原方法一致
- 返回类型必须与 @Retryable 方法相同
- 必须与 @Retryable 方法在同一个类中
@Recover
public String recover(RestClientException e) {
log.warn("外部服务连续调用失败,启用降级响应", e);
return "fallback_result";
}










