SpringRetry接口异常优雅重试机制

场景:
某些场景下,如果接口出现异常需要进行重试,例如网络抖动、调用接口超时等并非接口代码导致的报错,此时可以进行接口重试机制

1、导入 spring retry 重试依赖

        <!-- spring retry -->
        <dependency>
            <groupId>org.springframework.retry</groupId>
            <artifactId>spring-retry</artifactId>
            <version>1.3.4</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

因为 spring retry 是基于 aop 实现的,所以还需要导入 aop 依赖

2、主启动类标注启动重试功能 @EnableRetry

3、测试重试方法 

    @Retryable(
            value = Exception.class,
            maxAttempts = 5,
            backoff = @Backoff(delay = 1000, multiplier = 2),
            recover = "recoverTestSpringRetryTwo"
    )
    @Override
    public void testSpringRetry(String name, String address) throws BizException {
        log.info("姓名:{},地址:{}", name, address);
        //模拟报错
        if (StrUtil.equals(name, "张三")) {
            throw new BizException("出现异常");
        }
    }

参数说明:
【1】@Retryable:标注该方法出现异常,进行重试
【2】value:对哪种异常进行重试
【3】maxAttempts:最大重试次数,默认3
【4】backoff:重试策略,delay = 1000, multiplier = 2 延迟1秒(1000毫秒)进行第一次重试,后续每次延迟时间会以 multiplier 的倍数进行重试,示例为:1(1000毫秒)秒、2(1000*2)秒、4(2000*2)秒、8(4000*2)秒...以此类推进行重试
【5】recover:最大重试次数耗尽触发此方法。有多个异常回调方法时需要用此属性指定用哪个
【6】当重试次数耗尽依然抛出异常,可以通过 @Recover 方法进行失败回调、拿到参数进行手工处理

4、异常重试回调方法

使用 @Recover 标注重试回调方法

    @Recover
    public void recoverTestSpringRetryOne(Exception e, String name, String address) {
        log.info("recoverTestSpringRetryOne异常重试回调方法开始执行,参数为:姓名:{},地址:{}", name, address);
        log.info("此时可以把此参数记录到重试异常回调表中,以便后续通过定时任务调度补偿处理");
        log.error("异常消息:{}", e.getMessage());
        e.printStackTrace();
    }

    @Recover
    public void recoverTestSpringRetryTwo(Exception e, String name, String address) {
        log.info("recoverTestSpringRetryTwo异常重试回调方法开始执行,参数为:姓名:{},地址:{}", name, address);
        log.info("此时可以把此参数记录到重试异常回调表中,以便后续通过定时任务调度补偿处理");
        log.error("异常消息:{}", e.getMessage());
        e.printStackTrace();
    }

注意:
【1】@Recover 方法的返回类型必须与 @Retryable 方法的返回类型一致
【2】@Recover 方法的第一个参数必须是 Throwable 类型
【3】回调方法与重试方法必须在同一个实现类中
【4】如果一个实现类中有多个异常回调方法,在 @Retryable 中可以使用 recover 属性指定回调的方法名

5、验证结果:

c.h.m.m.t.s.impl.TestDailyServiceImpl    :46 - 姓名:张三,地址:上海
c.h.m.m.t.s.impl.TestDailyServiceImpl    :46 - 姓名:张三,地址:上海
c.h.m.m.t.s.impl.TestDailyServiceImpl    :46 - 姓名:张三,地址:上海
c.h.m.m.t.s.impl.TestDailyServiceImpl    :46 - 姓名:张三,地址:上海
c.h.m.m.t.s.impl.TestDailyServiceImpl    :46 - 姓名:张三,地址:上海
c.h.m.m.t.s.impl.TestDailyServiceImpl    :63 - recoverTestSpringRetryTwo异常重试回调方法开始执行,参数为:姓名:张三,地址:上海
c.h.m.m.t.s.impl.TestDailyServiceImpl    :64 - 此时可以把此参数记录到重试异常回调表中,以便后续通过定时任务调度补偿处理
c.h.m.m.t.s.impl.TestDailyServiceImpl    :65 - 异常消息:出现异常
BizException(code=null, message=出现异常)
	at com.hkl.mpjoin.modules.testdaily.service.impl.TestDailyServiceImpl.testSpringRetry(TestDailyServiceImpl.java:49)

