Wir haben eine RMI-Client-Anwendung in Java geschrieben, die periodische "am Leben bleiben" Nachrichten an eine Server-Anwendung senden muss. Wir haben dies als separaten Heartbeat-Thread implementiert, der die Nachricht "Stay Alive" an den Server sendet und dann 15 Sekunden lang mit Thread.sleep() schläft.Wie kann ich garantieren, dass ein "am Leben bleiben" Herzschlag gesendet wird?
Der Faden wird mit hohen Priorität sein:
Thread heartbeatThread = new Thread(new HeartbeatRunnable(server));
heartbeatThread.setPriority(Thread.MAX_PRIORITY);
heartbeatThread.start();
Wenn jedoch das Feld, auf das der Client mit vielen CPU ausgeführt wird, finden wir, dass Herzschlag verpaßt werden, die den Server veranlasst, anzunehmen, unsere Kundenanwendung ist gestorben.
Wir haben Thread.yield() Aufrufe in meinem Hauptthread hinzugefügt, obwohl dies das Problem nicht beseitigt hat.
Gibt es irgendeine Möglichkeit zu garantieren, dass die Herzschläge rechtzeitig gesendet werden, während meine Anwendung noch läuft?
Danke für die Antwort. Wir senden bereits Herzschläge in einem separaten Thread, und der Server unterbricht uns nach 90 Sekunden ohne Herzschläge, so dass das Senden alle 15 Sekunden konservativ schien. –
Es ist in der Tat sehr konservativ. Aber wenn Sie es nicht schaffen, einen Herzschlag für 90 Sekunden zu senden, wenn Sie versuchen, einen alle 15 Sekunden zu senden, ist Ihre Box ernsthaft überlastet und Ihr Client sollte vielleicht wirklich als tot betrachtet werden. Siehe Pete's Antwort. – Bombe