Springs RestTemplate 默认连接池
Springs RestTemplate default connection pool
只是想知道开箱即用的 RestTemplate 是使用连接池还是每次都只是建立一个新连接?
默认情况下,RestTemplate 每次都会创建新的 Httpconnection,并在完成后关闭连接。
如果您需要在 rest 模板下有一个连接池,那么您可以使用 ClientHttpRequestFactory 的不同实现来池化连接。
new RestTemplate(new HttpComponentsClientHttpRequestFactory())
我相信 RestTemplate
不使用连接池发送请求,它使用 SimpleClientHttpRequestFactory
包装标准 JDK
的 HttpURLConnection
打开和关闭连接。
您确实可以配置 RestTemplate
以使用诸如 HttpComponentsClientHttpRequestFactory
之类的池化实现,但您很可能还需要配置一些设置以防止请求超时。
上写了关于这个问题的博客
是的,Spring RestTemplateBuilder
使用 Apache HttpClient 进行池化 (usage)。
RestTemplateBuilder
创建 HttpComponentsClientHttpRequestFactory
并使用 HttpClientBuilder
.
HttpClientBuilder
,默认情况下,将每个路由(主机)的池大小设置为 5,总池大小设置为 10 (source):
s = System.getProperty("http.maxConnections", "5");
int max = Integer.parseInt(s);
poolingmgr.setDefaultMaxPerRoute(max);
poolingmgr.setMaxTotal(2 * max);
检查连接池日志设置日志级别如下:
org.apache.http.impl.conn.PoolingHttpClientConnectionManager=TRACE
我们可以在spring的rest模板下使用okhttpclient来使用连接池。下面有详细的博客
https://www.bytesville.com/changing-httpclient-in-spring-resttemplate/
您可以为 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);
}
编辑
如果您想使用千分尺指标,您还应该使用 来构建 RestTemplate。
只是想知道开箱即用的 RestTemplate 是使用连接池还是每次都只是建立一个新连接?
默认情况下,RestTemplate 每次都会创建新的 Httpconnection,并在完成后关闭连接。
如果您需要在 rest 模板下有一个连接池,那么您可以使用 ClientHttpRequestFactory 的不同实现来池化连接。
new RestTemplate(new HttpComponentsClientHttpRequestFactory())
我相信 RestTemplate
不使用连接池发送请求,它使用 SimpleClientHttpRequestFactory
包装标准 JDK
的 HttpURLConnection
打开和关闭连接。
您确实可以配置 RestTemplate
以使用诸如 HttpComponentsClientHttpRequestFactory
之类的池化实现,但您很可能还需要配置一些设置以防止请求超时。
是的,Spring RestTemplateBuilder
使用 Apache HttpClient 进行池化 (usage)。
RestTemplateBuilder
创建 HttpComponentsClientHttpRequestFactory
并使用 HttpClientBuilder
.
HttpClientBuilder
,默认情况下,将每个路由(主机)的池大小设置为 5,总池大小设置为 10 (source):
s = System.getProperty("http.maxConnections", "5");
int max = Integer.parseInt(s);
poolingmgr.setDefaultMaxPerRoute(max);
poolingmgr.setMaxTotal(2 * max);
检查连接池日志设置日志级别如下:
org.apache.http.impl.conn.PoolingHttpClientConnectionManager=TRACE
我们可以在spring的rest模板下使用okhttpclient来使用连接池。下面有详细的博客
https://www.bytesville.com/changing-httpclient-in-spring-resttemplate/
您可以为 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);
}
编辑
如果您想使用千分尺指标,您还应该使用