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

标签 java amazon-web-services connection-pooling apache-httpclient-4.x

我有一个在 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 对象。

只需从您的 http 客户端获取 ConnectionManager:

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

关于java - 如何诊断泄漏的 http 连接 (org.apache.http.impl.conn.tsccm.ConnPoolByRoute),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11198473/

相关文章:

amazon-web-services - AWS::RDS::DBInstance 不是从 cloudformation 创建的

java - 基于 Tomcat JNDI 和基于 Spring/Hibernate DS 的连接池有什么区别

Java 程序在执行时挂起,而之前没有挂起

java - 模型是否应该调用服务来获取数据

java - 如何在 Java 中将整数转换为本地化月份名称?

typescript - 如何使用 AWS CDK 检测控制台/堆栈偏差

python - boto3 aws 检查 s3 存储桶是否已加密

java - 如何在eclipselink中访问多个租户?

c# - 重用 SqlConnection 的最佳实践

go - redigo 连接池 - 为什么在删除陈旧连接时释放锁