在Spring引导应用程序中,我使用PoolingHttpClientConnectonManager创建连接池,如下所示:
@Bean
public PoolingHttpClientConnectionManager createCM() {
PoolingHttpClientConnectionManager pcm = new PoolingHttpClientConnectionManager();
poolingHttpClientConnectionManager.setMaxTotal(100);
poolingHttpClientConnectionManager.setDefaultMaxPerRoute(100);
return pcm;
}
因为我只有一个路由,所以我保持setMaxTotal和setDefaultMaxPerRoute的值相同。
底层httpClient配置如下:
@Bean
public CloseableHttpClient createHttpClient(PoolingHttpClientConnectionManager pcm, RequestConfig rc) {
CloseableHttpClient httpClient = HttpClientBuilder
.create()
.setConnectionManager(pcm)
.setDefaultRequestConfig(rc)
.build();
return httpClient;
}
现在的问题是,当我在非常重的负载下对我的应用程序进行压力测试以查看我的连接池的行为时,我看不到预期的。我使用jConsole监控应用程序的线程,每次我只看到2个处于可运行状态的连接池线程,即https-jsse-nio-80-ClientPoller-1和https-jsse-nio-80-ClientPoller-2。
我假设在大约每秒1500个请求的重负载下,它应该通过池中超过2个(默认)连接来完成。想知道出了什么问题或者我的配置是否不正确。
在我的例子中,我使用超文本传输协议组件作为肥皂客户端库,我使用一个实现WebServiceGatewaySupport的类。对此,我如下所示:
httpComponentsRequestFactory = new HttpComponentsClientHttpRequestFactory();
httpComponentsRequestFactory.setReadTimeout(readTimeout);
httpComponentsRequestFactory.setConnectTimeout(connectionTimeout);
httpComponentsRequestFactory.setHttpClient(createHttpClient(createConnectionManager(), createRequestConfig()));
client.setMessageSender(new ClientHttpRequestMessageSender(httpComponentsRequestFactory));
并启用日志记录以升级org. apache.http的DEBUG,我现在看到:
Connection released: [id: 0][route: {}->http://host:8080][total available: 1; route allocated: 1 of 100; total allocated: 1 of 100]
所以我设法将默认值提高到100个连接。