java - HttpClient 中的 setMaxTotal 和 setDefaultMaxPerRoute?

标签 java spring connection-pooling apache-httpclient-4.x resttemplate

我将 RestTemplateHttpComponentsClientHttpRequestFactory 一起使用,如下所示:

private RestTemplate restTemplate = new RestTemplate();

// singleton class so only one instance
public DataProcess() {
    restTemplate.setRequestFactory(clientHttpRequestFactory());
}

private ClientHttpRequestFactory clientHttpRequestFactory() {
    HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
    RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(1000).setConnectTimeout(1000)
            .setSocketTimeout(1000).setStaleConnectionCheckEnabled(false).build();
    PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager();
    poolingHttpClientConnectionManager.setMaxTotal(300);
    poolingHttpClientConnectionManager.setDefaultMaxPerRoute(300);

    CloseableHttpClient httpClientBuilder = HttpClientBuilder.create()
            .setConnectionManager(poolingHttpClientConnectionManager).setMaxConnPerRoute(300).setMaxConnTotal(300)
            .setDefaultRequestConfig(requestConfig).build();

    requestFactory.setHttpClient(httpClientBuilder);
    return requestFactory;
}

现在我的问题是:PoolingHttpClientConnectionManager 对象中设置 setMaxTotalsetDefaultMaxPerRoute 与设置 有什么区别? CloseableHttpClient 中的 code>setMaxConnPerRoutesetMaxConnTotal。我需要在这两个地方设置这些吗?

还有我们应该与 RestTemplate 一起使用的任何其他设置吗?我通过使用 RestTemplate 作为我的 HttpClient 来调用 Restful 服务,所以它必须很快,因为这段代码将在多线程应用程序中运行。

最佳答案

如果您不提供构建器参数,则构建器参数用于构建默认的池连接管理器。因此,在您的示例中,构建器上的集合是多余的。

参见 HttpClientBuilder (抱歉,我不得不删掉这个庞大的方法):

 public CloseableHttpClient build() {
    ... snip ...
    HttpClientConnectionManager connManagerCopy = this.connManager;
    if (connManagerCopy == null) {
        ... snip ...
        @SuppressWarnings("resource")
        final PoolingHttpClientConnectionManager poolingmgr = new PoolingHttpClientConnectionManager(
                RegistryBuilder.<ConnectionSocketFactory>create()
                    .register("http", PlainConnectionSocketFactory.getSocketFactory())
                    .register("https", sslSocketFactoryCopy)
                    .build(),
                null,
                null,
                null,
                connTimeToLive,
                connTimeToLiveTimeUnit != null ? connTimeToLiveTimeUnit : TimeUnit.MILLISECONDS);
        ... snip ...
        if (maxConnTotal > 0) {
            poolingmgr.setMaxTotal(maxConnTotal);
        }
        if (maxConnPerRoute > 0) {
            poolingmgr.setDefaultMaxPerRoute(maxConnPerRoute);
        }
        connManagerCopy = poolingmgr;
    }
    ... snip ...
    return new InternalHttpClient(... snip ...);
}

关于java - HttpClient 中的 setMaxTotal 和 setDefaultMaxPerRoute?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30931428/

相关文章:

MySQL Fabric 故障转移和 Hibernate 连接池

exception - Java 编译器是设计成这样工作还是有限制?

java - 谁能解释一下如何用java读取文件。 -1是什么意思?我想读取的文件中没有任何数字..困惑 :(

java - native 查询可以使用 sqlDeveloper,但使用 hibernate 时失败

java - 清洁代码以在 Spring @PatchMapping 中对域类进行部分修补?

java - EntityResponse 字符集编码错误

Tomcat 连接池 - tomcat 7

java - .jar 文件不适用于 Windows 调度程序

java - 如何根据java中的if-else条件向结果集返回的列值添加颜色

tomcat - 如何在部署到 elasticbeanstalk 中的 tomcat 的 clojure ring web 应用程序中关闭 Hikari 连接池