当一个JVM-ran(实际上用Scala编写,但我倾向于认为Groovy,Clojure或纯Java的解决方案几乎相同)我的控制台程序被用户按 Ctrl + C (或者通过系统关闭序列,我不知道程序是否有任何差异),如何确保应用程序的外部资源修改(数据库,文件,Web服务抽象资源)是否处于可预测的非逻辑损坏状态?
答案 0 :(得分:10)
您可以尝试实现一个关闭钩子,因为其他人指出了BUT:
在极少数情况下,虚拟机可能会中止,即停止 在没有干净地关闭的情况下跑步。这发生在虚拟时 机器在外部终止,例如使用SIGKILL信号 在Unix上或Microsoft Windows上的TerminateProcess调用。虚拟 例如,如果本机方法出错,机器也可能会中止 破坏内部数据结构或尝试访问 不存在的记忆。如果虚拟机中止则无法保证 可以判断是否会运行任何关闭挂钩。
我想,您必须在我认为的应用程序中引入事务上下文。对于非常简单的数据库,对于文件系统,您可以查看Apache Commons Transaction
答案 1 :(得分:7)
您通常会这样使用它:
Runtime.addShutdownHook(new Thread() {
public void run() {
// do your clean up here.
}
});
答案 2 :(得分:3)
您可以捕获此信号并关闭资源。大多数服务都不需要优雅地关闭,但是你写的文件通常会这样做。
只需添加一个关闭钩子就可以了。但我会根据你的情况对此进行测试。