调不通就再试几次,这个Java重试工具类有5个方法

简介: 这是一个专为Java设计的轻量级重试工具类,支持固定间隔、指数退避及无返回值动作三种重试模式,内置异常过滤、中断感知与结果结构化(RetryResult),JDK 17+可用,开箱即用,助力健壮性编码。(239字)

📋 目录

一、工具类功能

把「调不通就再试几次」从业务代码里挪出来,固定间隔、指数退避、无返回值动作三种入口,成功值、实际尝试次数与最后一次异常都在结果里,重试范围可按异常类型收窄。

二、所需环境

JDK 17或以上

三、方法与调用示例(按需调用)

🔢 方法序号:1

🎯 方法用途:

  • 按固定间隔重试一个有返回值的调用,成功值、尝试次数与最后一次异常都装进结果对象
  • 下游偶发抖动、想把「再试几次」从业务代码里挪出来时用

🧩 方法定义:public static <T> RetryResult<T> fixedRetry(Supplier<T> supplier, int maxAttempts, long intervalMs, Predicate<Throwable> retryWhen)

🗣️ 入参解释:public static <T> RetryResult<T> fixedRetry(业务调用, 最大尝试次数, 间隔毫秒, 可重试谓词)

📤 返回值解释:RetryResult<T>,重试过程本身不向外抛业务异常

💡 边界口径:

  • 默认只重试 Exception 家族,Error 不重试但会被记进 lastFailure,不会被抛穿
  • 谓词返回 false 时一次就停,参数写错这类确定性失败不会白等几轮
  • retryWhen 传 null 就用默认谓词
  • 业务调用为 null、maxAttempts 非正、间隔为负都抛 IllegalArgumentException
  • 等待期间线程被中断时恢复中断标记并抛 IllegalStateException,不吞中断信号

🧪 方法示例:

  • 首次就成功时拿到 成功 true,尝试 1 次,业务调用 1 次,值 订单已创建
  • 第 3 次才成功拿到 成功 true,尝试 3 次,值 3
  • 全部失败拿到 成功 false,尝试 4 次,值为 null,最后一次异常 下游一直不可用,第4次
  • 谓词判定不可重试时拿到 尝试 1 次,业务调用 1 次,一次就停
  • 默认口径下抛 AssertionError 拿到 调用 1 次,lastFailure 类型 AssertionError,不重试但记录在案
  • 谓词放开后同一个 Error 拿到 调用 3 次,重试次数跟着 maxAttempts
  • fixedRetry(() -> "x", 3, -1L, t -> true) 抛 间隔不能为负,当前为-1
  • 业务调用传 null 抛 业务调用不能为null

🔢 方法序号:2

🎯 方法用途:

  • 指数退避重试:间隔按 initialDelayMs × 2^(n-1) 翻倍,并被 maxDelayMs 封顶
  • 下游需要喘息时间、或者担心重试把对方压垮时用这一版

🧩 方法定义:public static <T> RetryResult<T> exponentialRetry(Supplier<T> supplier, int maxAttempts, long initialDelayMs, long maxDelayMs, Predicate<Throwable> retryWhen)

🗣️ 入参解释:public static <T> RetryResult<T> exponentialRetry(业务调用, 最大尝试次数, 初始延迟, 最大延迟, 可重试谓词)

📤 返回值解释:RetryResult<T>,与固定间隔版同一套结果口径

💡 边界口径:

  • 翻倍过程做饱和处理,极端次数下不会因为 long 溢出变成负数而退化成不等待狂重试
  • 未内置随机抖动,多实例同拍失败时节拍一致,高并发请自己叠加随机量
  • maxDelayMs 小于 initialDelayMs 属参数错误,抛 IllegalArgumentException
  • 中途恢复立即返回,不会把剩余次数跑完

🧪 方法示例:

  • 退避 20/40/60/60 毫秒并被上限封顶,拿到 尝试 5 次,累计等待约 198 毫秒
  • 中途恢复就提前返回,拿到 成功 true,尝试 3 次,不必跑完剩余次数
  • maxDelayMs 给得比初始延迟小,抛 最大延迟不能小于初始延迟,initialDelayMs=100,maxDelayMs=50

🔢 方法序号:3

🎯 方法用途:

  • 重试一个没有返回值的动作,成功就返回实际尝试次数
  • 同步推送、写缓存这类只关心成没成、失败要立刻知道的动作用它

🧩 方法定义:public static int runWithFixedRetry(Runnable runnable, int maxAttempts, long intervalMs, Predicate<Throwable> retryWhen)

🗣️ 入参解释:public static int runWithFixedRetry(无返回值动作, 最大尝试次数, 间隔毫秒, 可重试谓词)

📤 返回值解释:int,成功时的实际尝试次数

💡 边界口径:

  • 与 fixedRetry 的区别在失败处理:全部失败直接抛 IllegalStateException,cause 是最后一次异常
  • 想拿到失败结果而不是异常,用 fixedRetry
  • 动作传 null 也按 业务调用不能为null 报,参数校验复用同一处
  • 重试期间同样遵守中断即抛的口径

