在很多环境中,关闭应用程序时,需要做一些清理操作。问题在于,用户如果正常关闭,那么会正常清理,但是当用户非正常退出时,可能会导致没有全部清理。
比如,Tomcat 启动时,会通过调用服务的start 方法来启动一个servlet 容器。该方法又会调用其他组件的start方法。关闭的时候,也是一样,但如果突然关闭,则可能会出现意想不到的情况。幸运的是,在java 中可以通过关闭钩子优雅的解决这个问题。
Tomcat 中的关闭钩子:CatalinaShutdownHook
protected class CatalinaShutdownHook extends Thread {
@Override
public void run() {
try {
if (getServer() != null) {
Catalina.this.stop();
}
} catch (Throwable ex) {
ExceptionUtils.handleThrowable(ex);
log.error(sm.getString("catalina.shutdownHookFail"), ex);
} finally {
// If JULI is used, shut JULI down *after* the server shuts down
// so log messages aren't lost
LogManager logManager = LogManager.getLogManager();
if (logManager instanceof ClassLoaderLogManager) {
((ClassLoaderLogManager) logManager).shutdown();
}
}
}