从结果可以看出,符合重试策略的预期,重试5次后依然异常失败,进入失败回调方法结束

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/7474.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Node.js】Express框架的基本使用

✍️ 作者简介: 前端新手学习中。 &#x1f482; 作者主页: 作者主页查看更多前端教学 &#x1f393; 专栏分享&#xff1a;css重难点教学 Node.js教学 从头开始学习 目录 初识Express Express简介 什么是Express 进一步理解 Express Express能做什么 Express的基本使用 …

分享:如何给 DBA 减负?

欢迎访问 OceanBase 官网获取更多信息&#xff1a;https://www.oceanbase.com/ 本文来自OceanBase社区分享&#xff0c;仅限交流探讨。原作者肖杨&#xff0c;OceanBase 软件开发工程师。 研发、数据分析师及运维内部人员有数据查询、数据订正等需求&#xff0c;若无管控平台&…

Midjourney 使用总结

1.关键词提问 中国古典女性&#xff0c;东方美女极致面容站在运河码头遥望丈夫&#xff0c;史诗奇幻场景风格&#xff0c;深绿浅棕&#xff0c;细节风帆&#xff0c;柔焦&#xff0c;人像隐喻&#xff0c;4K&#xff0c;电影级高品质照片&#xff0c;全景图&#xff0c; 焦距 …

突破市场壁垒:如何利用关键词采集和市场调查找到你的细分市场?

在市场竞争日益激烈的今天&#xff0c;寻找一个适合自己的细分市场成为了每个企业和创业者的必要之举。然而&#xff0c;许多人在寻找细分市场时陷入了困境&#xff0c;不知道如何找到一个符合自己产品的市场&#xff0c;因此&#xff0c;在这种情况下&#xff0c;利用关键词采…

UVM response_handler和get_response机制

很多UVM用户平时更多的使用get_response()方式去获得uvm_driver的response&#xff0c;但get_response有些缺点&#xff1a;由于 get_response() 是一种阻塞方法&#xff0c;它会阻塞直到收到来自 UVM 驱动程序 (put_response()) 的响应。因此&#xff0c;如果我们使用 get_res…

CleanMyMac X4.20最新mac电脑优化工具好用吗?

如果你的Mac运行速度变慢&#xff0c;很有可能是因为RAM内存被过度占用了。本文将向Mac用户&#xff0c;尤其是小白用户归纳一些常见的Mac内存清理方法。通过释放RAM内存&#xff0c;你将会看到自己Mac的运行速度有显著提升。 你的Mac运行速度是否变得慢到让人抓狂&#xff1f;…

项目下载中心-超简单版解决方案

简单的下载中心的设计流程 直接上设计流程&#xff1a; 以上就是步骤了&#xff0c;至于每个步骤怎么实现&#xff0c;那方法就很多了 &#xff0c;随意&#xff0c;达到目的就行。 至于各种问题&#xff0c;比如队列性能&#xff0c;消息重复或丢失&#xff0c;等等&#…

130亿参数,8个A100训练,UC伯克利发布对话模型Koala

平替再平替&#xff0c;可以在消费级 GPU 上运行的 Koala 模型能实现 ChatGPT 一半的性能。 自从 Meta 发布并开源了 LLaMA 系列模型&#xff0c;来自斯坦福大学、UC 伯克利等机构的研究者们纷纷在 LLaMA 的基础上进行「二创」&#xff0c;先后推出了 Alpaca、Vicuna 等多个「…

Solon v2.2.7 发布,支持 Java 20

Solon 是一个高效的 Java 应用开发框架&#xff1a;更快、更小、更简单。也是一个有自己接口标准规范的开放生态。 150来个生态插件&#xff0c;覆盖各种不同的应用开发场景&#xff1a; 相对于 Spring Boot 和 Spring Cloud 的项目&#xff1a; 启动快 5 &#xff5e; 10 倍…

