4

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)

HttpEntity.consume()AWS とデータ ベンダーへの私のリクエストの両方が Http 接続を使用しているため、正確にどこで, orを忘れているかはよくわかりS3ObjectInputStream.close()ません (それがまだ何か他のものでない限り...)。

ここに私の質問があります:接続/エンティティが適切に消費されていない/http ストリームが閉じられていないorg.apache.http.impl.conn.tsccm.ConnPoolByRouteことを少なくとも検出できるように監視する方法はありますか? (たとえば、特定の例外がスローされたり、HttpEntities を消費したり、ストリームを閉じたりするコード内のロジックをバイパスするなど、特定の条件下でのみ発生すると感じています。)最終的にすべての http を引き起こす原因を診断する方法についてのアイデアその ConnectionPoolTimeoutException で失敗する接続は大歓迎です。問題の根本原因を解決するために 4 日以上待つのは気が進まない.

4

2 に答える 2

5

PoolingClientConnectionManagerメモを使用している場合は、監視しようとしているデータを含むPoolStatsオブジェクトを提供するメソッドがgetTotalStats()あります。getStats(final HttpRoute route)

httpclientからConnectionManagerをフェッチするだけです。

PoolingClientConnectionManager poolManager = (PoolingClientConnectionManager) httpClient.getConnectionManager();
于 2012-12-17T14:56:14.410 に答える
1

にアクセスできる場合は、org.apache.http.impl.conn.tsccm.ConnPoolByRouteconnTTL を十分に低い値に設定して、WaitingThreadAborter最終的に接続を終了します。そこに素敵なスタックトレースが表示されます。もう 1 つのオプションは、CGLIB またはその他のバイトコード操作フレームワークを使用して、プロキシ クラス ラッピングを作成することorg.apache.http.impl.conn.tsccm.ConnPoolByRouteです。環境によっては、セットアップが簡単ではないかもしれませんが、あなたのような問題をデバッグするためのかなり価値のあるツールです. (そして、もしあなたがたまたまスプリングや単純なアスペクトを使っていれば、セットアップはとても簡単です:))

于 2012-06-27T02:08:45.433 に答える