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

Ela*_*da2 6 java client timeout http request

我有这个代码:

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

    try {

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

    } catch (Exception e) {
        answer.errorMsg = e.getMessage();
        answer.latency =  null;
    }
Run Code Online (Sandbox Code Playgroud)

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

它发生在我尝试setConnectTimeoutsetConnectionRequestTimeout单独或全部在一起时.

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

这些是印刷品:

Read timed out

Timeout waiting for connection from pool

第一个是由setConnectionRequestTimeout第二个引发的setSocketTimeout吗?

Pau*_*tos 18

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

getConnectionRequestTimeout()
Run Code Online (Sandbox Code Playgroud)

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

getConnectTimeout()
Run Code Online (Sandbox Code Playgroud)

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

getSocketTimeout()
Run Code Online (Sandbox Code Playgroud)

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

__

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

connectTimeout在建立连接时发生.例如,在进行tcp握手时.

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

  • 不幸的是,@ EladBenda2不是,您需要创建自己的包装器,该包装器的整体可以包含“ connectionRequestTimeout”,“ connectTimeout”和“ socketTimeout”。“ socketTimeout”是接收数据字节之间的时间(以秒为单位),因此只要您接收数据,它就不会超时。 (2认同)