有一个请求的示例,RestTemplate其行为通过ClientHttpRequestFactory和配置RequestConfig。创建对象时,RequestConfig会设置三种不同的超时时间:ConnectTimeout、ConnectionRequestTimeout、SocketTimeout。请解释这是什么步骤,否则会得到油。尤其是setConnectTimeout和之间setConnectionRequestTimeout。有什么不一样的?如果我们基于请求-响应模型,怎么可能有请求之外的连接呢?
RestTemplate restTemplate = new RestTemplate(getClientHttpRequestFactory());
private ClientHttpRequestFactory getClientHttpRequestFactory() {
int timeout = 5000;
RequestConfig config = RequestConfig.custom()
// Вот тут.
.setConnectTimeout(timeout)
.setConnectionRequestTimeout(timeout)
.setSocketTimeout(timeout)
.build();
CloseableHttpClient client = HttpClientBuilder
.create()
.setDefaultRequestConfig(config)
.build();
return new HttpComponentsClientHttpRequestFactory(client);
}
首先,HttpClient 建立到服务器的 tcp 连接。此连接的超时由参数定义
ConnectTimeout。通常,此阶段的超时表明服务器在指定地址根本不可用。建立连接后,客户端向该连接发送 http 请求并开始等待响应。他会等他多久是由参数决定的ConnectionRequestTimeout。此阶段的超时是服务器过载或故障的标志。ConnectTimeout-建立tcp连接的时间ConnectionRequestTimeout-从连接管理器接收连接的时间。例如,此超时的发生可能表明传出连接池已用尽。SocketTimeout-两个数据包之间的最大连接不活动时间。这正是客户端等待服务器响应的时间