【问题标题】:Stop jvm from commandline for gracefull shutdown从命令行停止 jvm 以正常关闭
【发布时间】:2016-03-28 19:58:08
【问题描述】:

我正在为Stilts stomp server 做一些 Poc。需要防止服务器 jvm 终止并通过另一个 jvm 来完成。这是一个代码sn-p

 public static void main(String[] args) {
    try {
        log.debug("Starting server...");
        StompServer<MockStompProvider> server = new StompServer<MockStompProvider>();
        server.setStompProvider( new MockStompProvider() );
        server.addConnector( new InsecureConnector() );
        server.start();
        while (true) {
            Thread.sleep(200000);
        }
    } catch (Exception ex) {
        log.error("Exception ", ex);
    }
}

有两个要求。

  1. 有没有其他方法可以在不使用while循环的情况下阻止上述jvm终止。
  2. 我想使用java -jar server.jar -- stop 之类的命令停止jvm,例如jetty 之类的服务器。码头使用端口并侦听停止请求的信号。有什么简单的方法吗。

第二个选项可以是使用 AnchorFile,在启动 jvm 时创建文件并监视文件是否存在,然后使用 stop jvm 删除该文件。

【问题讨论】:

    标签: java jvm shutdown-hook


    【解决方案1】:

    你可以用 ServerSocket 做到这一点

    static final int PORT = Integer.getInteger("port", 65432);
    public static void main(String[] args) {
        if (args.length > 0) {
            new Socket("localhost", PORT);
            return;
        }
    
        try {
            log.debug("Starting server...");
            StompServer<MockStompProvider> server = new StompServer<MockStompProvider>();
            server.setStompProvider( new MockStompProvider() );
            server.addConnector( new InsecureConnector() );
            server.start();
            new ServerSocket(PORT).accept();
    
        } catch (Exception ex) {
            log.error("Exception ", ex);
        }
    }
    

    【讨论】:

    • @vels4j 你可以改进错误处理。例如检测到该服务已经在运行,如果您在没有运行服务的情况下停止,则给出合理的错误。注意:如果您从任何机器连接,这将停止(您可以检查源 IP)
    猜你喜欢
    • 2011-03-25
    • 1970-01-01
    • 2017-06-22
    • 2022-12-20
    • 2016-12-25
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    相关资源
    最近更新 更多