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