web-dev-qa-db-ja.com

HttpURLConnectionタイムアウトのデフォルト

応答を待っているが接続が「切断」されているため、応答が届かないなど、一部のtcp要求が時々「スタック」する問題が発生しているようです。これは、デフォルトのタイムアウトでのHttpURLConnectionの予想される動作ですか?デフォルトでこの奇妙な「ハング」状態に陥らないように、賢明なデフォルトが設定されていますか?

10
rogerdpack

HttpURLConnection の「デフォルト」タイムアウトがゼロであると表示されます。これは「タイムアウトなし」を意味します。

残念ながら、私の経験では、これらのデフォルトを使用すると、サーバーへの接続で何が起こるかによって、不安定な状態になる可能性があります。 HttpURLConnectionを使用し、明示的に(少なくとも読み取り)タイムアウトを設定しない場合、接続は永続的な古い状態になる可能性があります。デフォルトで。したがって、常にsetReadTimeoutを「何か」に設定すると、接続が孤立する可能性があります(アプリの実行方法に応じてスレッドが発生する可能性があります)。

試行錯誤の結果、ソケット自体には(少なくともOS Xでは)2分の「接続タイムアウト」が組み込まれているように見えるため、setConnectTimeoutを呼び出す必要はないようです。

システムプロパティ を調整することにより、タイムアウトの「グローバルデフォルト」を設定できる場合もあります。

修正/予後:常にreadTimeoutを設定します(非常に大きい場合でも)、または SO_KEEPALIVE を設定できる別のクライアントを使用します。デフォルトでは、プログラムがなくてもプログラムが「永久に」ハングする可能性があります。

22
rogerdpack