Spring @Retryable重试方法调用详解
一、使用方法
1.引入maven包
<!-- https://mvnrepository.com/artifact/org.springframework.retry/spring-retry -->
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
<version>1.2.4.RELEASE</version>
</dependency>
2.配置启用重试功能
1.springboot项目可以直接在启动类上添加注解:@EnableRetry
@SpringBootApplication
@EnableRetry
public class XXXApplication {
public static void main(String[] args) {
SpringApplication.run(XXXApplication.class, args);
}
}
2.springMVC项目可以直接添加配置文件,通过@Configuration配置Spring容器,通过@EnableRetry启用重试功能
@Configuration
@EnableRetry
public class RetryConfig {
}
3.添加需要进行重试的业务方法,@Retryable对该方法启用重试
@Retryable注解中的参数说明:
- 1)value:抛出指定异常才会重试(value不为空是,include和exclude不生效)
- 2)include:指定需要处理的异常,默认为空,当exclude也为空时,所有异常都重试
- 3)exclude:指定不处理的异常,默认为空,当include也为空时,所有异常都重试
- 4)maxAttempts:最大重试次数,默认为3,如果要设置的重试次数为3,可以不写; backoff:重试等待策略。
- delay:等待间隔时间
- maxDelay:最大等待间隔时间(默认为30s)
- multiplier:等待间隔时间放大倍数。例如(delay=2000,multiplier=2时,则重试时间为2,4,8,16……,但<=maxDelay值)
例如下图:捕获异常为ResultException, 2秒执行一次,每次递增2倍,最多每10秒执行一次,最多重试60次。
@Retryable(value = ResultException.class, maxAttempts = 60, backoff = @Backoff(delay = 2000L,maxDelay = 10000L, multiplier = 2))
public void test(String testParam) throws ResultException {
System.out.println(testParam);
throw new ResultException("抛出指定异常,重试");
}
二、常见问题
1.设置的每60秒执行一次,实际30秒执行一次
原因:没有设置最大等待间隔时间maxDelay(默认为30s)。
2.重试功能没有生效
原因:可能是将重试方法作为内嵌方法调用了(作为内嵌方法调用时不生效)
如下这种方式调用,重试不会生效。
原因是:由于Retryalbe用到了aspect增强,所以会有aspect的坑,就是方法内部调用,会使aspect增强失效,那么Retryalbe当然也会失效。
public class Test{
public void a(){
b();
}
@Retryalbe
public void b(){
}
}
本文完。