代码之家  ›  专栏  ›  技术社区  ›  Manas Saxena

我是否正确使用closeablehttpclient?

  •  0
  • Manas Saxena  · 技术社区  · 7 年前

    下面是我如何使用closeablehttpclient:

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

    基本上,上面的代码在一个单独的类中,所以只有一个实例 httpClient 正在处理所有请求。

    这是否会影响一个httpclient为所有请求提供服务的性能? 因为我在接收httpresponse时看到了系统的缓慢。

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

    1 回复  |  直到 7 年前
        1
  •  2
  •   Dmitri T    7 年前

    考虑使用 Pooling Connection Manager ,根据文件:

    池tpclientconnectionmanager 是管理客户端连接池的更复杂的实现,并且能够为来自多个执行线程的连接请求提供服务。连接以每条路由为基础进行池化。对于Manager已在池中具有可用持久连接的路由请求,将通过从池中租用连接而不是创建全新连接来提供服务。

    所以我建议修改你的守则如下:

    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请求、嵌入式资源等),并且可能需要付出巨大的努力才能正确实现所有内容。您可以通过其创建/运行jmeter测试 API 如果需要,请从Java代码中查看 Five Ways To Launch a JMeter Test without Using the JMeter GUI 文章了解更多细节。