スキップしてメイン コンテンツに移動

Apache HttpClient で タイムアウト処理する際の注意


Apache HttpClient で忘れてはならない処理。
それは、CloseableHttpClient#close() 。

簡単に言えば

CloseableHttpClient httpclient = HttpClients.createDefault();
try {
  // 処理
} finally {
  httpclient.close(); // ←これを忘れてはいけない
}


ということなのですが、
忘れることもないと感じますが
それが忘れてしまいまして
色々うまく動作しませんでした。


忘れるとどうなるか

close を呼び忘れると、その後どうなるのか。

それは、
タイムアウトなどで一度通信が切断されてしまうと、ずっと通信できなくなる
という状態になります。

自分の例では、タイムアウトで通信が切れてしまった際に
処理を再実行(リトライ)するようプログラムしていたのですが
リトライできずにまた通信が切れてしまう
という状況に陥りました。

close しなければ
おそらくコネクション関連のリソースを開放しないのでしょう。
(さすがにプログラム本体が終了すれば開放される)



忘れる原因

なぜ忘れたかといえば、
この close 処理が、書いていないのです。

Quick Start を参考にコードを書いてしまって
それ以降のコードがうまく動作しなかったのです。



というわけで

Quick Start のように、そこでプログラムが終了するなら問題ないのですが
継続的に処理をするなら close 必須ということになります。
ちなみに Examples のほうのコードには close が書いてあります。

まぁ名前からして CloseableHttpClient というくらいですから
close しないといけないですね。