在Linux中发出kill命令后,优雅地停止嵌入式Jetty服务器

时间:2019-04-01 14:23:21

标签: java linux jetty

在我的嵌入式Jetty服务器应用程序中,我想在被Linux中的kill -9命令杀死之前关闭一些流,执行程序等。我该如何处理?

我观察到,当我的码头服务器正在运行时,我发出kill -9命令,然后在日志中打印了“杀死”字符串,并关闭了应用程序。

我已经添加了LifeCycleListener作为服务器的连接器,以便如果服务器停止运行,我可以在应用程序关闭之前进行一些清理。但这不会在kill -9的情况下被调用

    server = new Server();
    loadConnectors(server);

    ServletContextHandler context = new ServletContextHandler(ServletContextHandler.NO_SESSIONS);
    context.setContextPath("/");

    server.setHandler(context);

    ServletHolder jerseyServlet = context.addServlet(ServletContainer.class, "/*");
    jerseyServlet.setInitOrder(0);

    // Tells the Jersey Servlet which REST service/class to load.
    jerseyServlet.setInitParameter("jersey.config.server.provider.classnames", Resources.class.getCanonicalName());

    server.setStopAtShutdown(true); 
    server.start();
    logger.debug("Reached this line");



  private void loadConnectors(Server server) {
    //----Http connection setup------------------
    ServerConnector connector = new ServerConnector(server);
    connector.setPort(9025);
    connector.addLifeCycleListener(new ConnectorListener());
            .....
    }

3 个答案:

答案 0 :(得分:0)

使用kill -9总是会严重破坏JVM。

Jetty对此无能为力。

考虑在您的网络服务器上使用一条命令(显然受密码保护),该命令只会发出Server.stop()

或者使用JMX并调用服务器的stop()方法。 (这可以通过JMX控制台/ JMX浏览器,甚至JMX命令行完成)

答案 1 :(得分:0)

您只能使用KILLSIG 15之类的Runtime.addShutdownHook()来收听Runtime.getRuntime().addShutdownHook(new Thread());(杀死-15)

答案 2 :(得分:0)

不可能,抱歉。 SIGKILL(9)和SIGSTOP(在Linux上为19,在Solaris上为23)。