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

标签 java tomcat shutdown

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

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

我们发现唯一可行的方法一点也不优雅:

    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 中打开和关闭标志,您的类检查该标志。

关于java - 如何知道当前是否正在进行关机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5805449/

相关文章:

java - 支持 HATEOAS 的自定义 Spring Data Rest Controller

tomcat - 我可以为 Spring Boot 的嵌入式 tomcat 启用 tomcat 管理器应用程序吗?

tomcat - IntelliJ 和 Tomcat ....更改的文件不会被 Tomcat 自动识别

java - 如何触发 java 关闭 Hook 以保持运行进程?

c++ - 如何在不调用 "system()"的情况下使用 C++ 或 Qt 关闭 Linux?

使用 Netty 的 Java 客户端点对多点

java如何制作带有垂直文本的JLabel?

java - 来自 thymeleaf 的日期始终发送为空

java - 当我在 tomcat 的 web.xml 中的过滤器之前配置一个 servlet 时会发生什么?

java - 为什么我们需要为tomcat运行shutdown.bat