2012-02-03 57 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

相关问题