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

在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中设置一个标志可能是你最好的选择。

链接地址: http://www.djcxy.com/p/52257.html

上一篇: How to know whether a shutdown is currently in progress?

下一篇: Time Aggregations in MongoDB