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 日以上待つのは気が進まない.