You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Apache为Java HTTP连接实现重试处理器?

Apache HttpClient 重试处理器实现方案

以下是针对你给出的初始化代码的完整改造实现,基于Apache HttpClient 4.x版本原生API实现:

public void loadOnStartUp(AppProperties properties) {
    this.mySql = new MySql(properties);
    
    // 自定义重试规则处理器
    HttpRequestRetryHandler retryHandler = (exception, executionCount, context) -> {
        // 配置最大重试次数,可根据业务需求调整
        if (executionCount >= 3) {
            return false;
        }
        // 针对可重试的网络异常直接重试
        if (exception instanceof ConnectTimeoutException 
                || exception instanceof SocketTimeoutException
                || exception instanceof NoHttpResponseException) {
            return true;
        }
        // SSL类异常属于证书/加密层面问题,无需重试
        if (exception instanceof SSLException) {
            return false;
        }
        // 仅对幂等请求重试(GET/HEAD等不带请求体的请求),避免POST等请求重复提交导致业务异常
        HttpClientContext clientContext = HttpClientContext.adapt(context);
        HttpRequest request = clientContext.getRequest();
        return !(request instanceof HttpEntityEnclosingRequest);
    };

    this.httpClient = HttpClients.custom()
        .setConnectionManager(new PoolingHttpClientConnectionManager())
        // 绑定自定义重试处理器
        .setRetryHandler(retryHandler)
        // 可选配置:服务端返回503状态码时的重试策略,重试3次,间隔1000ms
        .setServiceUnavailableRetryStrategy(new DefaultServiceUnavailableRetryStrategy(3, 1000))
        .build();
}

关键配置说明

  • 重试触发规则:默认只对连接超时、Socket读取超时、服务端无响应这三类常见网络异常触发重试,你可以根据业务场景增减异常类型。
  • 幂等校验:默认只对不带请求体的幂等请求重试,如果你需要支持POST等带请求体的请求重试,请先确认下游接口实现了幂等逻辑,再删除幂等校验的代码行即可。
  • 重试间隔配置:DefaultServiceUnavailableRetryStrategy的第二个参数为重试间隔毫秒数,避免短时间密集重试压垮下游服务。如果需要处理503之外的其他状态码重试,可自行实现ServiceUnavailableRetryStrategy接口自定义规则。

低版本Java兼容说明

如果你使用Java 7及更早版本,将lambda写法替换为匿名内部类即可:

HttpRequestRetryHandler retryHandler = new HttpRequestRetryHandler() {
    @Override
    public boolean retryRequest(IOException exception, int executionCount, HttpContext context) {
        // 逻辑和上述lambda实现完全一致
    }
};

依赖导入

需要提前导入对应类:

import org.apache.http.HttpRequest;
import org.apache.http.NoHttpResponseException;
import org.apache.http.client.HttpRequestRetryHandler;
import org.apache.http.client.methods.HttpEntityEnclosingRequest;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.impl.client.DefaultServiceUnavailableRetryStrategy;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import javax.net.ssl.SSLException;
import java.net.SocketTimeoutException;
import java.io.IOException;

内容的提问来源于stack exchange,提问作者Nyamesa Onderi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 04:54:02