spring-retry

当由于网络波动或者资源被锁等情况需要再次尝试的时候,可以使用spring-retry项目来实现,该项目已经应用到 Spring Batch, Spring Integration等项目。

spring-boot项目使用spring-retry非常简单,在配置类加上@EnableRetry注解启用spring-retry,然后在需要失败重试的方法加@Retryable注解即可,spring-retry通过捕获异常来触发重试机制。

@Retryable

注意: 不能用于接口的实现类

  @Retryable(value = RemoteAccessException.class, maxAttempts = 30,
      backoff= @Backoff(value = 10, maxDelay = 100000, multiplier = 3))
      public String getUser(Integer id){
          if (id == 444) {
            throw new RemoteAccessException(String.valueOf(id));
          }
      }

参数说明

value

需要进行重试的异常,和参数includes是一个意思。默认为空,当参数exclude也为空时,所有异常都将要求重试。

include

需要进行重试的异常,默认为空。当参数exclude也为空时,所有异常都将要求重试。

exclude

不需要重试的异常。默认为空,当参include也为空时,所有异常都将要求重试。

stateful

标明重试是否是有状态的,异常引发事物失效的时候需要注意这个。该参数默认为false。远程方法调用的时候不需要设置,因为远程方法调用是没有事物的;只有当数据库更新操作的时候需要设置该值为true,特别是使用Hibernate的时候。抛出异常时,异常会往外抛,使事物回滚;重试的时候会启用一个新的有效的事物。

maxAttempts

最大重试次数,默认为3。包括第一次失败。

backoff

回避策略,默认为空。该参数为空时是,失败立即重试,重试的时候阻塞线程。

详细参数参看@Backoff说明。

exceptionExpression

SimpleRetryPolicy.canRetry()返回true时该表达式才会生效,触发重试机制。如果抛出多个异常,只会检查最后那个。
表达式举例:

"message.contains('you can retry this')"

并且

"@someBean.shouldRetry(#root)"

@Backoff

参数说明

value

重试延迟时间,单位毫秒,默认值1000,即默认延迟1秒。

当未设置multiplier时,表示每隔value的时间重试,直到重试次数到达maxAttempts设置的最大允许重试次数。当设置了multiplier参数时,该值作为幂运算的初始值。

等同delay参数,两个参数设置一个即可。

delay

参看value说明。

maxDelay

两次重试间最大间隔时间。当设置multiplier参数后,下次延迟时间根据是上次延迟时间乘以multiplier得出的,这会导致两次重试间的延迟时间越来越长,该参数限制两次重试的最大间隔时间,当间隔时间大于该值时,计算出的间隔时间将会被忽略,使用上次的重试间隔时间。

multiplier

作为乘数用于计算下次延迟时间。公式:

delay = delay * multiplier

random

是否启用随机退避策略,默认false。设置为true时启用退避策略,重试延迟时间将是delaymaxDelay间的一个随机数。设置该参数的目的是重试的时候避免同时发起重试请求,造成Ddos攻击。

@Recover

该注解用于恢复处理方法,当全部尝试都失败时执行。返回参数必须和@Retryable修饰的方法返回参数完全一样。第一个参数必须是异常,其他参数和@Retryable修饰的方法参数顺序一致。

  @Recover
  public String recover(RemoteAccessException remoteaccessException, Integer id){
      // 全部重试失败处理
  }

参考

demo: https://github.com/clj198606061111/spring-boot-retry-demo

spring-retry项目: https://github.com/spring-projects/spring-retry

原文: http://www.itclj.com/blog/59940a4081c06e672f942ae1

你可能感兴趣的:(java-spring)