当前位置: 首页 > news >正文

Spring Retry 异常重试机制:从入门到生产实践

Spring Retry 异常重试机制:从入门到生产实践

适用版本:Spring Boot 3.x + spring-retry 2.x
本文覆盖 注解声明式RetryTemplate 编程式监听器最佳实践避坑清单,可直接落地生产。


一、核心坐标

<!-- Spring Boot Starter 已经帮你管理版本 -->
<dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId>
</dependency>
<!-- AOP 支持 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>

二、开启重试能力

在启动类或任意 @Configuration 上添加:

@SpringBootApplication
@EnableRetry        // <-- 只需这一行
public class Application { }

三、注解式:最常用 80% 场景

3.1 基本用法

@Service
public class OrderService {@Retryable(retryFor = ConnectException.class,   // 触发重试的异常maxAttempts = 3,                     // 含首次,共 3 次backoff = @Backoff(delay = 1000,                    // 首次延迟 1smultiplier = 1.5                // 指数退避 1→1.5→2.25s))public void pay(int orderId) throws ConnectException {// 模拟远程调用throw new ConnectException("网络抖动");}
}

3.2 兜底恢复

@Recover
public void payRecover(ConnectException e, int orderId) {log.error("订单 {} 支付失败,进入补偿流程", orderId);// 发消息、记录表、人工审核...
}

注意@Recover 方法签名必须与 @Retryable 一致(异常类型 + 参数 + 返回值),否则不生效 。


四、编程式:RetryTemplate 细粒度控制

适用于 动态策略无 Spring Bean 场景

@Configuration
public class RetryConfig {@Beanpublic RetryTemplate retryTemplate() {return RetryTemplate.builder().maxAttempts(5).exponentialBackoff(1000, 1.5, 10000) // 初始 1s、乘 1.5、最大 10s.retryOn(ConnectException.class).build();}
}@Service
public class ReportService {@Autowiredprivate RetryTemplate retryTemplate;public String generate() {return retryTemplate.execute(ctx -> {// 模板内部自动重试return remoteClient.generate();});}
}

五、监听重试生命周期

实现 RetryListener 可以 记录指标 / 报警 / 链路追踪

@Component
public class RetryLogger implements RetryListener {@Overridepublic <T, E extends Throwable> void onError(RetryContext ctx,RetryCallback<T, E> callback,Throwable throwable) {log.warn("第 {} 次重试失败: {}", ctx.getRetryCount(), throwable.getMessage());}
}

注册到模板:

retryTemplate.registerListener(new RetryLogger());

六、生产级最佳实践

维度建议
重试场景仅对 网络、锁、瞬时故障;业务校验失败不重试
次数 & 退避3~5 次 + 指数退避,避免雪崩
幂等性写操作需保证 幂等键 / 去重表
超时控制方法级别设置 timeout,防止长时间阻塞
监控告警通过 Micrometer + RetryListener 导出 重试次数、成功率

七、常见踩坑清单

症状原因解决
重试不触发直接 new 调用 / 异常被吃掉必须走 Spring 代理抛出异常
@Recover 不执行签名不一致保持异常类型、参数、返回值一致
无限重试maxAttempts = Integer.MAX_VALUE显式设置合理上限
线程阻塞退避策略未设 maxDelay设置最大等待时间

八、小结一句话

Spring Retry 通过 注解 + AOPRetryTemplate 提供声明式/编程式重试,在 可观测、可配置、无侵入 的前提下极大提升了分布式系统的健壮性;
牢记“次数、退避、幂等、监控”四要素,即可安全落地生产。

完整示例代码已上传 GitHub:
https://github.com/your-org/spring-retry-demo

http://www.dtcms.com/a/300458.html

相关文章:

  • ESP32学习-FreeRTOS队列使用指南与实战
  • 【多模态】天池AFAC赛道四-智能体赋能的金融多模态报告自动化生成part2-报告输出
  • Java面试实战:企业级性能优化与JVM调优全解析
  • 小白成长之路-Ansible自动化(一)
  • 将远程 main 分支同步到 develop 分支的完整指南
  • 【硬件】嵌入式软件开发(2)
  • STM32-USART串口实现接收数据三种方法(1.根据\r\n标志符、2.空闲帧中断、3.根据定时器辅助接收)
  • Pytest 参数化进阶:掌握 parametrize 的多种用法
  • HCIP---MGRE实验
  • 嵌入式硬件篇---ESP32稳压板
  • OpenLayers 综合案例-轨迹回放
  • LeetCode|Day27|70. 爬楼梯|Python刷题笔记
  • catkin_make与catkin build的关系与区别(使用catkin build的好处)
  • MGRE实验
  • 深入解析 Vue 3 中 v-model 与表单元素的绑定机制
  • 多租户Kubernetes集群架构设计实践——隔离、安全与弹性扩缩容
  • Spring Boot自动配置原理深度解析
  • 昇思学习营-模型推理和性能优化
  • Keepalived + LVS-DR 高可用与负载均衡实验
  • 【Python系列】使用 memory_profiler 诊断 Flask 应用内存问题
  • 结构化文本文档的内容抽取与版本重构策略
  • 8. 状态模式
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 微博舆情分析实现
  • vLLM 的“投机取巧”:Speculative Decoding 如何加速大语言模型推理
  • Spring Boot2错误处理
  • 负载均衡 LoadBalance
  • Spring Boot音乐服务器项目-查询音乐模块
  • 《Foundation 面板:设计、功能与最佳实践解析》
  • Java学习-------序列化与反序列化
  • UV: 下一代 Python 包管理工具