【无功优化】基于改进遗传算法的电力系统无功优化研究【IEEE30节点】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

4.5--计算机网络之基础篇--1.模型分层--(复习+深入)---好好沉淀,加油呀

1.TCP/IP模型的分层 1.1.为什么要有 TCP/IP 网络模型&#xff1f; 对于同一台设备上的进程间通信&#xff0c;有很多种方式&#xff0c;比如有管道、消息队列、共享内存、信号等方式&#xff1b; 而对于不同设备上的进程间通信&#xff0c;就需要网络通信&#xff0c;而设备是…

2021蓝桥杯真题大写 C语言/C++

题目描述 给定一个只包含大写字母和小写字母的字符串&#xff0c;请将其中所有的小写字母转换成大写字母后将字符串输出。 输入描述 输入一行包含一个字符串。 输出描述 输出转换成大写后的字符串。 输入输出样例 示例 输入 LanQiao 输出 LANQIAO 评测用例规模与约定 对于…

python 生成器、迭代器、动态新增属性及方法

目录 一、生成器 1、生成器定义 2、生成器存在的意义 3、创建生成器方式一&#xff08;生成器表达式&#xff09; 4. 创建生成器方式二&#xff08;生成器函数&#xff09; 1. 生成器函数 2. 生成器函数的工作原理 5. 总结 1. 什么是生成器 2. 生成器特点 二、迭代器…

365天深度学习训练营-第J8周:Inception v1算法实战与解析

目录 一、前言 二、论文解读 1. Inception 模块 2. 网络深度问题 3. 全局平均池化 4. 卷积层的并行结构 5. 1x1 卷积核 6.详细的网络结构 三、代码复现 一、前言 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#x…

微服务+springcloud+springcloud alibaba学习笔记【Eureka服务注册中心】(3/9)

Eureka服务注册中心 3/91、服务注册与发现1.1 什么是服务治理&#xff1a;1.2 什么是服务注册与发现&#xff1a;1.3 Eureka服务注册与发现2、单机版eureka2.1 创建module2.2改pom依赖2.3写yml配置文件:2.4主启动类2.5 修改服务提供者 cloud-provider-payment8001 模块&#xf…

Github库中的Languages显示与修改

目录 前言 【.gitattributes】文件 修改GitHub语言 前言 上传一个项目到GitHub时&#xff0c;发现显示的语言并非是自己项目所示的语言&#xff0c;这样的情况是经常发生的&#xff0c;为了能到达自己所需快速检索&#xff0c;或者是外部访问者能很好的搜索我们的项目&#…

Sentinel滑动时间窗限流算法原理及源码解析(中)

文章目录 MetricBucketMetricEvent数据统计的维度WindowWrap样本窗口实例 范型T为MetricBucket windowLengthInMs 样本窗口长度 windowStart 样本窗口的起始时间戳 value 当前样本窗口的统计数据 其类型为MetricBucket MetricBucket MetricEvent数据统计的维度 1、首先计算27t位…

【花雕学AI】09:发挥ChatGPT最大潜力——产生高质量内容的九种方法和建议

人工智能&#xff08;AI&#xff09;是当今科技领域最热门和最有前景的话题之一&#xff0c;它已经渗透到了我们生活和工作的方方面面&#xff0c;给我们带来了许多便利和惊喜。而在AI的众多分支中&#xff0c;自然语言处理&#xff08;NLP&#xff09;是最贴近人类的一个领域&…

6-python异常、错误、模块、包

文章目录1.异常2.错误3.模块4.包[综合练习]1.异常 打开一个不存在的文件会引发异常 FileNotFoundError: [Errno 2] No such file or directory: ‘D:/不存在的文件.txt’ fopen(file"D:/不存在的文件.txt",mode"r", encodingutf-8) print(f.read())&…

springboot-gateway注册nacos失败,控制台没有报错

目录 前言现象描述前言 最近springboot的gateway注册到nacos上,没有注册成功 现象描述 我是在common里面引入了nacos的依赖,依赖如下: <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-confi…