【问题标题】:setMaxTotal and setDefaultMaxPerRoute in HttpClient?HttpClient 中的 setMaxTotal 和 setDefaultMaxPerRoute?
【发布时间】:2015-06-19 06:33:25
【问题描述】:

我正在使用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 中设置setMaxConnPerRoutesetMaxConnTotal 有什么区别。我需要在这两个地方设置这些吗?

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

【问题讨论】:

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


    【解决方案1】:

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

    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 ...);
    }
    

    【讨论】:

    • 感谢您的帮助。所以这意味着我可以安全地从CloseableHttpClient 中删除这两个属性,对吗?
    • 另外,你认为我应该使用任何其他属性来获得我在这里缺少的更好的性能吗?
    • 应该这样做,如果您有单元测试,您可以取出连接管理器并断言它已配置
    • 对我来说看起来不错,过时检查是一个很好的关闭选项,但你有。也许使 tcp nodelay 可配置,但如果您没有任何测量值,您可能会过早地进行优化。
    • 是的,我也在通过启用/禁用设置来一一测量它。我试图使用 tcp nodelay 但我无法理解如何在我当前的代码中做到这一点?我的目的是了解其他人认为最适合优化的方法,并不断衡量它直到我满意为止。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多