【发布时间】:2012-04-12 20:09:35
【问题描述】:
我试图在 Tomcat 关闭时关闭线程。
具体来说,我正在尝试关闭 log4j 看门狗(用于文件更改),并且我正在尝试关闭在我的网络应用程序中使用类的执行器。
关机时,我在 Catalina.out 中看到异常。
对于 Log4J,我看到:
信息:非法访问:此 Web 应用程序实例已停止
已经。无法加载 org.apache.log4j.helpers.NullEnumeration。
最终的以下堆栈跟踪是由
引发的错误引起的 调试目的以及尝试终止线程
造成非法访问,对功能没有影响。可投掷
发生:java.lang.IllegalStateException
在 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1587)
在 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1546)
在 org.apache.log4j.Category.getAllAppenders(Category.java:413)
在 org.apache.log4j.Category.closeNestedAppenders(Category.java:226)
在 org.apache.log4j.Hierarchy.shutdown(Hierarchy.java:467)
在 org.apache.log4j.LogManager.shutdown(LogManager.java:267)
在 com.listeners.myListener$1.run(myListener.java:232)
线程“Thread-14”中的异常 java.lang.NoClassDefFoundError:
org.apache.log4j.helpers.NullEnumeration
在 org.apache.log4j.Category.getAllAppenders(Category.java:413)
在 org.apache.log4j.Category.closeNestedAppenders(Category.java:226)
在 org.apache.log4j.Hierarchy.shutdown(Hierarchy.java:467)
在 org.apache.log4j.LogManager.shutdown(LogManager.java:267)
对于执行者部分:
信息:非法访问:此 Web 应用程序实例已停止
已经。无法加载 com.my.class.SomeClass。最终
以下堆栈跟踪是由调试引发的错误引起的
目的以及尝试终止导致
的线程 非法访问,对功能没有影响。发生了 Throwable:
java.lang.IllegalStateException
在 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1587)
在 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1546)
在 线程“Thread-13”中的异常 java.lang.NoClassDefFoundError:
com.my.class.SomeClass
我正在做的是在ServletContextListener 上contextDestroyed 我添加了关闭挂钩如下:
public void contextDestroyed(ServletContextEvent arg0) {
Runtime.getRuntime().addShutdownHook(new Thread(){
@Override
public void run(){
LogManager.shutdown();
}
});
}
public void contextDestroyed(ServletContextEvent arg0) {
Runtime.getRuntime().addShutdownHook(new Thread(){
@Override
public void run(){
SomeClass.updater.shutdown();
}
});
}
我在这里做错了什么?为什么会出现异常?
更新:SomeClass.updater 是 public static ScheduledExecutorService。LogManager 是 org.apache.log4j.LogManager
更新 2:
按照BGR的回答后,我直接做
public void contextDestroyed(ServletContextEvent arg0) {
SomeClass.updater.shutdown();
}
和
public void contextDestroyed(ServletContextEvent arg0) {
LogManager.shutdown();
}
我没有从 Log4j 得到异常,但我得到了 SomeClass.updater 的以下异常,这是一个 public static ScheduledExecutorService:
信息:非法访问:此 Web 应用程序实例已停止
已经。无法加载 java.util.concurrent.ExecutorService。
最终的后续堆栈跟踪是由
引发的错误引起的 调试目的以及尝试终止线程
造成非法访问,对功能没有影响。可投掷
发生:java.lang.IllegalStateException
在 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1587)
在 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1546)
为什么?这些类是否已经被垃圾回收了?
【问题讨论】:
标签: multithreading tomcat web-applications servlets log4j