Java 7では使えなくなっていた。どうやら、パフォーマンス劣化が原因なのかね。この辺参照。
カテゴリー: Java
HttpEntityは必ずconsumeすべし
HttpClient 4 系でいろいろとクロールすると途中でコネクションプールのコネクションが枯渇して、フリーズ状態になる問題に遭遇した。いまいち、原因を特定するのに無駄に時間を使ってしまったのだけど、結果的にはHttpEntityは必ずconsume(つまりclose)する必要があることだ。このHttpEntityはHttpClientのexecuteをした時に返ってくるHttpResponseから取得して利用するものだけど、レスポンスのステータスだけ見たければ、HttpResponseから値を取得してHttpEntityを使う必要がない。なので、利用したコネクションが解放されず、フリーズに陥る。というわけで、HttpEntityはレスポンスのボディが必要なくても取得してconsumeして終わるのが良いらしい…。
HttpContextはスレッド間で共有しない
HttpClient 4では
HttpResponse response = httpClient.execute(httpget, context);
みたいな感じでHttpContextを渡すかと思うけど、4.2からHttpContextはスレッド間では共有しないようにするのが正しいらしい。なので、contextをどっかで作っておいて、マルチスレッドで上記のコードを呼び出すと共有されてしまうので、
HttpResponse response = httpClient.execute(httpget, new BasicHttpContext(context));
とする必要があるようだ。S2RobotではHcHttpClientで思いっきり共有しているので、修正が必要そうだ…。