Spring-retry 优雅的实现循环重试功能

打印 上一主题 下一主题

主题 923|帖子 923|积分 2769

引言
     在实际的应用场景中,可能经常会遇到,当请求一个接口调一个服务的时候,出现异常或网络出现故障的情况下就会失败,而对于那些重要的服务当失败后,可能我们就会进行重试,多调用几次,如果还是失败再另外进行单独处理。接下来,就是要讲解的重点内容,我们可以通过@Retryable注解,优雅的实现循环重试功能。
1:引入依赖
  1. <dependency>
  2.     <groupId>org.springframework.retry</groupId>
  3.      <artifactId>spring-retry</artifactId>
  4. </dependency>
复制代码
2:在启动类上开启retry重试功能
  1. package com.patent.cloud;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.retry.annotation.EnableRetry;
  5. @SpringBootApplication
  6. @EnableRetry
  7. public class PatenCloudApplication {
  8.     public static void main(String[] args) {
  9.         SpringApplication.run(PatenCloudApplication.class, args);
  10.     }
  11. }
复制代码
3:业务处理,在要调用的方法上加上@Retryable注解
  1.    @Autowired
  2.     private VehicleLocationDataService vehicleLocationDataService;
  3.     /**
  4.      * 需要在启动类中添加@EnableRetry注释以开启重试功能,最后在相应的方法上添加@Retryable注解。
  5.      * @Recover注解,重试完成之后执行的回调方法
  6.      * 重试机制,如果调用方法过程中触发了RuntimeException异常,则20秒后重试一次,最多重试3次,三次重试后会触发recover方法
  7.      * @param orderNo
  8.      * @param chassisNo
  9.      * @param carStatus
  10.      */
  11.     @GetMapping("/retryMyTest")
  12.     @Retryable(value = RuntimeException.class,maxAttempts = 3, backoff = @Backoff(value = 10000L), recover = "recover", listeners = {"myRetryListener"})
  13.     public void retry(String orderNo, String chassisNo, String carStatus) throws RuntimeException {
  14.         vehicleLocationDataService.retryMyTest(orderNo,chassisNo,carStatus);
  15.     }
复制代码
4:retryMyTest方法的逻辑处理
  1. package com.patent.cloud.retry;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.springframework.stereotype.Service;
  4. @Slf4j
  5. @Service
  6. public class VehicleLocationDataService {
  7.     public  static  Integer retryCount = 1;
  8.     public void retryMyTest(String orderNo, String chassisNo, String carStatus){
  9.         boolean flag = false;
  10.         if("P8012985".equals(chassisNo)){
  11.             flag = true;
  12.         }
  13.         if(retryCount==4){
  14.             retryCount =1;
  15.         }
  16.         if(!flag){
  17.            log.info("有异常哦,我再试多几次看下还有没异常, 重试第{}次, {},{},{}",retryCount, orderNo,chassisNo,carStatus);
  18.            retryCount ++;
  19.             throw new RuntimeException("调用失败!");
  20.         }
  21.     }
  22. }
复制代码
当程序出现RuntimeException的时候,就好触发重试
5:recover方法,上边定义了maxAttempts 为3,也就是说,重试三次后,如果还失败了,则调用recover方法,需要在方法上标注@Recover注解
  1. @Recover
  2. public void recover(RuntimeException runtimeException,String orderNo, String chassisNo, String carStatus) {
  3.   log.info("=======触发重试了recover方法======{}==={}=={}===",orderNo,chassisNo,carStatus);
  4. }
复制代码
6:监听,同时还是对重试方法进行了监听,如我们在方法retry上,加了listeners 监听
  1. package com.patent.cloud.retry;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.springframework.retry.RetryCallback;
  4. import org.springframework.retry.RetryContext;
  5. import org.springframework.retry.listener.RetryListenerSupport;
  6. import org.springframework.stereotype.Service;
  7. @Slf4j
  8. @Service
  9. public class MyRetryListener extends RetryListenerSupport {
  10.     @Override
  11.     public <T, E extends Throwable> void close(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {
  12.         log.info("监听到重试过程关闭了");
  13.         log.info("=======================================================================");
  14.     }
  15.     @Override
  16.     public <T, E extends Throwable> void onError(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {
  17.         log.info("监听到重试过程错误了");
  18.     }
  19.     @Override
  20.     public <T, E extends Throwable> boolean open(RetryContext context, RetryCallback<T, E> callback) {
  21.         log.info("=======================================================================");
  22.         log.info("监听到重试过程开启了");
  23.         return true;
  24.     }
  25. }
复制代码
7:运行结果

 
 
 

 

 
 
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张春

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表