当前位置: 首页 > 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.lryc.cn/news/601364.html

相关文章:

  • Spring Boot自动配置原理深度解析
  • 适配IE11(通过Babel+core-js转译ES6语法)
  • Flutter 生命周期介绍
  • 几个注册中心的特性
  • 欧拉图与欧拉回路
  • 菜鸟的C#学习(四)
  • windows 10安装oracle(win64_11gR2)
  • 医疗AI语义潜空间分析研究:进展与应用
  • Unity 实时 CPU 使用率监控
  • IP--MGER综合实验报告
  • Linux驱动20 --- FFMPEG视频API
  • 回归预测 | MATLAB实现BiTCN双向时间卷积神经网络多输入单输出回归预测
  • AWS免费套餐全面升级:企业降本增效与技术创新解决方案
  • 《频率之光》
  • 详解赛灵思SRIO IP并提供一种FIFO封装SRIO的收发控制器仿真验证
  • 基于Django的天气数据可视化分析预测系统
  • Django实时通信实战:WebSocket与ASGI全解析(下)
  • 二、搭建springCloudAlibaba2021.1版本分布式微服务-Nacos搭建及服务注册和配置中心
  • mybatis的insert(pojo),会返回pojo吗
  • 激光SLAM技术综述(2025版)
  • springboot基于Java的人力资源管理系统设计与实现
  • Windows 11 安装 jdk 8
  • QT开发---网络编程下
  • 全面理解JVM虚拟机
  • Python day26
  • Python数据分析基础(一)
  • 沪深L2逐笔十档委托队列分时Tick历史数据分析处理
  • RK3568 Linux驱动学习——U-Boot使用
  • 15.7 DeepSpeed实战:单卡38GB到多卡12GB,3倍效率提升的ZeRO-3配置全解
  • golang设置http代理