SpringRetry(spring的重试机制)——只需一个注解 ゞ 浴缸里的玫瑰 2024-03-31 11:34 20阅读 0赞 #### 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 当重试到达指定次数时,被注解的方法将被[回调][Link 1],可以在该方法中进行日志处理。需要注意的是发生的异常和入参类型一致时才会回调。 #### 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注解也是,同类之间调用不生效 [Link 1]: https://so.csdn.net/so/search?q=%E5%9B%9E%E8%B0%83&spm=1001.2101.3001.7020
还没有评论,来说两句吧...