在我的嵌入式Jetty服务器应用程序中,我想关闭一些流,执行器等,然后在linux中被kill -9命令杀死。我该如何处理?
我发现当我的jetty服务器运行并发出kill -9命令时,“Killed”字符串会在日志中打印并关闭应用程序。
我已经添加了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());
.....
}
使用kill -9
将始终导致JVM的严格终止。
Jetty无法解决这个问题。
请考虑在您的网络服务器上使用一个命令(显然是密码保护),该命令只会发出Server.stop()
。
或者使用JMX并调用Server的stop()
方法。 (这可以通过JMX控制台/ JMX浏览器/甚至是JMX命令行完成)
你只能用KILLSIG 15
这样的Runtime.addShutdownHook()来听Runtime.getRuntime().addShutdownHook(new Thread());
(kill -15)
抱歉,这是不可能的。 SIGKILL
(9)和SIGSTOP
(Linux上19个,Solaris上23个)不容忽视或被抓住。