2009-07-31 117 views
6

事件是否有一個Java程序,當操作系統即將進入睡眠狀態,或做不到這一點,至少檢測喚醒檢測的方法嗎?檢測OS睡眠和喚醒在Java中

實際的問題是,在一個特定的應用程序的一些MySQL數據庫的操作在後臺運行。在Windows機器上測試時,這些數據庫事務在睡眠/喚醒週期後會中斷,從而導致程序中出現大量錯誤情況。這些錯誤通常是這個樣子:

java.net.SocketException 
MESSAGE: Software caused connection abort: recv failed

如果我們能以一個「會睡不久」事件作出反應,我們可以嘗試暫停後臺操作搶佔問題。理想情況下,如果我們可以對「剛剛醒來」事件作出反應,我們至少可以抑制錯誤消息。

回答

7

您可以通過當前的系統時間週期比較以前的系統時間檢測喚醒。

編輯:這裏的,看起來像它會幫你偵測當機器進入睡眠,例如: http://www.codeguru.com/cpp/w-p/system/messagehandling/article.php/c6907

+0

遺憾的是,沒有JNI就無法完成,但鏈接似乎是一個好的開始。 – 2009-08-01 00:32:26

+0

是的,JNI可能是一個開發和調試的痛苦。我們發現關鍵是要儘可能在Java中保留儘可能多的邏輯,並且只需使用JNI作爲橋接器就可以對C API進行低級調用。 – rob 2009-08-03 20:21:09

2

我知道這不正是你要找的是什麼,但也許正確的答案是嘗試編寫代碼時假設你的套接字不一定會保持不變。連接可能會崩潰的原因很多,例如因爲數據庫因維護而關閉,或者因爲有人通過以太網電纜跳閘。如果有人在您的應用運行時拔出網線,我認爲您會遇到類似的錯誤問題,這些並非前所未有的情況,所以或許這是一種更好的方法,可以優雅地嘗試和處理這些情況。

2

你可以只JNI或JNA捕獲來自OS的睡眠/喚醒事件。

Windows Power Events (MSDN),你就必須創建一個窗口處理函數和一個空的窗口接收WM_POWERBROADCAST事件。然後,此窗口過程可以在您的Java代碼中調用一個事件函數來將消息向上冒泡。