SpringBoot中如何优雅地使用重试

1 缘起

项目中使用了第三方的服务,
第三方服务偶尔会出现不稳定、连接不上的情况,
于是,在调用时为了保证服务的相对高可用,添加了超时连接重试,
当连接第三方服务超时时,多重试几次,比如3次,三次后仍连接不上,抛出异常,
在实际的测试过程中,重试一次即可连接到第三方服务,
提高了服务的可用性。

2 spring-retry

Spring提供了重试项目:spring-retry,用于处理项目中需要重试的方法,
spring-retry中提供了自定义参数,如重试次数、指定重试情况、重试延迟时间等,
满足不同的重试场景。

2.1 小插曲:试错过程

搜索SpringBoot如何使用重试注解时,发现需要使用spring-retry这个项目,在Maven仓库搜索了一下spring-retry,发现有多个版本,如下图,选择了最新版本2.0.4,启动项目时发现,无法运行。
环境:
Java8
SpringBoot2.4.5

在这里插入图片描述

<!-- https://mvnrepository.com/artifact/org.springframework.retry/spring-retry -->
<dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId><version>2.0.4</version>
</dependency>

异常信息如下,版本不一致,进入spring-retry项目,查看项目配置。
在这里插入图片描述
java: 无法访问org.springframework.retry.annotation.Backoff
错误的类文件: /D:/install/maven/apache-maven-3.8.8/my-repository/org/springframework/retry/spring-retry/2.0.4/spring-retry-2.0.4.jar!/org/springframework/retry/annotation/Backoff.class
类文件具有错误的版本 61.0, 应为 52.0
请删除该文件或确保该文件位于正确的类路径子目录中。

查看spring-retry项目的配置文件,发现java版本为17,所以,使用java8无法启动项目,
因此,需要选择spring-retry对应Java8的版本。
在这里插入图片描述

2.2 正确过程

2.2.1 配置依赖

不指定spring-retry版本,Maven会自动下载合适的版本,本次自动下载的版本为1.3.1。

<!-- https://mvnrepository.com/artifact/org.springframework.retry/spring-retry -->
<dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId>
</dependency>

在这里插入图片描述

2.2.2 重试注解@Retryable

为方法添加@Retryable注解,即可在方法遇到异常时,重试指定次数。
在这里插入图片描述

常用参数如下,如有其他开发需求,可继续查看源码中的其他参数。

序号参数描述
1value触发重试的异常情况
2maxAttempts最大重试次数,默认重试3次
3backoff补偿机制,delay重试延迟时间,单位:毫秒;multiplier延迟时间比例,延迟的具体时间为delay*multiplier(multiplier>0时生效,默认multiplier为0),当multiplier为0时,延迟时间即为delay

2.2.3 添加启动注解@EnableRetry

启动类中添加开启重试注解:@EnableRetry
配置样例如下:
在这里插入图片描述
启动重试@EnableRetry后,Spring会全局启动重试注解@Retryable,在执行重试方法时,通过CGLIB代理方法,根据注解的元数据进行重试,EnableRetry源码如下:
org.springframework.retry.annotation.EnableRetry
在这里插入图片描述

2.2.4 测试重试

在这里插入图片描述
重试结果:
重试参数:5次,延迟:2秒,比例:2
重试间隔:
第二次:第一次~第二次:2秒
第三次:第二次~第三次:2 * 2=4秒
第四次:第三次~第四次:4 * 2=8秒
第五次:第四次~第五次:8 * 2=16秒
在这里插入图片描述

3 小结

(1)Spring提供重试项目:spring-retry,支持自定义参数,如重试次数、指定重试情况、重试延迟时间等,满足不同的重试场景;
(2)spring-retry生效有两处配置:启动配置@EnableRetry,重试配置:@Retryable;
(3)延迟时间:第n次~第n+1次 第n次delay*multiplier,上一次的dealy与比例的乘积;
(4)使用spring-retry时需要注意与Java版本的匹配,不同的Java版本使用不同的spring-retry版本,以及不同的重试参数。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言基础篇5:指针(一)

指针是C语言的核心、精髓所在&#xff0c;用好了指针可以在C语言编程中起到事半功倍的效果。指针一方面可以提高程序的编译效率和执行速度&#xff0c;而且还可以通过指针实现动态的存储分配&#xff0c;另一方面使用指针可使程序更灵活&#xff0c;便于表示各种数据结构&#…

