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

Java 如何知道当前是否正在进行关机?,java,tomcat,shutdown,Java,Tomcat,Shutdown,在Tomcat中,当服务器关闭时,它会尝试将已知类中的所有静态变量设置为null。通过接触这些类,可以运行它们的静态初始值设定项,这会导致我们的一些遗留类出现无休止的循环,这些遗留类具有大量的静态初始值设定项 是否有一种优雅的方法来检测当前是否正在进行关机?然后,我们可以在静态初始化器的顶部检查是否处于关闭模式,然后忽略初始化 我们找到的唯一可行的方法不是优雅: try{ Thread hook = new Thread(); Runtime.getRunti

在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 );
    }

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


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

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

clearReferencesStatic=false
/META-INF/context.xml
中,如


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

如果没有本机,这可能是最好的选择。。。