spring-retry 项目地址:https://github.com/spring-projects/spring-retry
1 注解介绍
- @EnableRetry 能否重试。当 proxyTargetClass 属性为 true 时,使用 CGLIB 代理。默认使用标准 JAVA 注解。在 spring Boot 中此参数写在程序入口即可。
- @Retryable 标注此注解的方法在发生异常时会进行重试
- value:指定处理的异常类
- include:指定处理的异常类和 value 一样,默认为空,当 exclude 也为空时,默认所有异常
- exclude:指定异常不处理,默认空,当 include 也为空时,默认所有异常
- maxAttempts:最大重试次数。默认 3 次
- backoff: 重试等待策略。默认使用 @Backoff 注解
- @Backoff 重试等待策略
- 不设置参数时,默认使用 FixedBackOffPolicy(指定等待时间),重试等待 1000ms
- 设置 delay,使用 FixedBackOffPolicy(指定等待时间),重试等待填写的时间
- 设置 delay 和 maxDealy 时,重试等待在这两个值之间均态分布
- 设置 delay、maxDealy、multiplier,使用 ExponentialBackOffPolicy(指数级重试间隔的实现 ),multiplier 即指定延迟倍数,比如 delay=5000l,multiplier=2,则第一次重试为 5 秒,第二次为 10 秒,第三次为 20 秒……
- @Recover 用于 @Retryable 重试失败后处理方法,此注解注释的方法参数一定要是 @Retryable 抛出的异常,否则无法识别,可以在该方法中进行日志处理。
2 引入 Spring Retry 依赖
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
<version>${version}</version>
</dependency>
额外依赖 AOP
Spring Boot 项目,推荐依赖 Spring Boot starter for AOP
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<version>${version}</version>
</dependency>
非 Spring Boot 项目,依赖 AspectJ 的 aspectjweaver
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${version}</version>
</dependency>
3 在启动入口加入重试配置
添加 @EnableRetry 注解
@SpringBootApplication
@EnableRetry
public class RetryApplication {
public static void main(String[] args) throws Exception{
SpringApplication.run(RetryApplication.class, args);
}
}
4 编写测试 service
@Service
public class RetryService {
@Retryable(value= {RemoteAccessException.class},maxAttempts = 5,backoff = @Backoff(delay = 5000l,multiplier = 1))
public void retryTest() throws Exception {
System.out.println("do something...");
throw new RemoteAccessException("RemoteAccessException....");
}
@Recover
public void recover(RemoteAccessException e) {
System.out.println(e.getMessage());
System.out.println("recover....");
}
}
5 测试 service
@Configuration
@EnableRetry
@EnableAspectJAutoProxy(proxyTargetClass=true)
public class RetryServiceMain {
@Bean
public RetryService retryService(){
return new RetryService();
}
public static void main(String[] args) throws Exception{
final AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(RetryServiceMain.class);
final RetryService retryService = applicationContext.getBean(RetryService.class);
retryService.retryTest();
}
}