gpt4 book ai didi

java - 多线程应用程序中的 Apache HttpClient 和 HttpConnection

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:06:34 28 4
gpt4 key购买 nike

在我的多线程应用程序中,我向一些 http 服务器发送一些 http 请求,我会说 10 个服务器,每个服务器 300 个不同的请求,大约每小时一次,没什么大不了的。

我的问题是:我应该为所有传出连接保留一个 HttpClient 吗?也许每个唯一的目标服务器一个?还是每次“迭代”一次(每小时开始时大约需要 10 分钟)?

我目前为每个请求使用单个 PoolingHttpClientConnectionManagerHttpClientBuilder.setConnectionManager(connectionManager).build()

我有一种真正的资源浪费的感觉,而且我还看到每个服务器的许多连接都处于 ESTABLISHED 状态,尽管我使用的是池连接管理器。 (每个服务器的请求是一个一个发送的,不是并发的)

最佳答案

I'm currently using a single PoolingHttpClientConnectionManager, and HttpClientBuilder.setConnectionManager(connectionManager).build() for every request.

为每个请求构建一个新的 HttpClient 是一种巨大的浪费。您应该为每个配置(每个客户端可以有不同的连接管理器、最大并发请求数等)或应用程序的每个独立模块使用一个 HttpClient(以免在其他独立模块之间创建依赖关系)。

另外不要忘记 .build() 返回一个 CloseableHttpClient,这意味着您应该调用 httpClient.close()完成使用它,否则你可能会泄漏资源。


更新以回应@Nati 的评论:

what will be "wasted" ? is HttpClient a heavy object ?

Here you can see the source code for the creation of an http client.正如您所看到的,它有很多代码并且在每个请求上执行是没有意义的。这种不必要的操作会消耗 CPU 并产生大量垃圾,从而降低整个应用程序的性能。你做的分配越少越好!换句话说,为每个请求创建新客户端没有好处 - 只有缺点。

does it make any sense of keeping it as a bean for the entire lifespan of the application

恕我直言,除非非常(非常)很少使用它。

relation between the HttpConnection and HttpClient

每个http客户端可以执行多个http请求。每个请求都在客户端的上下文中执行(它的配置——即代理、并发、保持 Activity 等)每个对请求的响应都必须关闭(reset()、close(),不记得确切的名称) 以释放连接,以便它可以重新用于另一个请求。

关于java - 多线程应用程序中的 Apache HttpClient 和 HttpConnection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35939602/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com