2

非常に奇妙なNIOの動作が発生します。ごくまれに、次のようにselect()を呼び出すと、切断時に(VMの強制終了のために)選択されたreadyKeyが取得されません。

while (selector.isOpen()){
    selector.select(SELECT_TIMEOUT);
    Set<SelectionKey> readyKeys = selector.selectedKeys();
    if(!readyKeys.isEmpty()){
        System.out.println("Selected...");
    }
}

キーは次のように登録されます。

key.interestOps(SelectionKey.OP_READ); 

OS:CentOS 6.2

VM:XEN

Java:JDK_1.6u17

Keep_ALIVEは1秒ごとに実行するように設定されています

4

1 に答える 1

2

キープアライブ障害が原因で接続が終了した場合、接続はリセットされ、正常に閉じられないため、FINは配信されないため、「読み取り可能」イベントは発生しません。この状況では、切断を検出する唯一の方法は、書き込み時にIOExceptionを使用するか、読み取りイベントがないこと、つまり本質的に読み取りタイムアウトによることです。

キープアライブを毎秒実行するように設定しないでください。それは非常に無駄です。

于 2012-06-25T19:29:06.880 に答える