我的理解是,ClientConnectionManager的所有实现都基于路由来保持连接。如果涉及代理,这将导致基本上没有持久连接。例如,HttpClient需要通过具有固定IP的HTTP代理访问1000个不同的域,它必须建立到代理的至少1000个连接,而不是创建到代理的1个持久连接,并将其重用于1000个请求。
我正在模拟多个用户访问数以千计的域名(假域名,所有域名解析为几个I,解析发生在代理之后,所以与HttpClient无关)。当我增加用户和域的数量时,上述行为很快就会用完本地主机中的所有可用端口,结果就会出现地址绑定错误。
有没有办法让HttpClient在代理的基础上保持连接?即。HttpClient仅维护到给定代理的指定数量的连接。
发布于 2012-11-22 04:30:52
经过深入研究,Apache HttpClient似乎不支持这种开箱即用的行为。我必须修改HttpClient/HttpCore源代码,以便具有此功能,即。仅基于localAddress和第一个代理地址维护持久连接。
我修改的类是:
org.apache.http.conn.routing.HttpRounte.java和org.apache.http.conn.routing.BasicRouteDirector.java.
基本上,我更改了HttpRoute中的hashCode和equal方法(它被用作持久conn查找的哈希表的键),因此如果涉及代理,则查找不会考虑目标地址。
上述修改的初步测试结果显示,在我的场景中,请求吞吐量大约提高了100倍。到目前为止,它对我来说工作得很好。
凯文
https://stackoverflow.com/questions/13425327
复制相似问题