• Spring Boot-整合Retry框架重试机制


    一、背景

    • 调用第三方接口,按照最大次数轮询去获取结果,或因为网络波动导致超时等。
    • Retry重试框架,支持AOP切入的方式使用,支持注解;重试次数、重试延迟、重试触发条件、重试的回调方法等功能来实现重试机制

    二、整合Retry

    2.1 pom文件加入依赖

    <dependency>
         <groupId>org.springframework.retry</groupId>
        <artifactId>spring-retry</artifactId>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
    </dependency>

    2.2 容器启动类上添加注解@EnableRetry

    @EnableRetry
    @SpringBootApplication
    public class ParamApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ParamApplication.class, args);
        }
    
    }

    2.3 支付服务类PayService,获取剩余数量

    @Slf4j
    @Service
    public class PayService {
    
        private final static int TOTAL_NUM = 100000;
    
        @Retryable(value = Exception.class, maxAttempts = 3, backoff = @Backoff(delay = 5000L, multiplier = 2))
        public int getRemainingAmount(int num) throws Exception {
            log.info("getRemainingAmount======" + LocalTime.now());
            if (num <= 0) {
                throw new Exception("数量不对");
            }
            log.info("getRemainingAmount======执行结束");
            return TOTAL_NUM - num;
        }
    }

    @Retryable:标记当前方法使用重试机制

      value:触发重试机制的条件,当遇到Exception时,会重试

      maxAttempts :设置最大重试次数,默认为3次

      delay:重试延迟时间,单位毫秒,即距离上一次重试方法的间隔

      multiplier:delay重试延迟时间的间隔倍数,即第一次为5秒,第二次为5乘以2为10秒,依此类推


     三、测试

    创建controller类

    @Slf4j
    @RestController
    @RequestMapping("/retry")
    public class RetryController {
    
        @Resource
        private PayService payService;
    
        @PostMapping("/test")
        public String retryTest(@RequestParam int num) throws Exception {
            int remainingnum = payService.getRemainingAmount(num);
            log.info("剩余数量===" + remainingnum);
            return "success";
        }
    }

    postman调用

    可以看到,第一次用时5S,第二次用时10S,第三次用时15S;

    最后会抛出异常,可以在上层代码进行try-catch处理相关业务逻辑;

    也可以写回调方法处理,在PayService类中添加如下代码,@Recover:当重试方法发生异常时,会执行该回调方法

    @Recover
    public int recover(Exception e) {
      // 回调方法,业务逻辑处理
    
      return -1;
    }

    再次执行时,结果如下

  • 相关阅读:
    一步步学习SPD2010--第十一章节--处理母版页(10)--重置母版页到网站定义
    pandas转numpy并打平实例
    list和numpy互相转换
    pandas转numpy
    pandas库疑难问题---2、pandas切片操作
    pandas切片操作
    pandas中的iloc和loc用法的区别
    NumPy疑难问题---1、NumPy切片操作
    numpy切片操作
    python疑难问题---13、Python切片操作
  • 原文地址:https://www.cnblogs.com/lwcode6/p/13625165.html
Copyright © 2020-2023  润新知