HttpURLConnection

Javaには java.net.HttpURLConnection というHTTPクライアントのクラスが存在します。しかし、こやつがどうにも込み入った使い方をするには使いづらいのであります。単純にGETしたりPOSTしたりするだけなら問題ないんですが。

自分が気になっている点は以下のふたつ。

  1. connectionタイムアウトの時間をインスタンス単位 *1 で指定できない。 *2
  2. インスタンス(というか内部のソケット)の使いまわしの基準が、接続先IPではなくURL文字列。

1番目の問題は、コンテキストによってタイムアウト時間を切り替えなければならない場合に、厄介なことになります。
2番目の問題は、DNSラウンドロビンやGSLBなどを用いた構成のシステムで、同じURLでも状況によってIPが変わりうる、且つ動きとして接続先IPが変わることが期待されている場合に問題となります。もう死んでる系、あるいはサーバに向かって、expireするまでずっと接続しつづけ……ぐふ。まあこちらはそういう思想の設計っていうだけのことですが、使いまわしのアルゴリズムをこちらでカスタマイズできたり、あるいはせめていくつかの中から選択できるようになってればなあ、と。

実案件で上記の問題に遭遇した際は、結局簡易なHTTP実装をソケットを使って作成して回避しました。JakartaのHttpClientを使っていれば、もしかしたらこんな問題にも悩まなくて済んだのかもしれませんが。
Javaという言語は、豊富な標準ライブラリが魅力のひとつだと思っていますが、どうにも昔からあるクラスにはクセのあるものが多いような気がしますネ。
たとえば こんなメソッド とか(笑)。

*1:URLConnectionクラスに対するconnectionタイムアウト時間の設定は システムプロパティ を用いるため、VM単位でしかできません。今気がつきましたが、よく見るとReadTimeoutもVM単位になってしまっていますね。他にもProxyまわりとか…。

*2:J2SE 5.0 Tigerではようやくタイムアウト時間を指定する setConnectTimeoutsetReadTimeout の両メソッドが追加されました。