Apache HttpClient自定义重试:如何获取响应状态码实现重试逻辑
Apache HttpClient 自定义响应码触发重试的实现方案
你当前使用的HttpRequestRetryHandler主要用于处理请求执行阶段的异常(如连接超时、IO异常等),无法直接获取响应对象。要根据响应状态码触发重试,需要使用HttpClient专门提供的ServiceUnavailableRetryStrategy接口,它支持基于响应结果的重试逻辑。
正确实现代码
HttpClientBuilder custom = HttpClients.custom(); custom.setSSLHostnameVerifier((hostname, session) -> true); // 配置基于响应码的重试策略 custom.setServiceUnavailableRetryStrategy(new ServiceUnavailableRetryStrategy() { // 重试间隔(毫秒) @Override public long getRetryInterval() { return 1000; // 可根据需求调整重试间隔 } // 判断是否需要重试 @Override public boolean retryRequest(HttpResponse response, int executionCount, HttpContext context) { int statusCode = response.getStatusLine().getStatusCode(); // 条件:响应码不是601/602,且重试次数≤3(executionCount从1开始计数,第一次请求执行后executionCount=1) return (statusCode != 601 && statusCode != 602) && executionCount <= 3; } }); // 构建HttpClient CloseableHttpClient httpClient = custom .setDefaultRequestConfig(RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD).build()) .build();
关键说明
- 接口选择:
ServiceUnavailableRetryStrategy的retryRequest方法直接提供HttpResponse参数,可直接获取响应状态码,完美匹配你的需求。 - 重试次数计数:
executionCount代表已经完成的请求执行次数(第一次请求执行后,executionCount=1;第一次重试后,executionCount=2,以此类推)。如果希望最多重试3次(即总共执行4次请求),则判断条件为executionCount <= 3。 - 重试间隔:
getRetryInterval方法定义两次重试之间的等待时间,可根据业务场景调整(比如设置为1000毫秒即1秒)。
补充说明
如果你同时需要处理请求异常重试和响应码重试,可以同时配置HttpRequestRetryHandler和ServiceUnavailableRetryStrategy,HttpClient会分别处理两种场景:
HttpRequestRetryHandler处理请求发送失败的异常情况ServiceUnavailableRetryStrategy处理已收到响应但需要重试的情况
内容的提问来源于stack exchange,提问作者Abhishek Singh
相关产品推荐
相关产品推荐

