私は最近Javaアプリケーションの操作上の問題を調査していました。 processAとprocessBの2つのプロセスが同じホスト上で実行されています。ソケットソケットの#接続タイムアウトのJava
processAはprocessBにソケット接続を行います。 processBが再起動されましたが、何とか再起動後、processAからのすべてのSocket#connect呼び出しがブロックされました(分)。
私はprocessBがどうにかしてソケットが壊れた状態(SYNを受け取っていますが応答しない)であったと思います。問題はそれ自体が修正されました(自動再起動)ので、確実にtcpトラフィックを取得できませんでした。
私のソケットクライアントは接続時に短いタイムアウトが必要であることがわかります(この場合、デフォルトは大量です)。
私は、ソケットクライアントのテストに失敗した方法を書いているかどうか不安でした。
はこのような何かをすることが可能です:
@Test
public void testClientTimeoutOnConnectionAttempt() {
startBrokenSocketServer()
assertConnectionExceptionWithinOneSecond(myClient);
}
私は手動でIPFWとのnetcatを使用して、これらの条件を作成する方法を考え出しました。
sudo ipfw add 100 drop ip from 127.0.0.1 6969 to any
nc -l -p 6969
(RST ACKを送信し、OSを防止する)、6969に耳を傾け、そしてIPFWは、NCから任意SYN_ACK受信私のJavaプロセスを妨げNC。
Socket#connectでタイムアウトを設定しないと、SocketExceptionの前に75秒(mac osで)かかりました。タイムアウトを指定すると、それより早く失敗します。
私が変更する必要があるクライアントは、別のチームに所属しています。私はそれを実証する自動化されたテストと一緒にそれらの修正を出荷したいと思います。どのようにそれを行う上の任意のアイデアですか?
グレーありがとうございます。それは助けになる。おそらく、これらのことを捕まえる最良の方法は、findbugのようなコード解析ツールを使うことです。私は、タイムアウトなしで接続のバージョンを避けるべきだと思います。 – darraghc
うん、合意した。これは、Cの世界でさえ長い間真実でした。デフォルトのカーネルのタイムアウトは、現代のすべてのWebアプリケーションの99%でちょうどはるかに長い分のようなものです。 – Gray