我想在關閉Tomcat時關閉線程。
具體而言,我試圖關閉log4j看門狗(for filechanges),我也試圖關閉在我的web應用程序中使用類的執行程序。
關閉時,我在Catalina.out中看到異常。
對於Log4J的我看到:當tomcat關閉時關閉線程的正確方法是什麼?
INFO: Illegal access: this web application instance has been stopped
already. Could not load org.apache.log4j.helpers.NullEnumeration.
The eventual following stack trace is caused by an error thrown for
debugging purposes as well as to attempt to terminate the thread which
caused the illegal access, and has no functional impact. Throwable
occurred: java.lang.IllegalStateException
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1587)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1546)
at org.apache.log4j.Category.getAllAppenders(Category.java:413)
at org.apache.log4j.Category.closeNestedAppenders(Category.java:226)
at org.apache.log4j.Hierarchy.shutdown(Hierarchy.java:467)
at org.apache.log4j.LogManager.shutdown(LogManager.java:267)
at com.listeners.myListener$1.run(myListener.java:232)
Exception in thread "Thread-14" java.lang.NoClassDefFoundError:
org.apache.log4j.helpers.NullEnumeration
at org.apache.log4j.Category.getAllAppenders(Category.java:413)
at org.apache.log4j.Category.closeNestedAppenders(Category.java:226)
at org.apache.log4j.Hierarchy.shutdown(Hierarchy.java:467)
at org.apache.log4j.LogManager.shutdown(LogManager.java:267)
而對於執行的部分:
INFO: Illegal access: this web application instance has been stopped
already. Could not load com.my.class.SomeClass. The eventual
following stack trace is caused by an error thrown for debugging
purposes as well as to attempt to terminate the thread which caused
the illegal access, and has no functional impact. Throwable occurred:
java.lang.IllegalStateException
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1587)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1546)
at Exception in thread "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();
}
});
}
我在這裏做錯了什麼?爲什麼我會遇到異常?
UPDATE:
SomeClass.updater
是public static ScheduledExecutorService
。
LogManager
是org.apache.log4j.LogManager
UPDATE2:
後從BGR回答以下我直接做
public void contextDestroyed(ServletContextEvent arg0) {
SomeClass.updater.shutdown();
}
和
public void contextDestroyed(ServletContextEvent arg0) {
LogManager.shutdown();
}
我沒有得到Log4j的例外,但我得到SomeClass.updater
這是一個public static ScheduledExecutorService
的以下例外:
INFO: Illegal access: this web application instance has been stopped
already. Could not load java.util.concurrent.ExecutorService. The
eventual following stack trace is caused by an error thrown for
debugging purposes as well as to attempt to terminate the thread which
caused the illegal access, and has no functional impact. Throwable
occurred: java.lang.IllegalStateException
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1587)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1546)
爲什麼?這些課程已經被垃圾收集了嗎?
我認爲使用關閉掛鉤,以便我確信他們在JVM關閉時被調用 – Jim 2012-03-29 08:56:48
相信您的容器:-)。無論如何,請儘早註冊。我會去找servlet的init()方法。 – 2012-03-29 09:09:47
你能看到更新嗎? – Jim 2012-03-29 09:19:03