Springs RestTemplate默认连接池

时间:2017-05-25 19:57:01

标签: spring connection-pooling resttemplate

只是想知道开箱即用的RestTemplate是否使用了连接池,还是每次只建立一个新连接?

5 个答案:

答案 0 :(得分:18)

默认情况下,RestTemplate每次都会创建新的Httpconnection,并在完成后关闭连接。

如果您需要在rest模板下建立连接池,那么您可以使用不同的ClientHttpRequestFactory实现来汇集连接。

new RestTemplate(new HttpComponentsClientHttpRequestFactory())

答案 1 :(得分:6)

您可以为 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);
}

你可以做很多配置。请参阅https://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/impl/client/HttpClientBuilder.html

编辑

如果您想使用千分尺度量,您还应该使用 RestTemplateBuilder 来构建 RestTemplate。

答案 2 :(得分:5)

我相信RestTemplate不使用连接池发送请求,它使用SimpleClientHttpRequestFactory包装标准JDK HttpURLConnection打开和关闭连接

实际上,您可以将RestTemplate配置为使用池化实现,例如HttpComponentsClientHttpRequestFactory,但最有可能您可能还需要配置一些设置以防止请求超时。

我在Troubleshooting Spring's RestTemplate Requests Timeout

上发表了关于此问题的博文

答案 3 :(得分:4)

是的,Spring RestTemplateBuilder使用apache httpclient进行池(usage)。 RestTemplateBuilder创建HttpComponentsClientHttpRequestFactory并使用HttpClientBuilder。 HttpClientBuilder是最有趣的(source):

                s = System.getProperty("http.maxConnections", "5"); 
                int max = Integer.parseInt(s); 
                poolingmgr.setDefaultMaxPerRoute(max); 
                poolingmgr.setMaxTotal(2 * max); 

因此,默认情况下,每个路由(主机)的池大小等于5。总池大小= 10。 要检查连接池日志记录,请按以下步骤设置日志记录级别:

org.apache.http.impl.conn.PoolingHttpClientConnectionManager=TRACE

答案 4 :(得分:0)

我们可以在spring的rest模板下面使用okhttpclient来使用连接池。下面的详细博客

https://www.bytesville.com/changing-httpclient-in-spring-resttemplate/