我是否正确使用CloseableHttpClient?

时间:2018-08-26 07:35:19

标签: java performance-testing apache-httpclient-4.x latency

这是我使用CloseableHttpClient的方式:

private static final CloseableHttpClient httpClient = HttpClientBuilder.create().build();
HttpGet httpGet = new HttpGet(myurl);
HttpResponse httpResponse = httpClient.execute(httpGet);

基本上,以上代码位于单例类中,因此仅存在httpClient的一个实例,可以满足所有请求。

一个httpClient服务于所有请求是否会对性能产生影响? 因为我收到httpResponse时发现系统运行缓慢。

我还有另一个问题是,我是否需要关闭上述任何资源,如果是,则何时关闭?

1 个答案:

答案 0 :(得分:0)

根据文档,考虑使用Pooling Connection Manager

  

PoolingHttpClientConnectionManager 是一个更复杂的实现,它管理客户端连接池并能够处理来自多个执行线程的连接请求。连接是基于每个路由池的。对于管理器已在池中具有持久连接的路由请求,将通过从池中租赁连接而不是创建全新的连接来进行服务。

所以我建议您修改您的代码,例如:

PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
//configure it as per your reqiurements, i.e.
cm.setMaxTotal(5000);
cm.setDefaultMaxPerRoute(20);
CloseableHttpClient httpClient = HttpClients.custom()
    .setConnectionManager(cm)
    .build();

还请注意,有一个名为Apache JMeter的免费和开源的负载测试工具,特别是在后台使用Apache HttpComponents,因此您可以将其用于负载测试目的,也可以查看如果您有疑问,请执行基础实施。

我建议您重新考虑您的方法并使用JMeter,因为在进行Web应用程序负载测试时,您需要照顾很多因素(标头,Cookie,缓存,身份验证,AJAX请求,嵌入式资源等)及其可能需要付出巨大的努力才能正确实施所有操作。您可以根据需要通过Java代码的API创建/运行JMeter测试,有关更多详细信息,请参见Five Ways To Launch a JMeter Test without Using the JMeter GUI文章。