java.net.URL#openStream()はclient timeoutしない
JavaのSocket周りでは割とよくある感じですが、以下のコードだとconnectもreadもデフォルトで無限に待ち続ける挙動をします。
BufferedImage image = ImageIO.read(new URL(url).openStream());
Javadocをみると以下の通り。
Opens a connection to this URL and returns an InputStream for reading from that connection. This method is a shorthand for: openConnection().getInputStream()
実際、jdk1.6u18のソースを見るとopenConnection()してすぐにgetInputStream()しています。
public final InputStream openStream() throws java.io.IOException { return openConnection().getInputStream(); }
以下は適切にtimeoutさせる実装例です。URL#openStream()を使うのはやめてopenConnection()で取得したURLConnectionオブジェクトのsetterでタイムアウト値を設定します。
URLConnection conn = new URL(url).openConnection(); conn.setReadTimeout(1000); conn.setConnectTimeout(1000); conn.connect(); BufferedImage image = ImageIO.read(conn.getInputStream());
connect、readともに1000ミリ秒でSocketTimeoutExceptionを投げるようになります。