首页 > 其他分享 >Spring-Retry框架简单使用

Spring-Retry框架简单使用

时间:2024-04-21 14:44:37浏览次数:22  
标签:Retry return 框架 Spring class 重试 异常 public

前言

Spring-Retry 框架是 Spring 自带的功能,具备间隔重试、包含异常、排除异常、控制重试频率等特点,是项目开发中很实用的一种框架。SpringCloudConfig请求配置中心服务器时就使用到了此功能,具体可以看 ConfigServicePropertySourceLocator。

使用

添加依赖

底层使用 AOP 实现的,所以也需要添加 AOP 的依赖

<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
    <version>1.2.4.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

开启配置

使用 @EnableRetry 注解

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

模拟发短信

@Slf4j
@Component
public class RetryService {

    /**
     * 重试机制发送短信
     */
    @Retryable(
            include = {IllegalArgumentException.class, ArrayIndexOutOfBoundsException.class},
            exclude = {NullPointerException.class},
            maxAttempts = 4,
            backoff = @Backoff(delay = 2000L, multiplier = 2)
    )
    public boolean sendSmsRetry() {
        log.info("[RetryComponent][sendSmsRetry]>>>> 当前时间:{}", getNowTime());
        return sendSms();
    }

    /**
     * 兜底方法,规则:
     * 1、超出了最大重试次数;
     * 2、抛出了不进行重试的异常;
     */
    @Recover
    public boolean recover() {
        log.info("[RetryComponent][recover]>>>> 短信发送次数过多,请稍后重试!");
        return false;
    }

    /**
     * 获取当前时间
     */
    private String getNowTime() {
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    }

    /**
     * 模拟发送短信
     */
    private boolean sendSms() {
        int num = RandomUtils.nextInt(0, 5);
        log.info("[SmsUtil][sendSms]>>>> random num = {}", num);
        switch (num) {
            case 0:
                // 模拟发生参数异常
                throw new IllegalArgumentException("参数有误!");
            case 1:
                // 模拟发生数组越界异常
                throw new ArrayIndexOutOfBoundsException("数组越界!");
            case 2:
                // 模拟成功
                return true;
            case 3:
                // 模拟发生空指针界异常
                throw new NullPointerException();
            default:
                // 未成功则返回false
                return false;
        }
    }
}
@Slf4j
@RestController
public class TestRetryController {

    @Autowired
    private RetryService retryService;

    @GetMapping("/testRetry")
    public boolean testRetry() {
        boolean ret = retryService.sendSmsRetry();
        log.info("sendSmsRetry result = {}", ret);
        return ret;
    }
}

@Retryable 注解参数说明:

  • include:要触发重试的异常列表,如果 include 为空且 exclude 也为空,表示所有异常都触发(Exception类)。
  • exclude:不要触发重试的异常列表。
  • maxAttempts:重试最大次数,默认3次。
  • backoff:定义补偿机制,delay-延迟时间(s),multiplier-重试时间的倍数(比如设置为2,重试4次的话,补偿机制就是分别间隔2s、4s、8s做重试),默认延迟1s

@Recover注解说明:用于兜底,当 超出了最大重试次数 或 抛出了不进行重试的异常 时,直接执行该注解声明的兜底方法。

原理分析

  1. @EnableRetry 注解引入了 RetryConfiguration 配置类。
  2. 创建 AnnotationAwareRetryOperationsInterceptor 拦截器,扫描类或方法上的 @Retryable 注解。
  3. 如果有扫描到,创建 RetryOperationsInterceptor 拦截器,内部交给 RetryTemplate 来执行重试

总结

Spring-Retry 使用是很方便的,但是如果重试策略设置错误,也是有很大的风险的(比如无限重试)。

参考

5分钟攻略Spring-Retry框架实现经典重试场景

标签:Retry,return,框架,Spring,class,重试,异常,public
From: https://www.cnblogs.com/strongmore/p/18050088

