使用方法
@Component
public class RetryableXX {
// 使用重试框架须知:
// 该注解无事务性!!!!
// 该注解是同步操作,重试次数与时间间隔需要慎重考虑!!!!
// 使用重试注解时,务必匹配@Recover回调方法,否则重试次数会平方!!!!
// 被调用的重试方法必须是被代理过的,否则重试效果不生效!!!!
// 匹配了@Recover回调方法,只要重试方法中出现了异常,都会执行重试操作!!!![比如:逻辑中出现空指针异常,但是抓取的异常为索引越界异常,重试机制仍然会触发!!!!]
/*
value: 捕获指定异常,进行重试操作(一个类中,最好不要出现相同的异常类型,分析结果在后面)
maxAttempts: 最大重试次数(包含首次执行次数)
delay: 下次重试与上次执行时间间隔(单位:毫秒)
multiplier: 用于计算下次重试延迟的乘法器(默认0=忽略)
ex:
maxAttempts = 5, multiplier = 1, delay = 5000L, 触发最大重试次数,
每次执行间隔为 5秒(第一次重试)-->25秒(第二次重试)-->30秒(第三次重试)-->30秒(第四次重试)
**奇怪的地方(未深究):超过3次执行后,后面的时间就不是*5了,而是+5)
注意事项:
1.最好一个类中只有一个重试方法。
2.当一个类中出现多个重试方法,需要注意以下2点:
2.1 重试方法A调用重试方法B,重试方法B的重试规则不生效!但是重试方法B的回调会生效!!!!
2.2 重试方法A调用重试方法B(this.B()),方法B出现的异常,会被重试方法A捕获到(前提:B方法出现的异常,属于A方法捕获的异常之内)
*/
@Retryable(value = { RuntimeException.class }, maxAttempts = 5, backoff = @Backoff(delay = 5000L, multiplier = 0))
public void execute(String params1, String params2) {
// TODO
// 操作数据
// ...
int i = 1/0;
// Retryable不会因为异常而回滚数据库操作!!!!
}
/*
与@Retryable注解方法一一对应
含义:Retryable进行了最大次数重试,仍未正常执行代码,则触发recover回调。进行最终补偿操作。
注意事项:
1.一个类中,最好只存在一个@Recover方法,与@Retryable重试方法保持唯一
2.recover方法的参数,第一个参数需要与@Retryable注解的value对应(可以拿到错误原因);后续的参数也要与@Retryable方法的参数一致!,如果第一个参数与重试注解的value不一致,系统在触发重试回调时,会报错!!!!
*/
@Recover
public void recover(RuntimeException e, String params1, String params2) {
System.out.println("TEST func recover"+ e.getMessage());
System.out.println(params1 + params2);
}
}
标签:retry,浅谈,spring,重试,异常,Recover,注解,Retryable,方法 From: https://blog.51cto.com/u_16358052/9163959使用重试框架须知: 该注解无事务性!!!! 该注解是同步操作,重试次数与时间间隔需要慎重考虑!!!! 使用重试注解时,务必匹配@Recover回调方法,否则重试次数会平方!!!! 被调用的重试方法必须是被代理过的,否则重试效果不生效!!!! 匹配了@Recover回调方法,只要重试方法中出现了异常,都会执行重试操作!!!![比如:逻辑中出现空指针异常,但是抓取的异常为索引越界异常,重试机制仍然会触发!!!!] 重试注解:@Retryable(value = { RuntimeException.class }, maxAttempts = 5, backoff = @Backoff(multiplier = 0, delay = 5000L))
value: 捕获指定异常,进行重试操作(一个类中,最好不要出现相同的异常类型,分析结果在后面) maxAttempts: 最大重试次数(包含首次执行次数) delay: 下次重试与上次执行时间间隔(单位:毫秒) multiplier: 用于计算下次重试延迟的乘法器(默认0=忽略) ex: maxAttempts =5,multiplier=1, delay = 5000L,触发最大重试次数, 每次执行间隔为 5秒(第一次重试)-->25秒(第二次重试)-->30秒(第三次重试)-->30秒(第四次重试)
**奇怪的地方(未深究):超过3次执行后,后面的时间就不是*5了,而是+5) 注意事项: 1.最好一个类中只有一个重试方法。 2.当一个类中出现多个重试方法,需要注意以下2点: 2.1 重试方法A调用重试方法B,重试方法B的重试规则不生效!但是重试方法B的回调会生效!!!! 2.2 重试方法A调用重试方法B(this.B()),方法B出现的异常,会被重试方法A捕获到(前提:B方法出现的异常,属于A方法捕获的异常之内) 重试失败回调:@Recover 与@Retryable注解方法一一对应 含义:Retryable进行了最大次数重试,仍未正常执行代码,则触发recover回调。进行最终补偿操作。 注意事项: 1.一个类中,最好只存在一个@Recover方法,与@Retryable重试方法保持唯一 2.recover方法的参数,第一个参数需要与@Retryable注解的value对应(可以拿到错误原因);后续的参数也要与@Retryable方法的参数一致!,如果第一个参数与重试注解的value不一致,系统在触发重试回调时,会报错!!!!