Spring-Retry

参考:
SpringRetry踩坑记录
Spring-Retry机制@Recover及@Retryable可能未生效原因

原理:通过动态代理,拦截注解@Retryable,套上try catch的模板代码 (盲猜的)

使用:

  1. 引入jar包 org.springframework.retry:spring-retry:1.3.1

  2. 启动类或者调用类上加上注解 @EnableRetry
    proxyTargetClass:Boolean类型,用于指明代理方式【true:cglib代理,false:jdk动态代理】默认使用jdk动态代理

  3. 需要重试的方法上加上注解 @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秒。

坑:

  1. @EnableRetry 和 @Retryable 不能写在同一个类里,否则重试机制不生效
  2. @Retryable修饰的方法要是 public 的

另外:

  • 方法重试的补偿方法上面必须携带@Recover注解
  • @Recover方法需要和@Retryable方法在同一个类中才能生效
  • 使用@Retryable注解同时 recover 属性不是空,同时方法有注解@Recover,但是补偿方法的参数不是当前异常或者异常的父类,抛出ExhaustedRetryException 异常
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容