Spring-Retry
2023-05-11 本文已影响0人
安然在路上
参考:
SpringRetry踩坑记录
Spring-Retry机制@Recover及@Retryable可能未生效原因
原理:通过动态代理,拦截注解@Retryable,套上try catch的模板代码 (盲猜的)
使用:
-
引入jar包 org.springframework.retry:spring-retry:1.3.1
-
启动类或者调用类上加上注解 @EnableRetry
proxyTargetClass:Boolean类型,用于指明代理方式【true:cglib代理,false:jdk动态代理】默认使用jdk动态代理 -
需要重试的方法上加上注解 @Retryable
示例:
@Retryable(value = Exception.class,maxAttempts = 3,backoff = @Backoff(delay = 2000,multiplier = 1.5))
参数解释:
- recover: 此类中用于恢复的方法的名称
- value:抛出指定异常才会重试
- maxAttempts:最大重试次数,默认3次
- backoff:重试等待策略,
默认使用@Backoff,@Backoff的value默认为1000L,我们设置为2000; 以毫秒为单位的延迟(默认 1000) - multiplier(指定延迟倍数)默认为0,表示固定暂停1秒后进行重试,如果把multiplier设置为1.5,则第一次重试为2秒,第二次为3秒,第三次为4.5秒。
坑:
- @EnableRetry 和 @Retryable 不能写在同一个类里,否则重试机制不生效
- @Retryable修饰的方法要是 public 的
另外:
- 方法重试的补偿方法上面必须携带@Recover注解
- @Recover方法需要和@Retryable方法在同一个类中才能生效
- 使用@Retryable注解同时 recover 属性不是空,同时方法有注解@Recover,但是补偿方法的参数不是当前异常或者异常的父类,抛出ExhaustedRetryException 异常