Spring的重试机制-SpringRetry
在我们的日常开发中,经查会遇到调用接口失败的情况,这时候就需要通过一些方法来进行重试,比如通过while循环手动重复调用或,或者通过记录错误接口url和参数到数据库,然后手动调用接口,或者通过JDK/CGLib动态代理的方式来进行重试,但是这种方法比较笨重,且对原有逻辑代码的入侵性比较大。
SpringRetry却可以通过注解,在不入侵原有业务逻辑代码的方式下,优雅的实现重处理功能。
1:添加pom依赖
<dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId></dependency>
2:主启动类开启@EnableRetry注解
/*** 主启动类* EnableCaching允许使用注解进行缓存* 添加注解@EnableRetry* * @author hua*/
@EnableRetry
@EnableCaching
@SpringBootApplication
@MapperScan(basePackages = "com.it.mapper")
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
3:在重试所调用方法上添加@Retryable注解
@Service
@Slf4j
public class SpringRetryService {/*** 重试所调用方法** delay=2000L表示延迟2秒 multiplier=2表示两倍 即第一次重试2秒后,第二次重试4秒后,第三次重试8秒后* @return*/@Retryable(value = {RemoteAccessException.class}, maxAttempts = 3, backoff = @Backoff(delay = 2000L, multiplier = 2))public boolean call(Integer param) {return retryMethod(param);}/*** 超过最大重试次数或抛出没有指定重试的异常* @param e* @param param* @return*/@Recoverpublic boolean recover(Exception e, Integer param) {log.info("请求参数为: ", param);log.info("超过最大重试次数或抛出没有指定重试的异常, e = {} ", e.getMessage());return false;}public static boolean retryMethod(Integer param) {int i = new Random().nextInt(param);log.info("随机生成的数:{}", i);if (1 == i) {log.info("为1,返回true.");return true;} else if (i < 1) {log.info("小于1,抛出参数异常.");throw new IllegalArgumentException("参数异常");} else if (i > 1 && i < 10) {log.info("大于1,小于10,抛出参数异常.");return false;} else {//为其他log.info("大于10,抛出自定义异常.");throw new RemoteAccessException("大于10,抛出自定义异常");}}
}
Spring Retry 注解属性详解
1、@EnableRetry
作用于SpringbootApplication启动类,开启spring retry。
proxyTargetClass:默认值为false,设置为true时为CGLIB代理。
2、@Retryable 作用于需要进行重试的方法
value:指定处理的异常类,默认为空
include:指定处理的异常类,默认为空,当include和exclude为空时,默认所有异常
exclude:指定哪些异常不处理,默认空
maxAttempts:最大重试次数。默认3次
backoff: 重试补偿策略。默认使用@Backoff注解
3、@Backoff 作用于backoff中的补偿策略
delay:指定等待时间,没有设置的话默认为1000ms
maxDelay:最大重试时间,没有设置默认为3000ms
multiplier:下一次调用时间的乘数
random:随机等待时间,默认值为false
4、@Recover
用于对retry方法的异常抛出的特殊处理,可做熔断、降级、日志等操作。入参必须和retry对应方法所抛出的异常类型相同。
4:单元测试
@SpringBootTest
@Slf4j
public class SpringRetryServiceTest {@Autowiredprivate SpringRetryService springRetryService;@Testvoid contextLoads() {boolean result = springRetryService.call(100);log.info("方法返回结果为: {}", result);}
}
5:测试结果

6:源码下载
下载地址 springboot-cacheable 欢迎star哦~

参考资料
@Retryable注解,优雅的实现循环重试功能
SpringRetry(spring的重试机制)——只需一个注解
Spring 中的重试机制,简单、实用!
相关文章:
Spring的重试机制-SpringRetry
在我们的日常开发中,经查会遇到调用接口失败的情况,这时候就需要通过一些方法来进行重试,比如通过while循环手动重复调用或,或者通过记录错误接口url和参数到数据库,然后手动调用接口,或者通过JDK/CGLib动态…...
水稻叶病害数据集(目标检测,yolo使用)
1.数据集文件夹 train文件夹(44229张),test文件夹(4741张),valid文件夹(6000张) 2.train文件夹展示 labels展示 标签txt展示 data.yaml文件展示 对数据集感兴趣的可以关注最后一行…...
鸿蒙系列-如何使用好 ArkUI 的 @Reusable?
如何使用好 ArkUI 的 Reusable? OpenHarmony 组件复用机制 在ArkUI中,UI显示的内容均为组件,由框架直接提供的称为 系统组件,由开发者定义的称为 自定义组件。 在进行 UI 界面开发时,通常不是简单的将系统组件进行组合…...
展锐平台音频框架
Audio DT介绍 1.概述 DT(Device Tree)是一种描述硬件的数据结构,DTS即设备树源码。 2.Audio DTS 文件架构 \bsp\kernel\kernel.4.14\arch\arm64\boot\sprd ums512.dts //SOC级相关节点 ——sc2730.dtsi //Codec ——sharkl5Pro.dts…...
webpack loader和plugins的区别
在Webpack中,Loader和Plugin是两个不同的概念,用于不同的目的。 Loader是用于处理非JavaScript模块的文件的转换工具。它们将文件作为输入,并将其转换为Webpack可以处理的模块。例如,当您在Webpack配置中使用Babel Loader时&…...
适配器模式:接口的平滑过渡
欢迎来到设计模式系列的第七篇文章!在前面的几篇文章中,我们已经学习了一些常见的设计模式,今天我们将继续探讨另一个重要的设计模式——适配器模式。 适配器模式简介 适配器模式是一种结构型设计模式,它主要用于将一个类的接口…...
vscode搭建springboot开发环境
前言 idea好用到但是收money,eclipse免费但是界面有点丑,所以尝试使用vscode开发springboot 提前准备 安装jdk,jdk需要大于11 安装vscode 安装maven 安装插件 主要是下面的插件 Extension Pack for JavaSpring Boot Extension PackDepe…...
SpringMVC-学习笔记
文章目录 1.概述1.1 SpringMVC快速入门 2. 请求2.1 加载控制2.2 请求的映射路径2.3 get和post请求发送2.4 五种请求参数种类2.5 传递JSON数据2.6 日期类型参数传递 3.响应3.1 响应格式 4.REST风格4.1 介绍4.2 RESTful快速入门4.3 简化操作 1.概述 SpringMVC是一个基于Java的Web…...
【STM32】学习笔记(TIM定时器)
TIM(Timer)定时器 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断 16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时 不仅具备基本的定时中断功能,而且…...
Jdk8 动态编译 Java 源码为 Class 文件(三)
Jdk8 动态编译 Java 源码为 Class 文件 一.JDK版本二.工程介绍1.依赖2.启动类3.配置类(用于测试依赖注入)4.工具类1.Java 源码文件读取类2.SpringBoot 容器实例管理类 5.测试类1.抽象类2.接口类3.默认抽象实现4.默认接口实现 6.接口类1.测试接口2.类重载…...
Shell自动化日志维护脚本
简介: 系统日志对于了解操作系统的运行状况、故障排除和性能分析至关重要。然而,长期积累的日志文件可能变得庞大,影响系统性能。在这篇文章中,我们将介绍一个自动化的解决方案,使用 Bash 脚本来监控和维护系统日志文件…...
设计模式入门笔记
1 设计模式简介 在IT这个行业,技术日新月异,可能你今年刚弄懂一个编程框架,明年它就不流行了。 然而即使在易变的IT世界也有很多几乎不变的知识,他们晦涩而重要,默默的将程序员划分为卓越与平庸两类。比如说ÿ…...
存储成本降低85%,携程历史库场景的降本实践
携程,一家中国领先的在线票务服务公司,从 1999 年创立至今,数据库系统历经三次替换。在移动互联网时代,面对云计算卷积而来的海量数据,携程通过新的数据库方案实现存储成本降低 85% 左右,性能提升数倍。本文…...
如何精确掌握函数防抖和函数节流的使用?
前序 函数防抖(Debouncing)和函数节流(Throttling)都是用于控制函数执行频率的技术,通常在处理高频率触发的事件(如窗口滚动、鼠标移动、输入框输入等)时非常有用 一、核心概念 函数防抖 函…...
【Linux系列】离线安装openjdk17的rpm包
首发博客地址 首发博客地址[1] 系列文章地址[2] 视频地址[3] 准备 RPM 包 请从官网下载:https://www.oracle.com/java/technologies/downloads/#java17[4] 如需不限速下载,请关注【程序员朱永胜】并回复 1020 获取。 安装 yum localinstall jdk-17_linux…...
Python 没有 pip 包问题解决
最近需要搞一个干净的Python,从官网上直接下载解压可用的绿色版,发现无法正常使用PiP 一 官网下载Python https://www.python.org/downloads/ 选择 embeddable package,这种是免安装的包,解压后可以直接使用。 二 配置环境变量 添加环境变量:…...
并发-Java中的锁(二)--- 重入锁ReentrantLock,公平锁,非公平锁笔记
重入锁ReentrantLock 支持重进入的锁,表示该锁能够支持一个线程对资源的重复加锁该锁支持获取锁时的公平和非公平的选择 如果在绝对时间上,先对锁进行获取的请求一定先被满足,那么锁是公平的,获取锁是顺序的。 实现重进入 线程再…...
LeetCode每日一题:1921. 消灭怪物的最大数量(2023.9.3 C++)
目录 1921. 消灭怪物的最大数量 题目描述: 实现代码与解析: 贪心 原理思路: 1921. 消灭怪物的最大数量 题目描述: 你正在玩一款电子游戏,在游戏中你需要保护城市免受怪物侵袭。给你一个 下标从 0 开始 且长度为 …...
SpringBoot连接MySQL数据库,使用Mybatis框架(入门)
1. 说明 SpringBoot项目,连接MySQL数据库,使用Mybatis框架。 本篇文章作为 SpringBoot 使用 Mybatis 的入门。 2. 依赖 2.1. MySQL驱动依赖 MySQL驱动,使用SpringBoot版本对应的默认版本,不需要手动指定版本。 比如…...
滑动窗口实例6(找到字符串中所有字母异位词)
题目: 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。 示例 1: 输入: s "cbaebabac…...
避坑指南:用Dify搭建AI Agent时,Docker镜像拉取失败和Postman接口调试的那些坑
避坑指南:用Dify搭建AI Agent时的高频问题解决方案 当你第一次尝试用Dify搭建AI Agent时,可能会遇到各种意想不到的"坑"。从Docker镜像拉取失败到Postman接口调试报错,每一步都可能让新手开发者抓狂。本文将聚焦这些实操中的真实痛…...
WarcraftHelper:魔兽争霸3现代优化解决方案 - 突破兼容性壁垒,重焕经典游戏活力
WarcraftHelper:魔兽争霸3现代优化解决方案 - 突破兼容性壁垒,重焕经典游戏活力 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper …...
百川2-13B-Chat惊艳效果展示:同一提示词下Temperature=0.3与0.9输出对比
百川2-13B-Chat惊艳效果展示:同一提示词下Temperature0.3与0.9输出对比 你有没有想过,同一个问题问给同一个AI,为什么每次的回答都不太一样?有时候它像个严谨的学者,回答得一丝不苟;有时候又像个天马行空的…...
别再到处找教程了!Ubuntu 18.04 + Carla 0.9.13 + ROS Melodic 联合仿真环境保姆级搭建实录
Ubuntu 18.04 Carla 0.9.13 ROS Melodic 联合仿真环境实战指南 自动驾驶仿真环境的搭建往往充满挑战,特别是当多个复杂系统需要协同工作时。本文将带你一步步完成Ubuntu 18.04系统下Carla 0.9.13与ROS Melodic的联合仿真环境搭建,避开那些令人头疼的&…...
IIS网站部署实战:从基础配置到安全优化
1. IIS网站部署基础配置 第一次在Windows Server上部署IIS网站时,我踩了不少坑。记得当时为了调试一个简单的ASP网站,折腾了整整一个下午。现在回想起来,其实只要掌握几个关键步骤,就能轻松完成基础部署。 首先需要在服务器管理器…...
Qwen3-VL-8B助力AIGC内容创作:图文匹配与风格一致性检查
Qwen3-VL-8B助力AIGC内容创作:图文匹配与风格一致性检查 最近在折腾AIGC内容创作,我发现一个挺头疼的问题:用模型生成了一大堆图片,怎么快速判断哪张图最符合我的文字描述?或者,一个系列的海报做出来&…...
# 发散创新:基于事件驱动架构的实时日志监控系统设计与实现在现代分布式系统中,**事件驱动编程模型
发散创新:基于事件驱动架构的实时日志监控系统设计与实现 在现代分布式系统中,事件驱动编程模型正逐渐成为构建高可扩展、高性能应用的核心范式。相比传统的轮询或阻塞式处理方式,事件驱动能够显著降低资源消耗并提升响应效率。本文将深入探讨…...
5分钟搞定!Cesium/Leaflet/OpenLayers调用免费瓦片地图资源全攻略
三大地图框架快速调用免费瓦片资源实战指南 第一次接触GIS开发时,最让人头疼的莫过于地图底图资源的获取。作为项目的基础支撑,地图瓦片的质量和稳定性直接影响最终用户体验。但商业地图API往往价格不菲,对个人开发者和小型项目来说成本压力较…...
Clawdbot汉化版开源可部署:MIT协议+全栈TypeScript+模块化Agent设计解析
Clawdbot汉化版开源可部署:MIT协议全栈TypeScript模块化Agent设计解析 1. 项目概述与技术特色 Clawdbot是一个开源的智能对话助手系统,采用MIT协议发布,允许用户自由使用、修改和分发。这个项目的核心价值在于让用户能够在主流即时通讯平台…...
Axure RP本地化全攻略:从界面优化到效率提升的开源工具本地化指南
Axure RP本地化全攻略:从界面优化到效率提升的开源工具本地化指南 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包,不定期更新。支持 Axure 9、Axure 10。 项目地址: https://gitcode.com/gh_mirrors/ax/axur…...
