繁体   English   中英

如何诊断泄露的http连接(org.apache.http.impl.conn.tsccm.ConnPoolByRoute)

[英]How to diagnose leaked http connections (org.apache.http.impl.conn.tsccm.ConnPoolByRoute)

我有一个在Amazon的EC2上运行的多线程java程序。 它使用org.apache.http.impl.client.DefaultHttpClient通过HttpPost和HttpGet从供应商查询和获取数据项。 同时,它使用AWS的Java SDK将检索到的数据项推送到S3。

运行几天后,我得到通常伴随http连接泄漏的症状:

org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection
at org.apache.http.impl.conn.tsccm.ConnPoolByRoute.getEntryBlocking(ConnPoolByRoute.java:417)
at org.apache.http.impl.conn.tsccm.ConnPoolByRoute$1.getPoolEntry(ConnPoolByRoute.java:300)
at org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager$1.getConnection(ThreadSafeClientConnManager.java:224)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:391)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:732)

由于AWS和我对数据供应商的请求都使用Http连接,我不太确定我究竟忘记了HttpEntity.consume()S3ObjectInputStream.close() (除非它还有其他东西......)。

所以这是我的问题:有没有办法监控org.apache.http.impl.conn.tsccm.ConnPoolByRoute这样至少我可以检测到什么时候我开始泄漏连接/实体未正确消耗/ http流未关闭? (我感觉它只在某些条件下发生,例如,当抛出某些异常时,绕过我的代码中消耗HttpEntities的逻辑,关闭流等等。)任何关于如何诊断最终导致我的所有http的想法使用ConnectionPoolTimeoutException失败的连接将是最受欢迎的。 我不想在尝试解决问题的根本原因之间等待4天以上。

如果您正在使用PoolingClientConnectionManager注释,则有getTotalStats()getStats(final HttpRoute route) ,它们将为您提供一个PoolStats对象,其中包含您要监视的数据。

只需从httpclient获取ConnectionManager:

PoolingClientConnectionManager poolManager = (PoolingClientConnectionManager) httpClient.getConnectionManager();

如果你可以访问org.apache.http.impl.conn.tsccm.ConnPoolByRoute然后将它的connTTL设置为足够低的值,那么它的WaitingThreadAborter最终将终止连接。 它会在那里显示一个很好的堆栈跟踪。 另一种选择是使用CGLIB或其他一些字节码操作框架来创建包装org.apache.http.impl.conn.tsccm.ConnPoolByRoute的代理类。 根据您的环境,设置可能并不那么容易,但它是调试像您这样的问题的一个非常有价值的工具。 (是的,如果您碰巧使用弹簧或只是简单的Aspects,设置将是超级的:))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM