在我的嵌入式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());
.....
}
答案 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)。