我有这段代码:
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分钟以上。
当我单独或同时尝试setConnectTimeout
和setConnectionRequestTimeout
时会发生这种情况。
为什么只有.setSocketTimeout(40 * 1000)
有效地检查超时40秒?而另一个不是吗?
这些是版画:
Read timed out
Timeout waiting for connection from pool
首先由setConnectionRequestTimeout
触发,第二个由setSocketTimeout
触发吗?
答案 0 :(得分:18)
getConnectionRequestTimeout()
返回从连接管理器请求连接时使用的超时(以毫秒为单位)。
getConnectTimeout()
确定建立连接之前的超时(以毫秒为单位)。
getSocketTimeout()
以毫秒为单位定义套接字超时(SO_TIMEOUT),这是等待数据的超时,换句话说,两个连续数据包之间的最大周期不活动。)
__
所以,第一个, connectionRequestTimeout 在你有一个连接池并且它们都很忙时发生,不允许连接管理器给你一个连接来发出请求。
建立连接时会发生connectTimeout 。例如,在进行tcp握手时。
socketTimeout 就像描述一样,是等待数据时的超时。通常在服务器运行缓慢时发生。