java - Apache HttpClient 4 每个代理而不是每个路由的持久连接

标签 java proxy apache-httpclient-4.x persistent apache-httpcomponents

据我了解,ClientConnectionManager 的所有实现都基于路由来保持连接。如果涉及代理,这将导致基本上没有持久连接。例如,HttpClient需要通过具有固定IP的HTTP代理访问1000个不同的域,它必须与代理建立至少1000个连接,而不是创建1个与代理的持久连接并将其重复用于1000个请求。

我正在模拟多个用户访问数千个域(假域,所有 dns 解析为几个 IP,解析发生在代理之后,因此与 HttpClient 无关)。当我增加用户和域的数量时,上述行为很快就会耗尽本地主机中的所有可用端口,结果会出现地址绑定(bind)错误。

有没有办法让 HttpClient 在代理基础上保持连接? IE。 HttpClient 仅维护与给定代理的指定数量的连接。

最佳答案

经过深入研究,Apache HttpClient 似乎不支持这种开箱即用的行为。我必须修改 HttpClient/HttpCore 源才能拥有此功能,即。仅根据本地地址和第一个代理地址维护持久连接。

我修改的类是:

org.apache.http.conn.routing.HttpRounte.java 和 org.apache.http.conn.routing.BasicRouteDirector.java。

基本上,我更改了 HttpRoute 中的 hashCode 和 equal 方法(用作持久 conn 查找的哈希表的键),因此如果涉及代理,查找不会考虑目标地址。

上述修改的初步测试结果显示,在我的场景中,请求吞吐量提高了约 100 倍。到目前为止,它对我来说效果很好。

凯文

关于java - Apache HttpClient 4 每个代理而不是每个路由的持久连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13425327/

相关文章:

java - 定期短轮询是否在服务器上扩展?

java - 如何显示数组中元素的位置?

android - 在 Android Studio 中设置 Http 代理

c++ - 如何使用 WFP 的 WFPSampler 重定向指定的数据包(Windows 过滤平台)

java - AWS SDK : java. lang.NoSuchMethodError

java - Apache HttpClient 和自定义端口

java - 从 java 运行可执行文件失败

java - 如何停止从 Firebase 检索数据?

android - 设置动态服务器

java - RestTemplate 会自动释放连接吗?