为什么`setConnectionRequestTimeout`没有停止我的1分钟获取请求?

时间:2015-07-24 13:30:41

标签: java http request timeout client

我有这段代码:

    RequestConfig requestConfig = RequestConfig.custom()
            .setConnectTimeout(40 * 1000)
            .setConnectionRequestTimeout(40 * 1000)
            .setSocketTimeout(40 * 1000)
            .build();
    client = HttpClientBuilder
            .create()
            .setDefaultRequestConfig(requestConfig)
            .build();
}

    try {

        Stopwatch stopWatch = Stopwatch.createStarted();
        response = client.execute(new HttpGet(routingRequestUrl));
        stopWatch.stop();

    } catch (Exception e) {
        answer.errorMsg = e.getMessage();
        answer.latency =  null;
    }

当我的客户端配置不包含.setSocketTimeout(40 * 1000)时 - stopWatch显示请求可能需要1分钟以上。

当我单独或同时尝试setConnectTimeoutsetConnectionRequestTimeout时会发生这种情况。

为什么只有.setSocketTimeout(40 * 1000)有效地检查超时40秒?而另一个不是吗?

这些是版画:

Read timed out

Timeout waiting for connection from pool

首先由setConnectionRequestTimeout触发,第二个由setSocketTimeout触发吗?

1 个答案:

答案 0 :(得分:18)

https://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/config/RequestConfig.html

getConnectionRequestTimeout()

返回从连接管理器请求连接时使用的超时(以毫秒为单位)。

getConnectTimeout()

确定建立连接之前的超时(以毫秒为单位)。

getSocketTimeout()

以毫秒为单位定义套接字超时(SO_TIMEOUT),这是等待数据的超时,换句话说,两个连续数据包之间的最大周期不活动。)

__

所以,第一个, connectionRequestTimeout 在你有一个连接池并且它们都很忙时发生,不允许连接管理器给你一个连接来发出请求。

建立连接时会发生

connectTimeout 。例如,在进行tcp握手时。

socketTimeout 就像描述一样,是等待数据时的超时。通常在服务器运行缓慢时发生。