我的理解是,ClientConnectionManager的所有实现都基于路由保持连接。如果涉及代理,这导致基本上没有持久连接。例如,HttpClient需要通过带有修复IP的HTTP代理访问1000个不同的域,它必须与代理建立至少1000个连接,而不是创建与代理的1个持久连接,并将其重用于1000个请求。
我正在模拟访问数千个域的多个用户(假域,所有dns解析为几个IP,解析发生在代理之后,因此与HttpClient无关)。上面的行为会快速耗尽localhost中的所有可用端口,因为我增加了用户和域的数量,因此会出现Address Bind错误。
有没有办法让HttpClient在代理的基础上保持连接?即。 HttpClient仅维护给定代理的指定连接数。
由于
答案 0 :(得分:2)
经过深入研究,似乎Apache HttpClient不支持这种开箱即用的行为。我必须修改HttpClient / HttpCore源才能拥有这个功能,即。仅基于localAddress和First Proxy地址维护持久连接。
我修改过的课程是:
org.apache.http.conn.routing.HttpRounte.java和 org.apache.http.conn.routing.BasicRouteDirector.java。
基本上我更改了HttpRoute中的hashCode和equal方法(它用作持久conn查找的哈希表的键),因此如果涉及代理,查找不会考虑目标地址。
上述修改的初始测试结果显示,在我的方案中,请求吞吐量大约提高了100倍。到目前为止它对我来说很好。
凯文