Chrome浏览器显示overleaf布局混乱

Chrome浏览器显示overleaf布局混乱 Abstract overleaf在mac chrome上布局显示混乱&#xff0c;如下图&#xff1a; 最终解决方案是更换浏览器至safari&#xff0c;结果就显示正常了。 总结反思 不在一个地方死磕&#xff0c;有的时候可以换个思路解决问题。

车联网安全漏洞管理深度解读

2021-09-17 19:38:20 来源: 中国大数据平台 今日&#xff08;2021年9月16日&#xff09;&#xff0c;工信部发布《关于加强车联网网络安全和数据安全工作的通知》&#xff08;下称“《通知》”&#xff09;&#xff0c;强调加强智能网联汽车、车联网网络、车联网服务平台以…

【2021研电赛】基于EAIDK-310的行人识别和红绿灯识别小车by IFIC_Team

本作品介绍参与极术社区的有奖征集|分享研电赛作品扩大影响力&#xff0c;更有重磅电子产品免费领取! 团队介绍 参赛单位&#xff1a;西安交通大学 参赛队伍&#xff1a;IFIC_Team 指导教师&#xff1a;司刚全教授 参赛队员&#xff1a;李荆辉 王宁 童道心 1.作品简介 近年来…

【腾讯云云上实验室】用向量数据库—实践相亲社交应用

快速入口 &#x1f449;向量数据库_大模型知识库_向量数据存储_向量数据检索- 腾讯云 (tencent.com) 文章目录 前言1. 向量数据库概念及原理1.1 向量数据库概念1.2 向量数据库核心原理1.3 向量数据库优缺点1.4 向量数据库与传统数据库的区别 2. 腾讯云向量数据库的基本特性及优…

其利天下技术总监冯建武受邀出席“2023年电子工程师大会”并作主题演讲

2023年11月23日&#xff0c;由华秋电子发烧友主办的“2023年电子工程师大会暨第三届社区年度颁奖活动”在深圳新一代产业园成功举行。本次年度颁奖活动邀请了高校教授、企业高管、行业专家、资深电子工程师等共300多人出席。聚焦“电机驱动技术”、“开源硬件”、“OpenHarmony…

边缘计算网关:智能制造的“智慧大脑”

一、智能制造的崛起 随着科技的飞速发展&#xff0c;智能制造已经成为了制造业的新趋势。智能制造不仅能够提高生产效率&#xff0c;降低生产成本&#xff0c;还能够实现个性化定制&#xff0c;满足消费者多样化的需求。然而&#xff0c;智能制造的实现离不开大量的数据处理和分…

SSM实践基地管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 SSM 实践基地管理系统是一套完善的信息系统&#xff0c;结合springMVC框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库 &#xff0c;系统主要采用B/…

关于高斯核是实现尺度空间变换的唯一性思考

受到自己的启发&#xff0c;唯一性证明有了思路&#xff1a; 谁的一阶导数是自己&#xff0c;exp&#xff08;x&#xff09;&#xff0c;只有是自己&#xff0c;才能保持自己在其中。 为什么不能是exp&#xff08;x&#xff09;呢&#xff1f;不变导致图像不会模糊&#xff0…

详解Python对Excel处理

Excel是一种常见的电子表格文件格式&#xff0c;广泛用于数据记录和处理。Python提供了多个第三方库&#xff0c;可以方便地对Excel文件进行读写、数据操作和处理。本文将介绍如何使用Python对Excel文件进行处理&#xff0c;并提供相应的代码示例和详细说明。 一、安装第三方库…

位图(bitset)和布隆过滤器

位图将数字映射到比特位上&#xff0c;用0&#xff0c;1来表示数据存在与否。 适用场景&#xff1a;大量数据(2^32次方约为40亿数据&#xff0c;0.5GB)&#xff0c;判断存在与否。 template<size_t N> class Bitset { public:Bitset(){// 在x86下size_t表示四个字节&am…

accelerate的使用说明

1 多卡(GPU)使用方法 终端输入指令&#xff0c;生成问答页面 accelerate config 这个方法也是可以的 2 后面修改直接找到这个yaml文件进行修改即可 cd ~/.cache/huggingface/accelerate vim default_config.yaml 进入vim进行修改 3 单卡(GPU)使用方法 vim default_config.…