【问题标题】:Stopping a running java program gracefully优雅地停止正在运行的 java 程序
【发布时间】:2015-03-27 02:29:15
【问题描述】:

我一直在寻找一种方法让我向正在运行的 Java 程序发送命令,但大多数帖子建议实现 listener 或使用 Jetty(或其他服务器)实现包装程序.

有没有办法在不添加额外依赖的情况下做到这一点?

场景是,我有一个将无限期运行的 Java 程序,它会产生一些正在运行的线程。我希望能够运行一个脚本来停止它,当它需要被关闭时,有点像关闭脚本服务器往往有。这将允许我处理程序中的关闭过程。程序在linux环境下运行。

谢谢。

【问题讨论】:

  • 你的意思是通过编程还是仅仅从控制台
  • 您可以使用Socket 与我们沟通进程,但这假设进程正在侦听或可能将值写入进程正在监视的特定文件...
  • 这个答案可能会有所帮助:stackoverflow.com/a/2922031/2164109 只需实现一个关闭挂钩,每当您想停止进程时,只需使用 TERM 信号:kill -TERM java_proccess_id跨度>
  • 感谢关闭挂钩的链接,会调查它。
  • 从这个帖子了解 JMX:stackoverflow.com/questions/191215/… 以前有人用过吗?

标签: java linux multithreading


【解决方案1】:

实现了关闭钩子,到目前为止它看起来不错。实现代码:

final Thread mainThread = Thread.currentThread();
            Runtime.getRuntime().addShutdownHook(new Thread() {
                public void run() {
                    logger.info("Shut down detected. Setting isRunning to false.");

                    if(processors != null && !processors.isEmpty()){
                        for (Iterator<IProcessor> iterator = processors.iterator(); iterator.hasNext();) {
                            IProcessor iProcessor = (IProcessor) iterator.next();
                            iProcessor.setIsRunning(false);
                            try {
                                iProcessor.closeConnection();
                            } catch (SQLException e1) {
                                logger.error("Error closing connection",e1);
                            }
                        }
                    }
                    try {
                        mainThread.join();
                    } catch (InterruptedException e) {
                        logger.error("Error while joining mainthread to shutdown hook",e);
                    }
                }
            });

感谢您的建议。

【讨论】:

    猜你喜欢
    • 2017-02-12
    • 2011-03-12
    • 2023-03-16
    • 2019-11-10
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多