私は非常にヘビーデューティなプロセスを呼び出そうとしています。平均作業時間は9〜10分と推定されます。
プロセスを実行しているとき、途方もなく巨大な数のタイムアウトを設定しました:99999999。
2分後、次のエラーが発生します。
Java.net.SocketTimeoutException:読み取りがタイムアウトしました
もう少しいじってみましたが、タイムアウトを3000に設定しましたが、予想どおり3秒後に同じエラーが発生しました。
socket.setSoTimeout(99999999)
が最大値を120000に設定する理由について何か考えがありますか?
私は同じ問題を抱えていて、解決策は、ソケットへのデータの最後の読み取りまたは書き込みまでsocket.shutdownInput(); socket.shutDownOutput();
を使用していませんでした。これにより、ソケットはFIN_WAIT状態になり、閉じる前に2分間待機しました。詳しくは この投稿 をご覧ください。
明らかに、設定していると思われるタイムアウトを設定していないか、後で誰かがタイムアウトを変更しています。さらに説明を得るには、コードを投稿する必要があります。
W.R. StevensによるTCP/IP Illustrated、 Vol II、#17.4によると、タイムアウトは1000Hzティックという短い時間に保持されるため、11分を超えるタイムアウトは不可能であることに注意してください。これはBSDコードに適用されます。
私はあなたのアプリケーションがどのように機能するかはわかりませんが、無限に設定してみてください ソケットへのタイムアウト
public void setSoTimeout(int timeout) throws SocketException
指定されたタイムアウト(ミリ秒単位)で
SO_TIMEOUT
を有効/無効にします。このオプションをゼロ以外のタイムアウトに設定すると、このソケットに関連付けられたInputStream
のread()
呼び出しは、この時間だけブロックします。タイムアウトが発生すると、ソケットはまだ有効ですが、Java.net.SocketTimeoutException
が発生します。このオプションは、ブロック操作に入る前に有効にする必要があります。タイムアウトは> 0
でなければなりません。ゼロのタイムアウトは、無限のタイムアウトとして解釈されます。
あなたがあなたの電話についてより多くの情報を提供するなら、私は答えを改善するかもしれません。