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

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();

关键说明

  1. 接口选择:ServiceUnavailableRetryStrategy的retryRequest方法直接提供HttpResponse参数,可直接获取响应状态码,完美匹配你的需求。
  2. 重试次数计数:executionCount代表已经完成的请求执行次数(第一次请求执行后,executionCount=1;第一次重试后,executionCount=2,以此类推)。如果希望最多重试3次(即总共执行4次请求),则判断条件为executionCount <= 3。
  3. 重试间隔:getRetryInterval方法定义两次重试之间的等待时间,可根据业务场景调整(比如设置为1000毫秒即1秒)。

补充说明

如果你同时需要处理请求异常重试和响应码重试,可以同时配置HttpRequestRetryHandler和ServiceUnavailableRetryStrategy,HttpClient会分别处理两种场景:

  • HttpRequestRetryHandler处理请求发送失败的异常情况
  • ServiceUnavailableRetryStrategy处理已收到响应但需要重试的情况

内容的提问来源于stack exchange,提问作者Abhishek Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 16:32:40