如何知道当前是否正在关机?

时间:2011-04-27 14:08:27

标签: java tomcat shutdown

在Tomcat中,当服务器关闭时,它会尝试将它知道的类中的所有静态变量设置为null。通过触摸这些类,它们的静态初始化器运行,这可能导致我们的一些遗留类具有大量静态初始化器的无限循环。

是否有一种优雅的方法来检测当前是否正在关机?然后我们可以在静态初始化器的顶部检查我们是否处于关闭模式,然后忽略初始化。

我们找到的唯一可行的方法就是优雅:

    try{
       Thread hook = new Thread();
       Runtime.getRuntime().addShutdownHook( hook ); // fires "java.lang.IllegalStateException: Shutdown in progress" if currently in shutdown
       Runtime.getRuntime().removeShutdownHook( hook );
    }catch(Throwable th){
       throw new Error("Init in shutdown thread", th );
    }

2 个答案:

答案 0 :(得分:2)

您可以查看Tomcat是否使用新线程来执行关机工作,如果是,您可以遍历当前线程并查找此线程。

接下来,设置ServletContextListener,以便在contextInitialized和contextDestroyed中打开和关闭标志,您的类将检查该标志。

答案 1 :(得分:2)

您是否可以控制webapp配置?如果是这样,您可以通过设置

禁用清除静态引用
clearReferencesStatic=false
/META-INF/context.xml

中所述的{{1}}中的

否则,我同意在ServletContextListener中设置一个标志可能是你最好的选择。