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