java抽象类通过模板方法模式封装http客户端重试与拦截逻辑:定义dobuildrequest、dohandleresponse、shouldretry等钩子方法,固化executewithretry重试流程(支持指数退避),集成requestinterceptor责任链,并统一异常处理与requestcontext透传。

在 Java 抽象类中封装统一的 HTTP 客户端重试与拦截逻辑,核心是把可变行为(如请求构造、响应处理)抽象为方法,把不变流程(如重试控制、拦截器链执行)固化在模板方法中。这不是简单堆砌功能,而是用模板方法模式 + 责任链模式协同完成的分层设计。
定义抽象基类并声明关键钩子方法
抽象类不直接发起请求,而是提供标准生命周期入口,并强制子类实现具体细节:
-
doBuildRequest():返回具体的请求对象(如
HttpGet、HttpPost),由子类决定 URL、参数、头信息等 - doHandleResponse(HttpResponse):解析响应体、转换为业务对象,子类按需实现 JSON/Xml 解析或错误码映射
-
shouldRetry(Exception, int):控制是否重试——比如只对
SocketTimeoutException或 503 状态码重试,子类可定制策略
内置重试模板方法,支持指数退避与次数限制
在抽象类中写死重试骨架,避免每个子类重复写 while 循环和 sleep:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 用
final方法executeWithRetry()封装完整流程:初始化尝试次数 → 执行请求 → 捕获异常 → 判断是否重试 → 计算下次延迟(如 1s、2s、4s)→ 继续循环 - 延迟时间可配置为固定值或基于尝试次数动态计算,例如:
long delay = (long) Math.pow(2, attempt) * 1000; - 最大重试次数、初始延迟、是否重试 4xx 等,可通过构造函数或 builder 方式注入,保持子类轻量
集成拦截器链,在请求前后插入横切逻辑
抽象类持有 List<requestinterceptor></requestinterceptor>,并在模板方法中按序触发:
- 在
executeWithRetry()开始前调用所有拦截器的preHandle(context),允许修改请求头、添加 traceId、加密参数 - 在收到响应后,按逆序调用
postHandle(context),用于日志记录、解密响应、统计耗时 - 发生异常时,触发
afterThrowing(context, ex),支持自动重试、告警上报或 fallback 值返回 - 拦截器本身是接口,子类可自由添加自定义实现,比如
AuthHeaderInterceptor或MetricsInterceptor
统一异常处理与上下文透传
避免子类各自 try-catch,抽象类提供标准化错误包装:
- 定义
HttpClientException统一封装网络异常、超时、非 2xx 响应等,并附带原始异常、响应码、URL、耗时等字段 - 使用
RequestContext对象贯穿整个流程,携带请求 ID、开始时间、重试次数、拦截器共享数据等,供各环节读写 - 子类只需关注“怎么发”和“怎么转”,异常分类、重试决策、日志埋点均由父类兜底
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










