SpringRetry(spring的重试机制)——只需一个注解
1、什么是spring的重试机制:
SpringRetry(spring的自动重试机制),SpringRetry是基于AOP实现的,在应用程序中,由于一些网络等不可预知的问题,我们的程序或者接口会失败,比如调用一个第三方的接口获取数据失败了,这时就需要重试机制,比如延时3S后重试、间隔不断增加重试等。都可以使用SpringRetry来实现。
2、 如何使用SpringRetry
SpringRetry的使用相当简单,只需要导包+注解便可以搞定
①导入SpringRetry依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</dependency>
②在主启动类或者需要重试的方法所在的类上添加注解@EnableRetry
@EnableRetry
public class Test {
... }
③在所需要重试的方法上加上一下注解
@Retryable(value = Exception.class, maxAttempts = 10, backoff = @Backoff(delay = 200L, multiplier = 1))
private Map<String, Object> postSendRequest(String httpUrl, Map<String, Object> resultMap, String resultStr)
throws Exception {
restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
restTemplate.postForObject(httpUrl, resultStr, String.class);
resultMap.put("result", "成功!");
return resultMap;
}
注意:
@Retryable注解参数说明:
- maxAttempts :最大重试次数,默认为3,如果要设置的重试次数为3,可以不写;
- value:抛出指定异常才会重试
- include:和value一样,默认为空,当exclude也为空时,默认所以异常
- exclude:指定不处理的异常
- backoff:重试等待策略,默认使用@Backoff@Backoff的value默认为1000L,我们设置为200L。
@Backoff注解中的参数说明:
- value:隔多少毫秒后重试,默认为1000L;
- delay:和value一样,但是默认为0;
- multiplier(指定延迟倍数)默认为0,表示固定暂停1秒后进行重试,如果把multiplier设置为1.5,则第一次重试为2秒,第二次为3秒,第三次为4.5秒。
④可以同时在同一个类中使用@Recover来处理N次处理后都没有成功后需要处理的事情
可以在指定方法上标记@Recover来开启重试失败后调用的方法(注意,需跟重处理方法在同一个类中)
@Recover
当重试到达指定次数时,被注解的方法将被回调,可以在该方法中进行日志处理。需要注意的是发生的异常和入参类型一致时才会回调。
3、示例
@EnableRetry//也可以在主启动类上
public class RecoryTest {
@Retryable(value = {
RetryException.class}, // 指定发生的异常进行重试
maxAttempts=3, // 重试次数, 默认即为3
backoff = @Backoff(delay = 2000L, multiplier = 2)) // 每次重试延迟毫秒数 及 延迟倍数
@Async
public void retry() {
log.info("重试");
throw new RetryException("失败");
}
@Recover
public void recover (RetryException e) {
log.error("失败",e.getMessage());
}
}
当重试后还是失败就会回调recover()函数;
注意
1、在使用中,被重试的方法不要捕获异常,但是需要将异常抛出。
2、避免在同类中调用retry()方法,解其实是通过动态代理的方式来实现异步调用的。同理@Transactional、@Async注解也是,同类之间调用不生效
还没有评论,来说两句吧...