URLConnection#setConnectTimeout
J2SE1.5からやっと導入された接続タイムアウトの設定メソッドだが、少なくとも私の環境
O/S : Windows XP SP3 RC又はWindows Vista SP1 JDK : Java SE 6 Update 11
では全く機能していないように見える。(10秒をセットしても1秒をセットしても20秒でタイムアウトする)
ソースコードを追うも途中からsunの実装に入ってしまうのでわからん。
スタックトレースを見る限りではセットしたタイムアウト値を使わないでサーバに接続しに行っているとしか思えんのだが。
java.net.ConnectException: Connection timed out: connect at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333) at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182) at java.net.Socket.connect(Socket.java:519) at sun.net.NetworkClient.doConnect(NetworkClient.java:152) at sun.net.www.http.HttpClient.openServer(HttpClient.java:394) at sun.net.www.http.HttpClient.openServer(HttpClient.java:529) at sun.net.www.http.HttpClient.(HttpClient.java:233) at sun.net.www.http.HttpClient.New(HttpClient.java:306) at sun.net.www.http.HttpClient.New(HttpClient.java:323) at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:788) at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:729) at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:654) at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:832)
根拠も何も無いが、ソケットを生成する辺り、クラスが切り替わる辺り(HttpClient.openServer)が臭いと踏んでいる。
追記:
JSDKのドキュメントには「このメソッドのいくつかの非標準実装では、指定されたタイムアウトが無視されることがあります。」とあるんで、この振る舞いはひょっとしたら仕様なのかもしれない。