2009-09-30 8 views
7

Ich habe einen Server geschrieben, der nicht blockierende E/A mit der Java NIO API ausführt. Ich sehe eine Situation, bei der gelegentlich eine Clientanwendung abrupt herunterfährt (z. B. aufgrund eines Stromausfalls) und die Verbindung auf der Serverseite offen bleibt.NIO - Ermitteln einer geschlossenen Verbindung

Ein Kollege hat das gleiche Problem und sagte, er nutzt Herzschläge über die Leitung, um diese Art von Sache zu erkennen, aber ich hoffe, es gibt einen einfacheren Weg. Ist jemand anderes auf dieses Problem gestoßen?

Einige zusätzliche Informationen: Mein aktuelles Server-Design wird einen Schlüssel abbrechen und den entsprechenden Kanal schließen, wenn es einen IOException bei einem Lese-/Schreibvorgang abfängt. Dieser Ansatz scheint in 99% der Fälle zu funktionieren. Ich habe nur eine Handvoll von Situationen gesehen, in denen die Verbindung offen zu sein scheint.

Antwort

6

Ohne App-Level Herzschläge, ist Ihre einzige Option, auf TCP Keepalive zu verlassen. Aber das Standardintervall ist sehr lang (wie 2 Stunden). Der RFC empfiehlt kein Intervall kürzer als 2 Stunden.

Sie können es kürzer machen, aber das ist eine systemweite Parameter. Auf einigen Betriebssystemen ist sogar eine Kernel-Wiederherstellung erforderlich, um dies zu ändern.

Daher wird ein Herzschlag für jedes TCP-basierte Protokoll dringend empfohlen.

+0

Danke ZZ Coder - das ist, was ich dachte (gefürchtet). Ich bin ziemlich erstaunt, dass dies kein Merkmal von TCP ist. – Adamski

+0

Ein "Ping" eher, diese Anwendungen sind nicht menschlich - Sie wissen. –

Verwandte Themen