🧪 方法示例:

  • 第 2 次成功时 runWithFixedRetry(runnable, 3, 20L, t -> true) 拿到 2
  • 全部失败抛 重试2次后仍失败,cause 是 同步接口持续 503
  • runWithFixedRetry(null, 3, 10L, t -> true) 抛 业务调用不能为null
  • runWithFixedRetry(runnable, 0, 10L, t -> true) 抛 最大尝试次数必须大于0,当前为0

🔢 方法序号:4

🎯 方法用途:

  • 手工装配一个重试结果,把已经拿到的值、次数与异常组成统一结构
  • 自己实现了重试循环、但仍想复用同一套成功失败处理分支时用

🧩 方法定义:public record RetryResult<T>(T value, int attempts, Throwable lastFailure)

🗣️ 入参解释:public record RetryResult<T>(成功值, 实际尝试次数, 最后一次异常)

📤 返回值解释:RetryResult<T>,不可变的结果记录

💡 边界口径:

  • 紧凑构造器把「至少尝试过一次」钉在构造点,attempts 小于 1 直接抛异常
  • value 允许是 null,lastFailure 也允许是 null,两者不构成矛盾
  • 成功时约定 lastFailure 传 null,判定只看这个字段
  • 是 record,可以直接 equals 比较两份结果

🧪 方法示例:

  • new RetryResult<>(null, 2, lastError) 走统一处理分支拿到 成功 false,尝试 2 次
  • new RetryResult<>(null, 0, lastError) 抛 尝试次数至少为1,当前为0

🔢 方法序号:5

🎯 方法用途:

  • 判断这次重试到底成没成,依据是有没有记录到异常
  • 拿到 RetryResult 后的第一句就该是它,漏掉会把故障静默吞掉

🧩 方法定义:public boolean isSuccess()

🗣️ 入参解释:public boolean isSuccess()(无入参)

📤 返回值解释:boolean,lastFailure 为 null 时返回 true

💡 边界口径:

  • 业务返回 null 不等于失败,这种调用算成功
  • 全部失败时 value 是 null 且 lastFailure 非 null,只看 value 会误判成成功
  • 判定不看尝试次数,一次成的与三次成的都是成功

🧪 方法示例:

  • 业务正常返回 null 时 isSuccess() 拿到 true,value 是 null
  • 全部失败的那次 isSuccess() 拿到 false,lastFailure 留着最后一句异常

四、工具类源码(可直接复制)

📦 源码文件

相关文章
|
6天前
|
JavaScript API iOS开发
DeepSeek Harness下载、安装、配置一篇搞定(2026整理,送常用插件)
DeepSeek Harness(DSH)是DeepSeek于2026年开源的MIT协议AI Agent框架,支持插件化组装模型、工具、沙箱与UI,兼容主流大模型。本文提供免Node.js的桌面端安装包(Win/macOS),含详细图文教程及热门插件推荐。
2737 22
|
1天前
|
云安全 人工智能 安全
|
5天前
|
Linux 开发工具 iOS开发
Codex保姆级教程(下载+安装+登录+使用,含所有版本,2026最新)
Codex是OpenAI推出的开源AI编程智能体,本地运行,可理解整个代码库,支持自然语言指令改代码、执行命令、跑测试、修Bug,兼容Win/macOS/Linux。(239字)
|
6天前
|
iOS开发 Docker MacOS
【2026实测】Docker Desktop下载、安装、汉化、配置教程(附官网安装包)
Docker Desktop 是 Docker 官方推出的桌面容器管理工具,集成引擎、CLI、图形界面与 Kubernetes,支持 Win/macOS/Linux。2026 最新版 4.88.1 强化 ARM 原生运行、镜像加速及资源可视化,附中文汉化与国内镜像配置指南。
1213 5
|
云安全 安全 网络安全
|
7天前
|
安全 算法 定位技术
《高性价比人生指南》完整原版:普通人用最少的资源,过好这一生的底层逻辑~How To Live Better
📖《高性价比人生指南》是一份基于实证、拒绝焦虑的生存手册,倡导以“人生时薪”为视角,重新计算时间、金钱与精力的成本与收益。它不承诺逆袭,只教人算清账:省下的钱若耗掉时间便亏;买体验比买物品更值;睡眠是最高杠杆的健康投资;关系贵在情绪价值而非表面热络;学习重在改变行为而非自我安慰。核心理念:用低成本、高回报的微小行动,换取长期的选择权——不是成为谁,而是掌控自己人生的主动权。
|
19天前
|
人工智能 API 开发工具
DeepSeek Harness 神插件:白嫖 13 家大厂模型
`dsh-our-free-model` 是 DeepSeek Harness 神级插件:零配置、零API Key、零账号,聚合13家大厂免费模型(含DeepSeek V4.1 Flash、Kimi K3等),支持本地网关、用量看板与自动降级,真正实现“白嫖即用”。
3346 52
|
11天前
|
人工智能 JSON Linux
【保姆级】ComfyUI部署教程(下载+安装+配置+工作流,2026最新)
ComfyUI 是一款开源节点式AI生成工具,支持图像、视频、音频及3D内容创作。通过拖拽连线组合模型加载、提示词、采样等节点,构建可复用、易修改的工作流,兼容SD1.5、SDXL、Flux、Qwen Image等主流模型。