Apache HttpClient 超时

2022-08-31 17:10:36

有没有办法为整个HttpClient执行指定超时?

我尝试了以下方法:

httpClient.getParams().setParameter("http.socket.timeout", timeout * 1000);
httpClient.getParams().setParameter("http.connection.timeout", timeout * 1000);
httpClient.getParams().setParameter("http.connection-manager.timeout", new Long(timeout * 1000));
httpClient.getParams().setParameter("http.protocol.head-body-timeout", timeout * 1000);

它实际上工作正常,除非远程主机发回数据 - 即使在一个字节/秒 - 它将继续永远读取!但是我想在10秒内中断连接,无论主机是否响应。


答案 1

对于较新版本的 httpclient(例如 http 组件 4.3 - https://hc.apache.org/httpcomponents-client-4.3.x/index.html):

int CONNECTION_TIMEOUT_MS = timeoutSeconds * 1000; // Timeout in millis.
RequestConfig requestConfig = RequestConfig.custom()
    .setConnectionRequestTimeout(CONNECTION_TIMEOUT_MS)
    .setConnectTimeout(CONNECTION_TIMEOUT_MS)
    .setSocketTimeout(CONNECTION_TIMEOUT_MS)
    .build();

HttpPost httpPost = new HttpPost(URL);
httpPost.setConfig(requestConfig);

答案 2

目前没有办法设置这种类型的最大请求持续时间:基本上你想说我不在乎任何特定的请求阶段超时,但整个请求的持续时间不得超过15秒(例如)。

最好的办法是运行一个单独的计时器,当它过期时,提取 HttpClient 实例使用的连接管理器并关闭连接,这应该会终止链接。让我知道这是否适合您。


推荐