Java网络异常重试核心是精准捕获SocketTimeoutException、ConnectException等可重试异常,在限定次数和退避策略下执行,避免重试4xx错误或空指针等不可恢复异常。

Java 中重试执行抛出特定网络异常的代码,核心是捕获目标异常(如 SocketTimeoutException、ConnectException、IOException 等),在限定次数和间隔下重复执行逻辑,同时避免无限重试或阻塞主线程。
明确要捕获的网络异常类型
不是所有 Exception 都该重试。网络调用中常见可重试异常包括:
-
java.net.SocketTimeoutException(读/写超时) -
java.net.ConnectException(连接拒绝、无法建立 TCP 连接) -
java.net.UnknownHostException(DNS 解析失败,部分场景可重试) -
javax.net.ssl.SSLException(SSL 握手临时失败,需谨慎判断) - 自定义的 HTTP 客户端异常,如
org.apache.http.conn.HttpHostConnectException或retrofit2.HttpException中状态码为 503/504 的情况
⚠️ 注意:NullPointerException、IllegalArgumentException、HTTP 4xx 错误(如 401/404)通常不可重试,应直接失败。
手动实现简单重试逻辑(同步)
适用于轻量、无依赖场景,用 for 循环 + try-catch 即可:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
public String callWithRetry(String url, int maxRetries, long delayMs) throws Exception {
Exception lastEx = null;
for (int i = 0; i <= maxRetries; i++) {
try {
return doHttpRequest(url); // 抛出网络异常的方法
} catch (SocketTimeoutException | ConnectException | IOException e) {
lastEx = e;
if (i < maxRetries) {
Thread.sleep(delayMs);
}
}
}
throw lastEx; // 重试耗尽后抛出最后一次异常
}
✅ 关键点:
- 循环次数 =
maxRetries + 1(首次执行 + 重试次数) - 仅对指定异常捕获并重试,其他异常立即抛出
- 每次重试前用
Thread.sleep()实现固定延迟(也可用指数退避)
使用成熟库简化重试(推荐)
生产环境建议用经过验证的库,避免手写逻辑缺陷:
-
Resilience4j(轻量、函数式、支持熔断/限流):
添加依赖:io.github.resilience4j:resilience4j-retry
示例:RetryConfig config = RetryConfig.custom() .maxAttempts(3) .waitDuration(Duration.ofSeconds(2)) .retryExceptions(SocketTimeoutException.class, ConnectException.class) .build(); Retry retry = Retry.of("http-call", config); String result = Retry.decorateSupplier(retry, () -> doHttpRequest(url)).get(); -
Spring Retry(Spring 生态友好,支持注解):
加@EnableRetry,方法上加@Retryable(value = {SocketTimeoutException.class}, maxAttempts = 3, backoff = @Backoff(delay = 2000))
失败后可加@Recover方法处理兜底逻辑。
进阶建议:退避策略与上下文隔离
真实网络环境需更稳健的重试行为:
- 指数退避:延迟时间随重试次数增长(如 1s → 2s → 4s),降低服务雪崩风险
- jitter(抖动):在退避时间上增加随机偏移,避免大量请求同步重试
- 不共享重试状态:每个请求应有独立重试计数,避免多线程或异步调用中状态错乱
- 记录重试日志:记录第几次重试、耗时、异常类型,便于问题定位
不复杂但容易忽略。重点不在“重试”,而在于“何时重试”和“重试多少次”。

















