Sam*_*Sam 18 spring connection-pooling resttemplate
只是想知道开箱即用的RestTemplate是使用连接池还是每次只是建立一个新的连接?
小智 17
默认情况下,RestTemplate每次都会创建新的Httpconnection,并在完成后关闭连接.
如果您需要在rest模板下有连接池,那么您可以使用池连接的ClientHttpRequestFactory的不同实现.
new RestTemplate(new HttpComponentsClientHttpRequestFactory())
Run Code Online (Sandbox Code Playgroud)
我相信RestTemplate不会使用连接池来发送请求,它会使用SimpleClientHttpRequestFactory来包装标准JDK的HttpURLConnection打开和关闭连接。
确实,您可以配置RestTemplate为使用池化实现,例如,HttpComponentsClientHttpRequestFactory但最有可能的是,您可能还需要配置一些设置以防止请求超时。
我已经在Spring的RestTemplate请求超时故障排除中写了关于此问题的博客。
是的,Spring RestTemplateBuilder使用apache httpclient进行池化(用法)。RestTemplateBuilder创建HttpComponentsClientHttpRequestFactory并使用HttpClientBuilder。HttpClientBuilder是最有趣的(源):
s = System.getProperty("http.maxConnections", "5");
int max = Integer.parseInt(s);
poolingmgr.setDefaultMaxPerRoute(max);
poolingmgr.setMaxTotal(2 * max);
Run Code Online (Sandbox Code Playgroud)
因此,默认情况下,每个路由(主机)的池大小等于5。总池大小=10。要检查连接池日志记录集的日志记录级别,如下所示:
org.apache.http.impl.conn.PoolingHttpClientConnectionManager=TRACE
Run Code Online (Sandbox Code Playgroud)
您可以在RestTemplate那里创建一个 Bean并在那里进行配置:
@Bean
public RestTemplate restTemplate() {
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setMaxTotal(100);
connectionManager.setDefaultMaxPerRoute(20);
RequestConfig requestConfig = RequestConfig
.custom()
.setConnectionRequestTimeout(5000) // timeout to get connection from pool
.setSocketTimeout(5000) // standard connection timeout
.setConnectTimeout(5000) // standard connection timeout
.build();
HttpClient httpClient = HttpClientBuilder.create()
.setConnectionManager(connectionManager)
.setDefaultRequestConfig(requestConfig).build();
ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
return new RestTemplate(requestFactory);
}
Run Code Online (Sandbox Code Playgroud)
编辑
如果您想使用千分尺度量,您还应该使用RestTemplateBuilder来构建 RestTemplate。
| 归档时间: |
|
| 查看次数: |
26325 次 |
| 最近记录: |