如何在JVM控制台应用程序中处理^ C?

时间:2012-02-03 12:03:15

标签: java scala console jvm reliability

当一个JVM-ran(实际上用Scala编写,但我倾向于认为Groovy,Clojure或纯Java的解决方案几乎相同)我的控制台程序被用户按 Ctrl + C (或者通过系统关闭序列,我不知道程序是否有任何差异),如何确保应用程序的外部资源修改(数据库,文件,Web服务抽象资源)是否处于可预测的非逻辑损坏状态?

3 个答案:

答案 0 :(得分:10)

您可以尝试实现一个关闭钩子,因为其他人指出了BUT:

  

在极少数情况下,虚拟机可能会中止,即停止   在没有干净地关闭的情况下跑步。这发生在虚拟时   机器在外部终止,例如使用SIGKILL信号   在Unix上或Microsoft Windows上的TerminateProcess调用。虚拟   例如,如果本机方法出错,机器也可能会中止   破坏内部数据结构或尝试访问   不存在的记忆。如果虚拟机中止则无法保证   可以判断是否会运行任何关闭挂钩。

我想,您必须在我认为的应用程序中引入事务上下文。对于非常简单的数据库,对于文件系统,您可以查看Apache Commons Transaction

答案 1 :(得分:7)

看看Runtime.addShutdownHook

您通常会这样使用它:

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

答案 2 :(得分:3)

您可以捕获此信号并关闭资源。大多数服务都不需要优雅地关闭,但是你写的文件通常会这样做。

只需添加一个关闭钩子就可以了。但我会根据你的情况对此进行测试。