@Retryable
它可以作用在方法上,当方法抛出指定的异常时,整个方法将会被重新执行。在使用时需要先在pom.xml中导入相关依赖,再在启动类中添加@EnableRetry注释以开启重试功能,最后在相应的方法上添加@Retryable注释。
引入依赖
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
使用
开启Retryable只需要在启动类上加上@EnableRetry注解即可
private int i = 0;
@Retryable(value = RuntimeException.class,maxAttempts = 5)
@Override
public void retry() {
i++;
log.debug("第[{}]次调用", i);
System.out.println("第" + i + "次调用");
if (i < 6) {
throw new RuntimeException("调用失败!");
}
i = 0;
}
参数介绍
value:抛出指定异常才会重试
include:和value一样,默认为空,当exclude也为空时,默认所有异常
exclude:指定不处理的异常
maxAttempts:最大重试次数,默认3次
backoff:重试等待策略,默认使用@Backoff,@Backoff的value默认为1000L,我们设置为2000L;multiplier(指定延迟倍数)默认为0,表示固定暂停1秒后进行重试,如果把multiplier设置为1.5,则第一次重试为2秒,第二次为3秒,第三次为4.5秒
@Recover回调
Spring-Retry还提供了@Recover注解,用于@Retryable重试失败后处理方法,如果不需要回调方法,可以直接不写回调方法,那么实现的效果是,重试次数完了后,如果还是没成功没符合业务判断,就抛出异常。
@Recover
public void recover(RuntimeException e) {
System.out.println("调用了回调方法!");
}
@Recover的使用注意事项:
方法的返回值必须与@Retryable方法一致
方法的第一个参数,必须是Throwable类型的,建议是与@Retryable配置的异常一致,其他的参数,需要哪个参数,写进去就可以了(@Recover方法中有的)
该回调方法与重试方法写在同一个实现类里面
测试结果