news 2026/9/8 15:51:04

Spring Retry 源码解析与二次改造:从 RetryListener 到最终失败落库

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring Retry 源码解析与二次改造:从 RetryListener 到最终失败落库

什么是Spring Retry?

Spring Retry帮你自动重试那些「这次失败、下次可能就成功」的操作,省得你手写循环。

一、Spring Retry 有一个问题

问题:当一次重试流程最终仍然失败时,Spring Retry 默认并不会帮我们完成失败记录等后续处理。本文将深入 Spring Retry 源码,在不改变核心重试机制的基础上进行升级,实现对最终重试失败场景的统一处理。

二、RetryListener 是什么?

RetryListener是框架定义的一个用于监听整个重试生命周期的接口。他不会参与具体的重试逻辑,只是一个观察者角色。在重试开始,失败,成功,以及结束都会进行回调。我们可直接在结束时根据上下文信息进行记录(RetryContext)。

三、RetryListener 的生命周期

因此,RetryListener 可以理解为 Spring Retry 预留的一组扩展钩子。我们可以基于这些回调,在不直接修改业务代码的情况下,因此,RetryListener 可以理解为 Spring Retry 预留的一组扩展钩子。我们可以基于这些回调,在不直接修改业务代码的情况下,对重试过程进行日志记录、监控统计、异常记录以及最终失败处理等。

本文也会基于这一扩展点,对 Spring Retry 的最终失败场景进行二次改造。

创建一个实现RetryListener接口的Bean,Spring Retry框架内部会对此进行管理

@Component public class MysqlRetryListener implements RetryListener { /** * 一次 Retry 流程开始。 */ @Override public <T, E extends Throwable> boolean open( } /** * 每一次失败都会进入这里。 */ @Override public <T, E extends Throwable> void onError( } /** * 整个 Retry 流程结束。 * * throwable == null: * 最终成功 * throwable != null: * 最终失败 */ @Override public <T, E extends Throwable> void close( } }

我们只需实现最终窗口close即可

例如

protected <T, E extends Throwable> void doClose( RetryContext context, MethodInvocationRetryCallback<T, E> callback, Throwable throwable) { // 最终成功,不记录 if (throwable == null) { return; } Method method = callback.getInvocation().getMethod(); Object[] args = callback.getInvocation().getArguments(); String name = resolveName(context, callback); String uniqueName = name + "_" + System.currentTimeMillis() + "_" + (int) (Math.random() * 10000); String methodName = method.getName(); String methodClass = method.getDeclaringClass().getName(); String methodArgs = serializeArgs(args); String exceptionClass = throwable.getClass().getName(); String exceptionMessage = throwable.getMessage(); int retryCount = context.getRetryCount(); saveToMysql(...);

最终就能够形成一条完整的失败记录。


后续待补充....

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/8 15:51:00

把Windows 11系统砍掉一半:Tiny11Builder精简镜像上手指南

把Windows 11系统砍掉一半&#xff1a;Tiny11Builder精简镜像上手指南 【免费下载链接】tiny11builder Scripts to build a trimmed-down Windows 11 image. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder 原版Windows 11装完动辄超过25GB磁盘&#…

作者头像 李华
网站建设 2026/9/8 15:50:13

GitBook命令行本地部署:将Markdown文档编译为静态网站

先说我这几天的实际经历。团队里积压了二十多份流程文档&#xff0c;散落在不同地方的 Markdown 文件里&#xff0c;既有新人手册又有接口说明。我本来是想找个在线文档平台统一管理&#xff0c;但内容大多还是 Markdown 形态&#xff0c;改造成本不小。转了一圈&#xff0c;最…

作者头像 李华
网站建设 2026/9/8 15:47:37

res-downloader 十分钟实战:把视频号、抖音的视频快速存到本地

res-downloader 十分钟实战&#xff1a;把视频号、抖音的视频快速存到本地 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader re…

作者头像 李华
网站建设 2026/9/8 15:45:24

opencode 终端 AI 编程代理:从免费模型接入到 IDE 插件实战

最近一直在折腾终端里的 AI 编程助手&#xff0c;从早期的 Claude Code、Codex CLI 一路试过来&#xff0c;最后在一个开源项目里彻底停在了 opencode 上。一句话介绍&#xff1a;opencode 是一个跑在终端里的开源 AI 编码代理&#xff0c;它可以直接读你的项目代码、改文件、执…

作者头像 李华