Java のネットワーク接続にて、なんで個別にタイムアウトが設定できないんだよぅ、というアレ。
とりあえず、一括指定はどうやってやるんだったか……と調べていて偶然発見できたのでメモ。

JDK1.4以前

いまはむかし……システムプロパティで一括設定

-Dsun.net.client.defaultConnectTimeout=1000
-Dsun.net.client.defaultReadTimeout=1000

sun.net.client.defaultConnectTimeout (デフォルト: -1)
sun.net.client.defaultReadTimeout (デフォルト: -1)
これらのプロパティでは、java.net.URLConnection で使用されるプロトコルハンドラに対して、デフォルトの接続および読み取りタイムアウト (応答) を指定します。

sun.net.client.defaultConnectTimeout は、ホストへの接続を確立する際のタイムアウト (ミリ秒) を指定します。 たとえば、HTTP 接続の場合は、HTTP サーバへの接続を確立する際のタイムアウトのことです。 FTP 接続の場合は、FTP サーバへの接続を確立する際のタイムアウトのことです。

sun.net.client.defaultReadTimeout は、リソースへの接続が確立されているときの、入力ストリームから読み取る際のタイムアウト (ミリ秒) を指定します。

Java 2 SDK, Standard Edition ドキュメント V1.4.0 - ネットワークのプロパティ

JDK1.5以降

Java5.0ではAPIから
java.net.URLConnection#setConnectTimeout
java.net.URLConnection#setReadTimeout
で接続毎に設定も可能。

また、JDK1.4以前で使っていたシステムプロパティ(defaultConnectTimeout, defaultReadTimeout)も使える。

ネットワーク API で、プロトコルハンドラの接続および読み取り操作のタイムアウトに関する設定が可能になった。サーバ障害時に堅牢な動作が要求される HTTP クライアントアプリケーションで役立つ (4700777)

J2SE 5.0 におけるネットワークの機能拡張
public void setConnectTimeout(int timeout)

この URLConnection で参照されるリソースへの通信リンクを開くときに使用する、指定されたタイムアウト値を、ミリ秒単位で設定します。接続を確立する前にタイムアウトになる場合、java.net.SocketTimeoutException がスローされます。タイムアウトに 0 を指定すると、タイムアウトは無限と解釈されます。

このメソッドのいくつかの非標準実装では、指定されたタイムアウトが無視されることがあります。接続タイムアウトの設定を確認するには、getConnectTimeout() を呼び出してください。

URLConnection (Java 2 Platform SE 5.0) - setConnectTimeout
public void setReadTimeout(int timeout)

指定されたタイムアウトまでの読み取りタイムアウトをミリ秒単位で設定します。0 以外の値は、リソースへの接続が確立されたときに入力ストリームから読み取る際のタイムアウトを指定します。データを読み取る準備ができる前にタイムアウトになる場合、java.net.SocketTimeoutException がスローされます。タイムアウトに 0 を指定すると、タイムアウトは無限と解釈されます。

このメソッドのいくつかの非標準実装では、指定されたタイムアウトが無視されることがあります。読み取りタイムアウトの設定を確認するには、getReadTimeout() を呼び出してください。

URLConnection (Java 2 Platform SE 5.0) - setReadTimeout

蛇足

「このメソッドのいくつかの非標準実装では、指定されたタイムアウトが無視されることがあります。」というのが気になるけど、まぁいいか……

J2SE 5.0 におけるネットワークの機能拡張 には (4700777) と書いてあったのでこの番号を頼りに、Bug ID: 4700777 HTTP client: Connect and read timeouts を見つけたけど、その先の実際にどのAPIで利用できるかが辿れない。この機能は、どうやって見つけるもんなのだろうか? APIリファレンスを眺めてはじめて発見できる機能?

Microsoft Windows 98/ME では、Socket.setSoTimeout を使用して設定した読み取りタイムアウトや、ServerSocket.setSoTimeout を使用して設定した受け入れタイムアウトでは、想定よりも 500 ms 後にタイムアウトする場合があります。この問題はすべての J2SE リリースで発生しますが、Microsoft Windows 98/ME のバグが原因です。Microsoft Windows 98/ME 用のパッチは、Microsoft Web サイトの http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q257821& から入手できます。

JDK 5 ドキュメント - ネットワーク機能リリースノート

Ref.

tags: zlashdot Java Java

Posted by NI-Lab. (@nilab)