@EnableRetry注解解读
dependency groupIdorg.springframework.retry/groupId artifactIdspring-retry/artifactId /dependency前言在分布式系统、微服务架构以及对外部服务如数据库、第三方API、消息队列的调用中网络抖动、服务瞬时不可用、资源竞争等导致的临时性失败是常见现象。简单的一次性失败重试可能引发“惊群效应”而完全放弃重试则会降低系统可用性。Spring Retry 正是为解决这类问题而生的声明式重试框架它允许开发者以注解或编程方式对可能失败的操作配置灵活的重试策略、退避机制和兜底恢复逻辑从而提升系统的健壮性和容错能力。本文将详细介绍 Spring Retry 的核心概念、注解用法与编程式 API帮助读者在项目中快速引入并正确配置重试逻辑避免因不当使用导致的资源耗尽、雪崩等问题。一、概念spring对于重试机制的实现给了几个抽象。BackOff补偿值一般指失败后多久进行重试的延迟值。Sleeper暂停应用的工具通常用来应用补偿值。BackOffPolicy补偿策略决定失败后如何确定补偿值。RetryContext重试上下文代表了能被重试动作使用的资源。RetryPolicy重试策略决定失败能否重试。RecoveryCallback定义一个动作recover在重试耗尽后的动作。RetryCallback具体的重试动作。RetryOperations通过传递RetryCallback进行重试操作。RetryState重试状态通常包含一个重试的键值。RetryStatistics和RetryListener用来监控Retry的执行情况并生成统计信息。github地址GitHub - spring-projects/spring-retryConfiguration EnableRetry public class Application { Bean public Service service() { return new Service(); } } Service class Service { Retryable(RemoteAccessException.class) public void service() { // ... do something } //spring-retry Recover不执行2个方法返回值一致就ok了 //返回值和Retryable的返回值一致入参和抛出异常一致 Recover public void recover(RemoteAccessException e) { // ... panic } }通过EnableRetry就可以启用Retry功能了需要被重试的方法加上Retryable(),就能在指定的异常出现情况下重试而当默认的失败次数到达后查看SimpleRetryPolicy可知就是试3次就会调用Recover注解的方法进行恢复。当然在Retryable上可以配置属性更加细化例如Retryable(value {RemoteAccessException.class},maxAttempts 5,backoff Backoff(delay 5000l,multiplier 1))指定重试5次每次补偿(延迟5秒)每次倍数为1不变。几个注解的参数解释EnableRetry能否重试。当proxyTargetClass属性为true时使用CGLIB代理。默认使用标准JAVA注解。在spring Boot中此参数写在程序入口即可。Retryable 标注此注解的方法在发生异常时会进行重试value指定处理的异常类include指定处理的异常类和value一样默认为空当exclude也为空时默认所有异常exclude指定异常不处理默认空当include也为空时默认所有异常maxAttempts最大重试次数。默认3次-backoff 重试补偿策略。默认使用Backoff注解Backoff 重试补偿策略不设置参数时默认使用FixedBackOffPolicy指定等待时间重试等待1000ms设置delay,使用FixedBackOffPolicy指定等待- - 设置delay和maxDealy时重试等待在这两个值之间均态分布设置delay、maxDealy、multiplier使用 ExponentialBackOffPolicy指数级重试间隔的实现 multiplier即指定延迟倍数比如delay5000l,multiplier2,则第一次重试为5秒第二次为10秒第三次为20秒Recover 用于Retryable重试失败后处理方法此注解注释的方法参数一定要是Retryable抛出的异常否则无法识别可以在该方法中进行日志处理。三、核心API-RetryTemplate声明式的使用实际上是由spring-retry在内部生成了一个默认的RetryTemplate由它封装我们自己写的函数完成的重试。这有点像Scheduled内部生成了一个ThreadPoolTaskExecutor完成定时任务的调度。虽然简单但是可配置的东西太少了如果想用spring-retry强大的策略机制并必须定制化RetryTemplate。官方的API使用demo如下RetryTemplate template new RetryTemplate(); TimeoutRetryPolicy policy new TimeoutRetryPolicy(); policy.setTimeout(30000L); template.setRetryPolicy(policy); Foo result template.execute(new RetryCallbackFoo() { public Foo doWithRetry(RetryContext context) { // Do stuff that might fail, e.g. webservice operation return result; } });可以看出new出一个RetryTemplate对象后可以给它设置重试策略、补偿策略、重试监听器等属性。核心是在template.execute(),传递一个RetryCallback内部执行我们需要重试的具体方法。RetryTemplate是标准spring的××Template风格脑补jdbcTemplate内部doExecute()方法实现了如何开启重试上下文获取补偿上下文在try/catch中执行doWithRetry(),出现异常捕捉下来如何应用重试策略决定重试最后如何应用回退方法关闭上下文等。这些都模板化了我们只需要要传入RetryCallback和RecoveryCallback(连这个也可省)。总结与注意事项Spring Retry 为处理临时性失败提供了优雅的解决方案但在使用时需要注意以下几点使用要点明确重试场景仅对非幂等操作或非业务逻辑错误如网络超时、数据库连接中断启用重试。对于参数错误、权限不足等业务异常重试通常无效。合理配置重试策略根据被调用服务的 SLA 和自身系统容忍度设置合适的最大重试次数maxAttempts和退避策略Backoff避免过度重试拖垮系统。结合断路器模式在微服务架构中建议将 Spring Retry 与 Resilience4j 或 Hystrix 等断路器框架结合使用。重试解决瞬时故障断路器在服务持续不可用时快速失败防止级联故障。做好日志与监控通过RetryListener或自定义切面记录重试事件便于问题排查和系统健康度评估。常见坑点代理机制限制Retryable基于 AOP 代理实现因此自调用同一个类中方法 A 调用方法 B且 B 有Retryable会失效。需要通过注入代理对象或使用AopContext.currentProxy()解决。异常类型匹配Recover方法的异常参数必须与Retryable方法抛出的异常类型严格匹配或为其父类且返回值类型需一致否则恢复方法不会被调用。上下文状态清理在编程式使用RetryTemplate时注意RetryContext的生命周期避免在多线程环境下上下文状态污染。资源泄漏风险长时间的重试等待尤其是指数退避可能占用连接、线程等资源。务必设置超时TimeoutRetryPolicy或使用异步重试如结合Async。数据库事务与幂等性在重试包含数据库写操作的业务时需考虑事务边界和幂等性设计防止重复提交导致数据不一致。总之Spring Retry 是一把利器但需在理解其原理和限制的基础上谨慎使用方能真正提升系统的弹性。

相关新闻

【2014-04-27】windows用户管理命令

【2014-04-27】windows用户管理命令

[历史归档] 本文原发布于 cstriker1407.info 个人博客,内容为历史存档,仅供参考。 发布时间: 2014-04-27 | 标题:windows用户管理命令 | 分类: 操作系统 / windows | 标签&…

2026/8/18 19:14:29 阅读更多 →
罗列几个提升WPF应用程序冷启动性能的方法!(Part 2)

罗列几个提升WPF应用程序冷启动性能的方法!(Part 2)

在上文中,我们主要介绍了针对三个技术的WPF应用程序性能提升,本文将着重介绍针对DevExpress WPF界面控件研发的应用程序如何提升性能! 有用控件推荐~DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业…

2026/8/18 19:13:28 阅读更多 →
88-项目菜单与最近访问感知:为什么工作台要记住用户常去哪里

88-项目菜单与最近访问感知:为什么工作台要记住用户常去哪里

适合对象:关注工作台体验、导航设计、项目协作效率的前端工程师和平台产品设计人员。 先说结论 项目菜单与最近访问感知不是一个孤立功能,而是精准测试平台里帮助团队做判断的一环。 它重点解决的是:为什么工作台要记住用户常去哪里。 用大白话讲,页面体验的重点不是把数…

2026/8/18 19:13:28 阅读更多 →

最新新闻

HTTP QUERY方法详解:复杂查询的标准化解决方案与Spring Boot实践

HTTP QUERY方法详解:复杂查询的标准化解决方案与Spring Boot实践

在 HTTP 协议的发展历程中,GET、POST、PUT、DELETE 等方法是开发者最熟悉的工具。然而,随着应用场景的复杂化,特别是对复杂查询和搜索需求的增长,传统的 GET 方法在语义和功能上开始显得力不从心。GET 方法虽然用于获取资源&#…

2026/8/18 19:55:47 阅读更多 →
DeepSeek Harness 小白入门 22:strict JSON Schema:结构更稳,但为什么仍要二次校验

DeepSeek Harness 小白入门 22:strict JSON Schema:结构更稳,但为什么仍要二次校验

DeepSeek Harness 小白入门 22:strict JSON Schema:结构更稳,但为什么仍要二次校验 [!NOTE] 这是 第二阶段 协议护栏 的第 22 课。本文面向第一次接触 Agent Harness 的读者,目标是:正确使用 strict 工具 Schema 并保留应用侧验证。真实练习场景是:让工具参数严格满足城…

2026/8/18 19:55:47 阅读更多 →
视频实时翻译神器:一键生成双语字幕,跨平台高效处理外语视频

视频实时翻译神器:一键生成双语字幕,跨平台高效处理外语视频

你是不是也遇到过这样的场景:好不容易找到一份宝贵的外语学习资料、技术讲座或者行业报告视频,结果发现没有字幕,或者字幕是外语的,看得一头雾水?手动翻译?效率太低。找在线工具?要么收费&#…

2026/8/18 19:55:47 阅读更多 →
DeepSeek Harness 小白入门 23:标准端点还是 /beta?带工具时千万别混用

DeepSeek Harness 小白入门 23:标准端点还是 /beta?带工具时千万别混用

DeepSeek Harness 小白入门 23:标准端点还是 /beta?带工具时千万别混用 [!NOTE] 这是 第二阶段 协议护栏 的第 23 课。本文面向第一次接触 Agent Harness 的读者,目标是:分清标准 Chat Completions 与 Beta 补全能力。真实练习场景是:为工具调用固定官方标准 Base URL。全…

2026/8/18 19:55:47 阅读更多 →
物业数智化落地的「红黑榜」技术解构:一份工单数据背后的系统差距

物业数智化落地的「红黑榜」技术解构:一份工单数据背后的系统差距

一、从一份评定结果看物业数智化的真实水位 2026年8月,尖草坪区物业服务企业第一批"红黑榜"如期出炉。这份评定依据是综合打分、投诉工单转办、平台受理数据和日常巡检记录——四项维度中,投诉工单转办和平台受理数据两项,直接反映…

2026/8/18 19:55:47 阅读更多 →
Weblogic+iframe解析问题

Weblogic+iframe解析问题

方法 A&#xff1a;在父页面加 <meta> 标签<head><meta http-equiv"Connection" content"close"> </head>⚠️ 这个 meta 标签会被浏览器忽略——HTTP/1.1 规范不允许用 meta 控制 Connection 头。方法 B&#xff1a;在父页面用 J…

2026/8/18 19:54:47 阅读更多 →

日新闻

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF

告别逐帧截图&#xff1a;用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 如果你还停留在"看网课 不停暂停 截图 …

2026/8/18 0:00:57 阅读更多 →
思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查

思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查

思源宋体TTF一站式上手&#xff1a;7个字重免费商用&#xff0c;从下载到上线的完整走查 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 你是不是也经历过这种时刻&#xff1a;设计稿里…

2026/8/18 0:00:58 阅读更多 →
华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate

华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate

华硕笔记本控制权回收指南&#xff1a;GHelper 如何用一个 10MB 文件替代 Armoury Crate 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, …

2026/8/18 0:00:59 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者&#xff0c;最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent&#xff0c;从本地部署到云端API&#xff0c;我们正处在一个技术栈快速重构的节点。然而&#xff0c;面对层出不穷的模型、框架和工具&#xf…

2026/8/18 9:15:35 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/18 9:06:28 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和…

2026/8/18 9:04:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速&#xff1a;macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/17 18:54:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南&#xff1a;3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗&#xff1f;ncmdump解密工具帮你轻松解决这个困…

2026/8/17 18:55:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片&#xff1a;为英语学习 App 打造桌面级学习助手适用平台&#xff1a;HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0&#xff08;API 26 Beta&#xff09;新增了 AgentCard 智能体卡片能力&#xff0c;这是继 HMAF&#xff08;鸿蒙智能体框架&#x…

2026/8/17 18:55:55 阅读更多 →