【问题标题】:How to deal with ^C in JVM console applications?如何处理 JVM 控制台应用程序中的 ^C?
【发布时间】:2012-02-03 12:03:14
【问题描述】:

当我的 JVM 运行(实际上是用 Scala 编写的,但我倾向于相信解决方案对于 Groovy、Clojure 或纯 Java 来说几乎相同)时,我的控制台程序被用户按 Ctrl+C(或者按系统关机顺序,不知道是不是程序有什么区别),如何确定应用程序的外部资源修改(数据库、文件、Web 服务抽象资源)处于可预测的非逻辑损坏状态?

【问题讨论】:

    标签: java scala console jvm reliability


    【解决方案1】:

    您可以尝试像其他人指出的那样实现关闭挂钩:

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

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

    【讨论】:

    • +1 也是保护程序免受停电和系统崩溃的唯一方法。
    【解决方案2】:

    看看Runtime.addShutdownHook

    你通常会这样使用它:

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

    【讨论】:

      【解决方案3】:

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

      您可能只需要添加一个关闭挂钩即可。但我会根据您的情况对此进行测试。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-20
        • 1970-01-01
        • 1970-01-01
        • 2017-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多