2012-02-03 56 views
5

當一個JVM-ran(實際上寫在Scala中,但我傾向於認爲該解決方案與Groovy,Clojure或純Java幾乎相同)時,我的控制檯程序被用戶按下終止Ctrl + C(或通過系統關閉順序,我不知道程序是否有任何區別),如何確保應用程序修改的外部資源(數據庫,文件,Web服務抽象資源)是否處於可預測的非邏輯腐敗狀態?如何在JVM控制檯應用程序中處理^ C?

回答

7

看看Runtime.addShutdownHook

您通常使用它作爲這樣:

Runtime.addShutdownHook(new Thread() { 
    public void run() { 
     // do your clean up here. 
    } 
}); 
3

您可以捕獲該信號並關閉資源。大多數服務不需要優雅地關閉,但是您寫入的文件通常都可以。

只需添加關閉掛鉤就可以了。但我會爲你的情況測試這個。

10

你可以嘗試實施關閉掛鉤爲他人指出BUT:

在極少數情況下,虛擬機可能會中止,也就是停止 運行沒有乾淨關閉。當虛擬機器在外部終止,例如Unix上的SIGKILL信號 或Microsoft Windows上的TerminateProcess調用時,會發生這種情況。如果本機方法出錯,例如, 機器可能會中斷,從而破壞內部數據結構或嘗試訪問不存在的內存。如果虛擬機中止,則不能保證 可以關於是否將運行任何關閉掛鉤。

我想,你將不得不將事務性上下文引入你的應用程序我相信。對於非常容易的數據庫,對於文件系統,您可以查看Apache Commons Transaction

+0

+1也是保護程序免受停電和系統崩潰的唯一方法。 – josefx 2012-02-03 12:35:45

相關問題