在我的多线程应用程序中,我向一些HTTP服务器发送了一些HTTP请求,比如说10个服务器,每个服务器300个不同的请求,大约每小时一次,没有什么太严重的。
我的问题是:我应该为所有传出连接保留一个HttpClient吗?也许每个唯一的目标服务器一个?还是每个“迭代”一次(每个小时的开始大约需要10分钟)?
我目前正在为每个请求使用一个PoolingHttpClientConnectionManager
和HttpClientBuilder.setConnectionManager(connectionManager).build()
。
我感觉到资源的浪费,尽管我使用的是池连接管理器,但每个服务器的ESTABLISHED
状态也很多。 (对每个服务器的请求是一对一发送的,并且不是并发的)
最佳答案
我目前正在为每个请求使用一个PoolingHttpClientConnectionManager和HttpClientBuilder.setConnectionManager(connectionManager).build()。
为每个请求构建一个新的HttpClient是巨大的浪费。您应针对每个配置(每个客户端可以具有不同的连接管理器,最大并发请求等)或针对应用程序的每个独立模块使用HttpClient(以免在其他独立模块之间创建依赖关系)。
同样不要忘了.build()
返回CloseableHttpClient
,这意味着您在使用完httpClient.close()
后应调用ojit_code,否则可能会浪费资源。
更新@Nati的评论:
什么会被“浪费”? HttpClient是重对象吗?
Here you can see the source code for the creation of an http client.如您所见,它有很多代码,对每个请求都没有意义。这种不必要的消耗CPU并产生大量垃圾,从而降低了整个应用程序的性能。您所做的分配越少-越好!换句话说,为每个请求创建新客户端不会带来的好处-只有缺点。
在整个应用程序的整个生命周期中将其保留为bean有意义吗?
恕我直言,它确实如此,除非很少(非常)很少使用它。
HttpConnection和HttpClient之间的关系
每个http客户端可以执行多个http请求。每个请求都在客户端的上下文中执行(它的配置-即代理,并发,保持 Activity 等),每个请求的响应都必须关闭(reset(),close(),不记得确切的名称) )以释放连接,以便可以将其重新用于其他请求。