重学SpringBoot3-Spring Retry实践
更多SpringBoot3内容请关注我的专栏:《SpringBoot3》
期待您的点赞??收藏评论
重学SpringBoot3-Spring Retry实践
- 1. 简介
- 2. 环境准备
- 3. 使用方式
-
- 3.1 注解方式
-
- 基础使用
- 自定义重试策略
- 失败恢复机制
- 重试和失败恢复效果
- 注意事项
- 3.2 编程式使用
- 3.3 监听重试过程
-
- 监听重试效果
- 4. 最佳实践
- 5. 总结
1. 简介
Spring Retry是Spring生态系统中的一个重要组件,它提供了自动重试失败操作的能力。在分布式系统中,由于网络抖动、服务暂时不可用等临时性故障,重试机制显得尤为重要。本文将详细介绍如何在 SpringBoot 3 应用中集成和使用 Spring Retry。
2. 环境准备
首先在 SpringBoot 3 项目中添加必要的依赖:
<dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId><version>2.0.5</version>
</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>6.1.13</version>
</dependency>
在启动类或配置类上添加 @EnableRetry 注解以启用重试功能:
@SpringBootApplication
@EnableRetry
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
3. 使用方式
3.1 注解方式
基础使用
最简单的使用方式是通过 @Retryable 注解:
@Service
public class UserService {@Retryablepublic void riskyOperation() {// 可能失败的操作}
}
自定义重试策略
可以通过 @Retryable 注解的参数来自定义重试行为:
@Service
@Slf4j
public class EmailServiceImpl implements IEmailService {@Resourceprivate JavaMailSender mailSender;@Value("${spring.mail.username}")private String from;/*** 发送简单文本邮件** @param to* @param subject* @param text*/@Override@Retryable(retryFor = MailSendException.class, maxAttempts = 3, backoff = @Backoff(delay = 1000))public void sendSimpleEmail(String to, String subject, String text) {try {SimpleMailMessage message = new SimpleMailMessage();message.setFrom(from);message.setTo(to);message.setSubject(subject);message.setText(text);mailSender.send(message);log.info("Simple email sent successfully to: {}", to);} catch (Exception e) {log.error("Failed to send simple email", e);throw new MailSendException("Failed to send email", e);}}
}
当执行发生指定异常,将会尝试进行重试,一旦达到最大尝试次数,但仍有异常发生,就会抛出 ExhaustedRetryException。重试最多可进行三次,两次重试之间的延迟时间默认为一秒。
失败恢复机制
使用 @Recover 注解定义重试失败后的恢复方法:
/*** 发送简单文本邮件** @param to* @param subject* @param text*/@Override@Retryable(retryFor = MailSendException.class, // 指定异常类型maxAttempts = 3, // 最大重试次数backoff = @Backoff(delay = 1000) // 指定退避策略,例如延迟时间)public void sendSimpleEmail(String to, String subject, String text) {try {SimpleMailMessage message = new SimpleMailMessage();message.setFrom(from);message.setTo(to);message.setSubject(subject);message.setText(text);mailSender.send(message);log.info("Simple email sent successfully to: {}", to);} catch (Exception e) {log.error("Failed to send simple email", e.getMessage());throw new MailSendException("Failed to send email", e);}}@Recoverpublic void recover(MailSendException e, String param) {// 处理最终失败的情况log.error("Final recovery : {}", param);}
重试和失败恢复效果

注意事项
注意@Recover 失效的情况:
- @Recover 方法的参数类型与实际异常不匹配;
- @Recover 方法的返回类型与 @Retryable 方法不一致;
- @Recover 方法的其他参数与 @Retryable 方法参数不匹配。
3.2 编程式使用
除了注解方式,Spring Retry 还提供了 RetryTemplate 用于编程式重试:
@Configuration
public class RetryConfig {@Beanpublic RetryTemplate retryTemplate() {RetryTemplate template = new RetryTemplate();// 配置重试策略SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();retryPolicy.setMaxAttempts(3);// 配置退避策略FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy();backOffPolicy.setBackOffPeriod(1000L);template.setRetryPolicy(retryPolicy);template.setBackOffPolicy(backOffPolicy);return template;}
}
使用RetryTemplate:
@Service
public class UserService {@Autowiredprivate RetryTemplate retryTemplate;public void executeWithRetry() {retryTemplate.execute(context -> {// 需要重试的业务逻辑return null;});}
}
3.3 监听重试过程
通过实现RetryListener接口,可以监听重试的整个生命周期:
public class CustomRetryListener extends RetryListenerSupport {@Overridepublic <T, E extends Throwable> void onError(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {// 记录错误日志log.error("Retry error occurred", throwable);}@Overridepublic <T, E extends Throwable> void close(RetryContext context,RetryCallback<T, E> callback, Throwable throwable) {// 重试结束时的处理log.info("Retry completed");}
}
将监听器注册到RetryTemplate:
@Configuration
public class RetryConfig {@Beanpublic RetryTemplate retryTemplate() {RetryTemplate template = new RetryTemplate();// ... 其他配置 ...template.registerListener(new CustomRetryListener());return template;}
}
监听重试效果

4. 最佳实践
-
明确重试场景:只对临时性故障使用重试机制,对于业务错误或永久性故障应直接失败。
-
设置合理的重试次数:通常3-5次即可,过多的重试可能会加重系统负担。
-
使用退避策略:建议使用指数退避策略(ExponentialBackOffPolicy),避免立即重试对系统造成冲击。
-
添加监控和日志:通过RetryListener记录重试情况,便于问题排查。
-
设置超时时间:避免重试过程持续时间过长。
5. 总结
Spring Retry为Spring应用提供了强大而灵活的重试机制,既可以通过注解优雅地实现重试,也可以使用RetryTemplate进行更细粒度的控制。在实际应用中,合理使用重试机制可以提高系统的健壮性和可用性。
需要注意的是,重试机制并非万能药,在使用时要根据具体场景选择合适的重试策略,并做好监控和告警,以便及时发现和处理问题。
相关文章:
重学SpringBoot3-Spring Retry实践
更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞??收藏评论 重学SpringBoot3-Spring Retry实践 1. 简介2. 环境准备3. 使用方式 3.1 注解方式 基础使用自定义重试策略失败恢复机制重试和失败恢复效果注意事项 3.2 编程式使用3.3 监听重试过程 监…...
TiDB 和 MySQL 的关系:这两者到底有什么不同和联系?
TiDB 和 MySQL 的关系:这两者到底有什么不同和联系? 在了解 TiDB 和 MySQL 之间的关系时,很多人可能会有疑问:这两个数据库到底有什么区别和联系?是不是 TiDB 就是 MySQL 的升级版?或者 TiDB 是一种“替代…...
【Java】JDK17的下载安装(与JDK1.8相互切换)
本文以参考以下链接为主:JDK17 如果上述操作不生效,请看以下操作: 添加以下变量并移动到最上面即可...
CSS3 3D 转换介绍
CSS3 中的 3D 转换提供了一种在二维屏幕上呈现三维效果的方式,主要包括translate3d、rotate3d、scale3d等转换函数,下面来详细介绍: 1. 3D 转换的基本概念 坐标系 在 CSS3 的 3D 空间中,使用的是右手坐标系。X 轴是水平方向&…...
Vue3 Element-Plus el-tree 右键菜单组件
参考代码:实现Vue3Element-Plus(tree、table)右键菜单组件 这篇文章的代码确实能用,但是存在错误,修正后的代码: <template><div style"text-align: right"><el-icon size"12" color"#…...
鸿蒙学习构建视图的基本语法(二)
一、层叠布局 // 图片 本地图片和在线图片 Image(https://developer.huawei.com/allianceCmsResource/resource/HUAWEI_Developer_VUE/images/080662.png) Entry Component//自适应伸缩 设置layoutWeight属性的子元素与兄弟元素 会按照权重进行分配主轴的空间// Position s…...
python-leetcode-存在重复元素 II
219. 存在重复元素 II - 力扣(LeetCode) class Solution:def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:seen set()for i, num in enumerate(nums):if num in seen:return Trueseen.add(num)if len(seen) > k:seen.remove…...
P6周:VGG-16算法-Pytorch实现人脸识别
🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊 我的环境 语言环境:Python 3.8.12 编译器:jupyter notebook 深度学习环境:torch 1.12.0cu113 一、前期准备 1.设置GPU im…...
BeanFactory 是什么?它与 ApplicationContext 有什么区别?
谈到Spring,那势必要讲讲容器 BeanFactory 和 ApplicationContext。 BeanFactory是什么? BeanFactory,其实就是 Spring 容器,用于管理和操作 Spring 容器中的 Bean。可能此时又有初学的小伙伴会问:Bean 是什么&#x…...
虚幻基础-1:cpu挑选(14600kf)
能帮到你的话,就给个赞吧 😘 文章目录 ue非常吃cpu拉满主频打开项目编写蓝图运行原因 时间长 关于压力测试 本文以14600kf为例,双12购入,7月份产。 ue非常吃cpu 经本人测试,ue是非常吃cpu的。 拉满主频 无论任何时间…...
多种vue前端框架介绍
学如逆水行舟,不进则退。 在现今的软件开发领域,Vue.js凭借其高效、灵活和易于上手的特性,成为了前端开发的热门选择。对于需要快速搭建企业级后台管理系统的开发者而言,使用现成的Vue后台管理系统模板无疑是一个明智之举。 本文…...
jenkins-node节点配置
一.简述: Jenkins有一个很强大的功能: 即:支持分布式构建(jenkins配置中叫节点(node),也被称为slave)。分布式构建通常是用来吸收额外的负载。通过动态添加额外的机器应对构建作业中的高峰期,或在特定操作系统或环境运行特定的构建…...
计算机网络 (50)两类密码体制
前言 计算机网络中的两类密码体制主要包括对称密钥密码体制(也称为私钥密码体制、对称密码体制)和公钥密码体制(也称为非对称密码体制、公开密钥加密技术)。 一、对称密钥密码体制 定义: 对称密钥密码体制是一种传…...
基于SpringBoot+Vue旅游管理系统的设计和实现(源码+文档+部署讲解)
个人名片 🔥 源码获取 | 毕设定制| 商务合作:《个人名片》 ⛺️心若有所向往,何惧道阻且长 文章目录 个人名片环境需要技术栈功能介绍功能说明 环境需要 开发语言:Java 框架:springboot JDK版本:JDK1.8 数据库&…...
计算机网络-概述
目录 一.互联网 1.0简介 1.1互联网发展的三个阶段 1.2互联网组成 1.2.1 简介 1.2.2 边缘部分 1.2.3 核心部分 1.3计算机网络类别 1.3.1按照范围分类 1.3.2按使用者分类 1.3.3用来把用户接入互联网的网络 1.4计算机网络性能 1. 速率(Data Rate / Bit Ra…...
Jenkins-基于Role的鉴权机制
jenkins自带了一些全局性的安全配置。 但无法通过job等相对细粒度的来控制使用者的权限。但它可以借助相关的插件实现细颗粒的权限控制。 插件: Role-based Authorization Strategy 需要在configure global security中配置授权策略如下: 保存后&#x…...
计算机网络介质访问控制全攻略:从信道划分到协议详解!!!
一、信道划分介质访问控制 介质访问控制:多个节点共享同一个“总线型”广播信道时,可能发生“信号冲突” 应该怎么控制各节点对传输介质的访问,才能减少冲突,甚至避免冲突? 时分复用(TDM) 时分复用:将时间分为等长的“…...
5.若依 Configuration ConfigurationProperties 使用
1. 若依的配置文件application.yml 2. RuoYiConfig 负责读取基础配置 注意写法: ConfigurationProperties 需要配合在容器内进行读取,因此需要一般与Component注解配合。 同时要注意编写 set get方法。 总结:这里一个知识点:Co…...
使用docker部署mysql和tomcat服务器发现的问题整理
1、本地访问tomcat时访问不到 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS …...
数据库开发支持服务
文章目录 前言适用产品服务范围前提条件责任矩阵交互项目 服务流程交付件项目完成标志 前言 数据库开发支持服务是为了达成客户业务系统开发、测试、上线运行提供的具体技术支撑,内容包括数据库开发指导、性能调优、第三方平台对接支持、应用对接与上线支持等。数据…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
