如何基于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
相关产品推荐
相关产品推荐

