【Spring】如果你需要使用重试机制,请使用Spring官方的Spring Retry
文章目录
- 前言
- Spring Retry的基本使用
- 第一步,引入Spring Retry的jar包
- 第二步,构建一个RetryTemplate类
- 第三步,使用RETRY_TEMPLATE
- 注意事项
- 拓展方法
- 降级操作
- 重试策略:时间策略
- 重试策略:指定异常策略
前言
Spring Retry 是 Spring Framework 中的一个模块,提供了一种简单的方式来在应用程序中实现重试机制。
在应用程序中,如果遇到了一些不可避免的错误,比如网络连接失败、数据库连接失败等,我们通常需要对这些错误进行重试,以尝试解决这些问题。Spring Retry 提供了一个可插拔的、面向切面的重试框架,可以让我们很容易地在应用程序中实现重试机制。
Spring Retry 中最常用的类是 RetryTemplate,它提供了一个 execute 方法,可以让我们在方法调用失败时进行重试。RetryTemplate 中可以设置最大重试次数、重试间隔时间等参数。此外,还可以设置重试条件,如重试的异常类型、重试策略等。
今天我们来讲一下Spring Retry
Spring Retry的基本使用
第一步,引入Spring Retry的jar包
<dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId><version>1.3.1</version>
</dependency>
第二步,构建一个RetryTemplate类
这段代码展示了如何使用Spring Retry库创建一个RetryTemplate实例来进行重试操作。该实例最多进行3次尝试,每次重试的时间间隔会指数级增长,最大可达10分钟,重试只会在ArithmeticException异常发生时进行。
private static final RetryTemplate RETRY_TEMPLATE = RetryTemplate.builder().maxAttempts(3).exponentialBackoff(5000, 3, 600000L).retryOn(ArithmeticException.class).build();
第三步,使用RETRY_TEMPLATE
Boolean test2 = RETRY_TEMPLATE.execute((RetryCallback<Boolean, ArithmeticException>) context -> {System.out.println("test" + context.getRetryCount());int i = 1 / 0;System.out.println("test2");return Boolean.FALSE;});System.out.println(test2);
使用 RETRY_TEMPLATE.execute 方法执行一个 RetryCallback,里面放置需要重试的逻辑代码。这段示例代码中,在逻辑代码中将会抛出 ArithmeticException 异常,然后框架会自动尝试重试,最终返回 Boolean.FALSE。
这里的运行结果为
在这个具体的例子中,返回true或者false的区别在于当RetryTemplate达到最大重试次数时,如果RetryCallback的执行结果为true,则RetryTemplate会认为重试成功并结束重试;
如果RetryCallback的执行结果为false,则RetryTemplate会认为重试失败并抛出RetryException异常。
总的来说,true表示成功,false表示失败。但是需要根据具体的场景和语义来确定具体的含义。在这个例子中,返回true表示重试成功,返回false表示重试失败。即test2的值。
注意事项
需要注意的是context.getRetryCount()的值是从0开始的,如果maxAttempts设置为3的话,那就最大值为3-1=2
所以我们可以根据该方法进行业务的判断
值得注意的是,retryOn()只会重试指定类型的错误以及其子类,并且当抛出的错误类型为非运行是异常的情况需要在方法上面抛出
另外,我们可以捕获对应的异常,并且在catch中抛出且可以进行业务的控制
拓展方法
RetryTemplate是Spring Retry提供的核心类,可以用来进行方法调用的重试操作。除了上面提到的execute()方法,RetryTemplate还提供了其他一些常用的方法和配置选项,下面介绍一些常见的用法:
降级操作
execute(RetryCallback<T, E> retryCallback, RecoveryCallback recoveryCallback):除了可以传入一个RetryCallback接口,执行需要重试的方法调用外,还可以传入一个RecoveryCallback接口,用于在重试次数达到上限后执行降级操作。RecoveryCallback接口提供一个recover(RetryContext context)方法,可以在该方法中实现降级逻辑。例如:
RetryTemplate retryTemplate = RetryTemplate.builder().maxAttempts(3).build();retryTemplate.execute((RetryCallback<Void, RuntimeException>) context -> {// 需要重试的方法调用someService.someMethod();return null;
}, (RecoveryCallback<Void>) context -> {// 重试次数达到上限后执行降级操作fallbackService.fallbackMethod();return null;
});
重试策略:时间策略
setBackOffPolicy(BackOffPolicy backOffPolicy):设置重试策略,即在每次重试之间的等待时间策略。BackOffPolicy接口提供了多个实现类,例如ExponentialBackOffPolicy、FixedBackOffPolicy等。例如:
ExponentialBackOffPolicy backOffPolicy = new ExponentialBackOffPolicy();
backOffPolicy.setInitialInterval(1000); // 初始等待时间1000ms
backOffPolicy.setMultiplier(2.0); // 每次重试等待时间乘以2
backOffPolicy.setMaxInterval(60000); // 最大等待时间60000msRetryTemplate retryTemplate = RetryTemplate.builder().maxAttempts(3).backOffPolicy(backOffPolicy).build();retryTemplate.execute((RetryCallback<Void, RuntimeException>) context -> {// 需要重试的方法调用someService.someMethod();return null;
});
重试策略:指定异常策略
setRetryPolicy(RetryPolicy retryPolicy):设置重试策略,即在哪些异常情况下进行重试。RetryPolicy接口提供了多个实现类,例如SimpleRetryPolicy、TimeoutRetryPolicy、CompositeRetryPolicy等。例如:
SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
retryPolicy.setMaxAttempts(3); // 最大重试次数RetryTemplate retryTemplate = RetryTemplate.builder().retryPolicy(retryPolicy).build();retryTemplate.execute((RetryCallback<Void, RuntimeException>) context -> {// 需要重试的方法调用someService.someMethod();return null;
});
RetryPolicy和RetryOn都是Spring Retry中的重试机制,但它们的作用略有不同。
RetryPolicy用于定义重试策略,即在发生异常时应该如何重试,它包括重试的次数、重试的间隔时间、是否需要使用指数退避等信息。在RetryTemplate中,我们可以使用RetryPolicy来创建一个重试模板。
RetryOn用于定义哪些异常会触发重试,即重试的条件。在RetryTemplate中,我们可以使用RetryOn来指定需要重试的异常类型。通常,我们使用RetryOn来定义需要重试的异常类型,并使用RetryPolicy来定义重试策略。
总体来说,RetryOn和RetryPolicy是配合使用的,RetryOn指定需要重试的异常类型,RetryPolicy定义重试策略。这样,当指定的异常类型发生时,RetryTemplate就会根据定义的重试策略进行重试。
Spring Retry为我们提供了丰富的配置选项,允许我们根据具体需求定制重试策略和回退逻辑。无论是简单的定时重试,还是根据异常类型进行有条件的重试,Spring Retry都能灵活满足我们的各种需求。
在使用Spring Retry时,建议根据实际场景仔细选择重试策略,合理设置最大重试次数和重试间隔,以免对系统和依赖造成不必要的压力。同时,对于一些不可恢复的错误,我们也应该考虑合理的异常处理策略,避免陷入无限重试的死循环。
总的来说,Spring Retry是一个强大且易于使用的工具,可以帮助我们有效应对应用程序中的不稳定性。
相关文章:
![](https://img-blog.csdnimg.cn/4cd83fe8357249759da89ed48a550405.png)
【Spring】如果你需要使用重试机制,请使用Spring官方的Spring Retry
文章目录 前言Spring Retry的基本使用第一步,引入Spring Retry的jar包第二步,构建一个RetryTemplate类第三步,使用RETRY_TEMPLATE注意事项 拓展方法降级操作重试策略:时间策略重试策略:指定异常策略 前言 Spring Retr…...
![](https://www.ngui.cc/images/no-images.jpg)
pagehelper 优化自定义分页和排序位置
pagehelper开源地址 https://github.com/pagehelper/Mybatis-PageHelper 1.手写Count查询优化 源码分页count时首先是判断是否存在手写的 {业务查询id}_COUNT 的查询count统计 private Long count(Executor executor, MappedStatement ms, Object parameter,RowBounds rowBound…...
![](https://www.ngui.cc/images/no-images.jpg)
Linux下查询文件夹中文件数量的方法
一、前言 在Linux系统中,我们经常需要查询文件夹中包含多少文件。本文将介绍三种在Linux中查询文件夹中文件数量的方法,帮助你轻松获取所需信息。 二、方法 1、使用ls命令和wc命令 使用ls命令的-l选项和管道操作符|结合wc命令来统计文件数量…...
![](https://img-blog.csdnimg.cn/img_convert/baf657c8d28fab8a018a3d687cb9074c.jpeg)
PS透明屏,在科技展示中,有哪些优点展示?
PS透明屏是一种新型的显示技术,它将传统的显示屏幕与透明材料相结合,使得屏幕能够同时显示图像和透过屏幕看到背后的物体。 这种技术在商业展示、广告宣传、产品展示等领域有着广泛的应用前景。 PS透明屏的工作原理是利用透明材料的特性,通…...
![](https://www.ngui.cc/images/no-images.jpg)
Hbase-面试题
1. Hbase-region切分 自动切分,默认情况下 2.0版本,第一次region的数据达到256M,会进行切分,以后就是每达到10G切分一次,切分完成后,会进行负载均衡,均衡到其他regionserver预分区自定义rowke…...
![](https://img-blog.csdnimg.cn/593c5b7c421f4e338561911b5458538e.png)
图的宽度优先深度优先遍历
图常见的遍历方式有两种,一种是宽度优先遍历,一种是深度优先遍历。 宽度优先遍历 宽度优先遍历和之前介绍的二叉树的层级遍历类似,主要也是利用Queue来完成层级的遍历,除此之外,因为图中很可能有环,所以还…...
![](https://www.ngui.cc/images/no-images.jpg)
redis Set类型命令
Redis中的Set是一种无序、不重复的集合数据结构,它提供了一系列的操作命令用于对Set进行添加、删除和查找等操作。以下是Redis中Set类型常见的一些命令: SADD key member [member …]:将一个或多个成员添加到指定的集合中。 示例:…...
![](https://img-blog.csdnimg.cn/da99e79627664d6ebcac6683a7026447.png)
Netty框架自带类DefaultEventExecutorGroup的作用,用来做业务的并发
一、DefaultEventExecutorGroup的用途 DefaultEventExecutorGroup 是 Netty 框架中的一个类,用于管理和调度事件处理器(EventExecutor)的组。在 Netty 中,事件处理是通过多线程来完成的,EventExecutor 是处理事件的基…...
![](https://img-blog.csdnimg.cn/6ddb4715ce634c5bb74ba33c0bf0588c.png)
TCP的四次挥手与TCP状态转换
文章目录 四次挥手场景步骤TCP状态转换 四次挥手场景 TCP客户端与服务器断开连接的时候,在程序中使用close()函数,会使用TCP协议四次挥手。 客户端和服务端都可以主动发起。 因TCP连接时候是双向的,所以断开的时候也是双向的。 步骤 三次…...
![](https://img-blog.csdnimg.cn/f7a89d814cae4fb4be841c34dcef9a3a.png)
【网络编程】实现一个简单多线程版本TCP服务器(附源码)
TCP多线程 🌵预备知识🎄 Accept函数🌲字节序转换函数🌳listen函数 🌴代码🌱Log.hpp🌿Makefile☘️TCPClient.cc🍀TCPServer.cc🎍 util.hpp 🌵预备知识 &…...
![](https://www.ngui.cc/images/no-images.jpg)
centos离线部署docker
有些内部环境需要离线部署,以下做一些备忘。 环境:centos7.9 准备文件: docker-20.10.9.tgz,下载地址 https://download.docker.com/linux/static/stable/x86_64/docker.service,内容见下文daemon.json,内…...
![](https://img-blog.csdnimg.cn/img_convert/edbe886599a1c07385847a169dc67809.png)
ffmpeg使用滤镜对视频进行处理播放
一、前言 在现代的多媒体处理中,视频和音频滤镜起着至关重要的作用。可以帮助开发者对视频和音频进行各种处理,如色彩校正、尺寸调整、去噪、特效添加等。而FFmpeg作为一个功能强大的开源多媒体框架,提供了丰富的滤镜库,使我们能够轻松地对多媒体文件进行处理和转换。 本…...
![](https://www.ngui.cc/images/no-images.jpg)
Ansible Handlers模块详解,深入理解Ansible Handlers 自动化中的关键组件
深入理解Ansible Handlers 自动化中的关键组件 在现代的IT环境中,自动化已经成为提高效率和减少错误的关键。Ansible作为一款流行的自动化工具,通过使用Playbooks来定义和执行任务。而Handlers作为Ansible的组件之一,在自动化过程中发挥着重要…...
![](https://img-blog.csdnimg.cn/img_convert/92c86ff9421949a9c7d1fd796aa623dc.png)
threejs点击模型实现模型边缘高亮的选中效果--更改后提高帧率
先来个效果图 之前写的那个稍微有点问题,帧率只有30,参照官方代码修改后,帧率可以达到50了,在不全屏的状态下,帧率60 1.首先需要导入库 // 用于模型边缘高亮 import { EffectComposer } from "three/examples/js…...
![](https://img-blog.csdnimg.cn/img_convert/963afe559914449221e78482ec7d474a.png)
RocketMQ 主备自动切换模式部署
目录 主备自动切换模式部署 Controller 部署 Controller 嵌入 NameServer 部署 Controller 独立部署 Broker 部署 兼容性 升级注意事项 主备自动切换模式部署 该文档主要介绍如何部署支持自动主从切换的 RocketMQ 集群,其架构如上图所示ÿ…...
![](https://www.ngui.cc/images/no-images.jpg)
【MySQL】select相关
文章目录 迭代器distinct 关键字limit offset 关键字order by 列名 asc\descselect语句的执行顺序几点注意 迭代器 指向第一个元素 使用hasNext()进行判断后才进行取元素 resultSet:指向第一个元素前一个 distinct 关键字 去除一列中的重复元素 可以进行多行的去重…...
![](https://www.ngui.cc/images/no-images.jpg)
在Python中应用RSA算法实现图像加密:基于Jupyter环境的详细步骤和示例代码
一、引言 在当今的数字化社会中,信息安全问题备受关注。随着数字图像在生活中的应用越来越广泛,图像的安全性和隐私性也成为人们关心的焦点。如何在网络上安全地传输和存储图像已经成为一项重要的挑战。RSA(Rivest-Shamir-Adleman)算法作为一种被广泛应用的公钥密码体系,…...
![](https://www.ngui.cc/images/no-images.jpg)
Prometheus Blackbox Exporter 的 HTTP 探测指标中各个阶段的时间统计信息
在 Prometheus Blackbox Exporter 的 HTTP 探测指标中,probe_http_duration_seconds 指标包含各个阶段的时间统计信息。这些阶段代表了 HTTP 探测的不同阶段和指标。以下是各个阶段的含义: phase"dns_lookup":这是指进行 DNS 查找…...
![](https://img-blog.csdnimg.cn/2a7599d6ef0d40f3a6261e87eefab903.jpeg)
数据结构之时间复杂度-空间复杂度
大家好,我是深鱼~ 目录 1.数据结构前言 1.1什么是数据结构 1.2什么是算法 1.3数据结构和算法的重要性 1.4如何学好数据结构和算法 2.算法的效率 3.时间复杂度 3.1时间复杂度的概念 3.2大O的渐进表示法 【实例1】:双重循环的时间复杂度…...
![](https://img-blog.csdnimg.cn/48713a77bee94085af071001f6d33ef2.png)
新一代构建工具 maven-mvnd
新一代构建工具 maven-mvnd mvnd的前世今生下载安装 mvndIDEA集成 mvnd的前世今生 maven 作为一代经典的构建工具,流行了很多年,知道现在依然是大部分Java项目的构建工具的首选;但随着项目复杂度提高,代码量及依赖库的增多使得ma…...
![](https://img-blog.csdnimg.cn/1bfe5b4d011b466e8c2abc0a55bcb9f5.png)
构建Docker容器监控系统(2)(Cadvisor +Prometheus+Grafana)
Cadvisor产品简介 Cadvisor是Google开源的一款用于展示和分析容器运行状态的可视化工具。通过在主机上运行Cadvisor用户可以轻松的获取到当前主机上容器的运行统计信息,并以图表的形式向用户展示。 接着上一篇来继续 部署Cadvisor 被监控主机上部署Cadvisor容器…...
![](https://www.ngui.cc/images/no-images.jpg)
Leetcode.995 K 连续位的最小翻转次数
题目链接 Leetcode.995 K 连续位的最小翻转次数 rating : 1835 题目描述 给定一个二进制数组 n u m s nums nums 和一个整数 k k k 。 k k k位翻转 就是从 n u m s nums nums 中选择一个长度为 k k k 的 子数组 ,同时把子数组中的每一个 0 0 0 都改成 1 1 1 …...
![](https://img-blog.csdnimg.cn/img_convert/4f0c7bac56d9ee08dda487d79ab09031.jpeg)
PHP8的跳转语句-PHP8知识详解
如果循环条件满足的时候,则程序会一直执行下去。如果需要强制跳出循环,则需要使用跳转语句来完成。PHP8的跳转语句包括break语句、continue语句和goto语句。 1、break语句 break语句的作用是完全终止循环,包括while、do…while、for、switch…...
![](https://img-blog.csdnimg.cn/4cc6b9b5d70f4fa081f5231c144445b0.png)
Idea中maven无法下载源码
今天在解决问题的时候想要下载源码,突然发现idea无法下载,这是真的蛋疼,没办法查看原因,最后发现问题的原因居然是因为Maven,由于我使用的idea的内置的Bundle3的Maven,之前没有研究过本地安装和内置的区别&…...
【linux-keepalive】keepalive避免单点故障,高可用配置
keepalive: [rootproxy ~]# yum install -y keepalived [rootproxy ~]# vim /etc/keepalived/keepalived.conf global_defs {router_id proxy1 //设置路由ID号vrrp_iptables //不添加任何防火墙规则 } vrrp_instance V…...
![](https://www.ngui.cc/images/no-images.jpg)
测试网络模型的FLOPs和params
概念 FLOPS:注意全大写,是floating point operations per second的缩写,意指每秒浮点运算次数,理解为计算速度。是一个衡量硬件性能的指标。 FLOPs:注意s小写,是floating point operations的缩写…...
![](https://www.ngui.cc/images/no-images.jpg)
《树莓派项目实战》第十五节 使用L298N驱动板模块驱动双极42步进电机
目录 15.1 双极步进电机引脚介绍 15.2 连接到树莓派 15.3 编写代码驱动步进电机 在本节,我们将学习如何使用L298N驱动板驱动一个双极42步进电机。该项目涉及到的材料有: 树莓派...
![](https://img-blog.csdnimg.cn/4079de6a638b4452b5492dcaf61b0eaa.png#pic_center)
基于短信宝API零代码实现短信自动化业务
场景描述: 基于短信宝开放的API能力,实现在特定事件(如天气预警)或定时自动发送短信(本文以定时群发短信为例)。通过Aboter平台如何实现呢? 使用方法: 首先创建一个IPaaS流程&…...
![](https://img-blog.csdnimg.cn/8c729451dabb47ea8bfdeb1f430393b5.png)
Qt应用开发(基础篇)——信号槽 Signals and Slots
一、前言 Qt成为我们今天拥有的灵活而舒适的工具,除了友好和能够快速开发设计师界面,信号槽机制是最大的核心特征,也是区别于其他开发框架最大的优势。 Qt的信号槽作用于两个对象之间的通信。当一个对象发生了改变,它希望其他关心…...
![](https://www.ngui.cc/images/no-images.jpg)
正则表达式--Notepad++常用的替换
原文网址:正则表达式--Notepad常用的替换_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Notepad使用正则表达式进行替换时的常用的一些示例。 服务器JSON的格式化 例1:将回车去掉,改为正确的JSON格式 搜索: ([^,])(\r)(\n)(\s) 替…...
简述企业网站建设的主要步骤/免费域名注册永久
云和恩墨大咖系列报道 2019数据技术嘉年华于11月16日在京落下了帷幕。大会历时两天,来自全国各地上千名学术精英、数据库领袖人物、数据库专家、技术爱好者在这里汇聚一堂,围绕“开源 • 智能 • 云数据 - 自主驱动发展 创新引领未来”的大会…...
40个靠谱免费网站/友情链接购买
出自:云技术尊敬的微盟商户:截止到3月1日晚8点,在腾讯云团队协助下,经过7*24小时的努力,我们数据已经全面找回,由于此次数据量规模非常大,为了保证数据一致性和线上体验,我们将于3月…...
![](https://img-blog.csdnimg.cn/img_convert/2486d81551f949f0568e235e795d9673.png)
武汉网站制作制作/安卓在线视频嗅探app
Java集合体系 Collection 接口:该接口是最基本的集合接口List 接口:列表Set 接口:数学概念的集合Map 接口:包含键值对,Map 不能包含重复的键。SortedMap 是一个按升序排列的 Map 集合。 简化图: 说明&#…...
![](/images/no-images.jpg)
网站建设文化服务/推广普通话的宣传标语
django-创建表的字段属性,表关系 表的各种属性文档:null char ..., django与之对应的文档 https://docs.djangoproject.com/en/1.11/ref/models/fields/ 英文https://yiyibooks.cn/xx/Django_1.11.6/ref/models/fields.html 中文表关…...
![](/images/no-images.jpg)
360网站备案查询/广州seo托管
5月8日消息,据《财富》网站报道,研究人员认为,一些流行的智能手机可能会过于紧密地监听用户的活动。 来自德国布伦瑞克工业大学(TUBS)的一个研究团队发现,有234款Android应用包含了被称为SilverPush的代码,用于监听嵌入…...
![](/images/no-images.jpg)
专门做护肤品的网站是/上海seo网站推广
Linux chmod命令详解 chmod----改变一个或多个文件的存取模式(mode)chmod [options] mode files只能文件属主或特权用户才能使用该功能来改变文件存取模式。mode可以是数字形式或以who opcode permission形式表示。who是可选的,默认是a(所有用户)。只能选择一个opco…...