簡體   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