Spring-retry详解( 二 )

例:这个表达式的意思就是 , 如果 testRetry05 方法出现异常 会调用 retryService.isRetry() 方法 , 根据返回结果判断是否重试

  • @Recover兜底方法
当 @Retryable 方法重试失败之后 , 最后就会调用 @Recover 方法 。用于 @Retryable 失败时的“兜底”处理方法 。@Recover 的方法必须要与 @Retryable 注解的方法保持一致 , 第一入参为要重试的异常 , 其他参数与 @Retryable 保持一致 , 返回值也要一样 , 否则无法执行!
@Retryable(value = https://www.isolves.com/it/cxkf/kj/2023-05-18/MyException.class)public void testRetry06() throws MyException {System.out.println("测试兜底方法");throw new MyException("出现了异常");}@Recoverpublic void recover06(MyException e) {System.out.println("兜底方法开启,异常信息:" + e.getMessage());}熔断模式@CircuitBreaker指在具体的重试机制下失败后打开断路器 , 过了一段时间 , 断路器进入半开状态 , 允许一个进入重试 , 若失败再次进入断路器 , 成功则关闭断路器 , 注解为 @CircuitBreaker ,具体包括熔断打开时间、重置过期时间
@CircuitBreaker(openTimeout = 1000, resetTimeout = 3000, value = https://www.isolves.com/it/cxkf/kj/2023-05-18/MyException.class)public void testRetry07() throws MyException {System.out.println("测试CircuitBreaker注解");throw new MyException("出现了异常");}例:openTimeout 时间范围内失败 maxAttempts 次数后 , 熔断打开 resetTimeout 时长 这个方法的意思就是方法在一秒内失败三次时 , 触发熔断 , 下次在有请求过来时 , 直接进入
重试策略
  • SimpleRetryPolicy 默认最多重试 3 次
  • TimeoutRetryPolicy 默认在 1 秒内失败都会重试
  • ExpressionRetryPolicy 符合表达式就会重试
  • CircuitBreakerRetryPolicy 增加了熔断的机制 , 如果不在熔断状态 , 则允许重试
  • CompositeRetryPolicy 可以组合多个重试策略
  • NeverRetryPolicy 从不重试(也是一种重试策略哈)
  • AlwaysRetryPolicy 总是重试
退避策略退避策略退避是指怎么去做下一次的重试 , 在这里其实就是等待多长时间 。
通过 @Backoff 注解实现 , 那么我们首先看一下@Backoff 的参数
@Backoff 参数
  • value
默认为 1000 ,  与 delay 作用相同 , 表示延迟的毫秒数 。当 delay 非 0 时 , 此参数忽略 。
  • delay
默认为 0 。在指数情况下用作初始值 , 在统一情况下用作*的最小值 。当此元素的值为 0 时 , 将采用元素 value 的值 , 否则将采用此元素的值 , 并且将忽略 value 。
  • maxDelay
默认为 0 。重试之间的最大等待时间(以毫秒为单位) 。如果小于 delay , 那么将应用默认值为 30000L
  • multipler
默认为 0 。如果为正 , 则用作乘法器以生成下一个退避延迟 。返回一个乘法器 , 用于计算下一个退避延迟
  • delayExpression
评估标准退避期的表达式 。在指数情况下用作初始值* , 在均匀情况下用作最小值 。覆盖 delay 。
  • maxDelayExpression
该表达式计算重试之间的最大等待时间(以毫秒为单位) 。如果小于 delay , 那么将应用 30000L 为默认值 。覆盖 maxDelay 。
  • multiplierExpression
评估为用作乘数的值 , 以生成退避的下一个延迟 。覆盖 multiplier 。返回一个乘数表达式 , 用于计算下一个退避延迟
  • random
默认为 false , 在指数情况下 multiplier> 0 将此值设置为 true 可以使后退延迟随机化 , 从而使最大延迟乘以前一延迟 , 并且两个值之间的分布是均匀的 。
@Retryable(value = https://www.isolves.com/it/cxkf/kj/2023-05-18/MyException.class, maxAttempts = 4,backoff = @Backoff(delay = 2000, multiplier = 2, maxDelay = 5000))public void testRetry08() throws MyException {System.out.println("测试-backoff属性");throw new MyException("出现了异常");}@Backoff 的参数会影响我们使用哪种退避策略
  • FixedBackOffPolicy
默认退避策略 , 每 1 秒重试 1 次


推荐阅读