相关文章

  • 基于SpringBoot+Vue毕业生信息招聘平台系统
    需求分析3.1技术可行性:技术背景毕业生信息招聘平台是在Windows操作系统中进行开发运用的,而且目前PC机的各项性能已经可以胜任普通网站的web服务器。系统开发所使用的技术也都是自身所具有的,也是当下广泛应用的技术之一。系统的开发环境和配置都是可以自行安装的,系统使用Java开......
  • 计算机毕业设计源码-基于 SpringBoot 开发的班级综合测评系统研究与实现
    技术栈开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9浏览器:谷歌浏览器3.需求分析用户需求分析根据账号登陆进入班级综合测评管理系统,系统根据角色展示相应......
  • springboot启动原理
     启动类上的注解,会扫描路径下的类进容器进行实例化。这样访问时springmvc的dispa就可以访问到这个类了。newDispatcherServlet(webapplication)springmvc需要一个web容器。这个容器参数,在startTomcat(applicationContext)方法里面传入。 ......
  • 人形机器人 —— NVIDIA公司给出的操作算法(动态操作任务,dynamic manipulation tasks)(机
    原文:https://developer.nvidia.com/isaac/manipulator#foundation-modelsNVIDIA公司准备针对人形机器人的各部分操作分别推出一个AI框架,如:步态控制、3D感知、抓取操作、避障和规划,等等,本文介绍的就是NVIDIA计划推出的操作任务的算法的AI框架(manipulationtasks)。......
  • Solon Java 应用开发框架 v2.7.5 发布
    JavaSolon是什么框架?Java“新的”应用开发框架。从零开始构建(非java-ee架构),有灵活的接口规范与开放生态。追求:更快、更小、更简单提倡:克制、简洁、高效、开放、生态有什么特点?更高的计算性价比:并发高2~3倍;内存省50%更快的开发效率:内核小,入门快;调试重启快5......
  • Spring Cloud
    SpringCloud微服务概述微服务可以在“自己的程序”中运行,并通过“轻量级设备与HTTP型API进行沟通”。关键在于该服务可以在自己的程序中运行。通过这一点我们就可以将服务公开与微服务架构(在现有系统中分布一个API)区分开来。在服务公开中,许多服务都可以被内部独立进程所限......
  • Spring Boot 启动原理
    SpringBoot启动原理SpringBoot大大简化了我们的开发配置,节省了大量的时间,确实比较方便。但是对于新手来说,如果不了解个中原理,难免会遇到坑。本文作者将带领大家走近神秘的SpringBoot,一步步破开它的神秘面纱,探索SpringBoot的启动原理。开发任何基于SpringBoot的项目......
  • 使用kratos框架集成jwt认证
    问题背景:网络鉴权在web开发中最常见不过了,最近在使用gokratos框架写项目的时候需要用到jwt,查阅资料后自己动手实现了简单的鉴权,在这里记录一下实现步骤,直接上代码。定义jwt签发函数这部分我是参考了李文周老师的博客博客地址:https://www.liwenzhou.com/posts/Go/json-web-tok......
  • (UIAutomator、Appium、Robotium)三种APP自动化测试框架
    一、原理1.UiAutomator——基于UIAutomation的用户界面自动化测试框架,可以跨应用工作,谷歌亲生的。UIAutomation在Android4.3发布时有了新版本,官方简介:http://blog.csdn.net/zhubaitian/article/details/40504827。Android4.3之前:使用inputManager或者更早的WindowsManager......
  • 肖sir__po框架之ui自动化框架
    po框架一、ui自动化po框架介绍(1)PO是PageObject的缩写(pom模型)(2)业务流程与页面元素操作分离的模式,可以简单理解为每个页面下面都有一个配置class,配置class就用来维护页面元素或操作方法(3)提高测试用例的可维护性、可读取性对比:传统的设计测试用例存在的弊端:1.易读性差2.复用性差3.......