Что это за исключение в Log4j при закрытии tomcat? - PullRequest
0 голосов
/ 28 февраля 2012

В веб-приложении я использую log4j.
Я использовал хук shutdown для завершения работы менеджера журнала:

Runtime.getRuntime().addShutdownHook(new Thread(){
            @Override
            public void run(){
                LogManager.shutdown();              
            }
        });

Когда tomcat завершает работу, я вижу следующее исключение в catalina.out
Что это значит?В чем проблема и как я могу это исправить?

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.MyLog4jStarter$1.run(Log4JStarterListener.java:133) Exception in thread "Thread-11" 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)
        at de.siemens.icn.hipath.dls.listeners.Log4JInitListener$1.run(Log4JInitListener.java:42)
Caused by: java.lang.ClassNotFoundException:
org.apache.log4j.helpers.NullEnumeration
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1701)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1546)

Ответы [ 2 ]

1 голос
/ 28 февраля 2012

из здесь

Возможно, это связано с неудачной перезагрузкой веб-приложения Tomcat.Приложение выгружено, но все потоки не закрываются должным образом.В результате, когда потоки пытаются запускаться, они сталкиваются с тем фактом, что Tomcat выключил загрузчик классов, и регистрируется ошибка.Лучшее решение - отключить автоматическую перезагрузку веб-приложения для приложения: в Tomcat в server.xml найдите объявление и убедитесь, что оно установлено на: reloadable = "false"

1 голос
/ 28 февраля 2012

Причиной исключения является то, что некоторые классы (например, NullEnumeration) уже выгружены.

Правильный способ добавления ловушки в веб-приложение заключается в реализации javax.servlet.ServletContextListener и добавлении этого кода в contextDestroyed метод.Вам также нужно будет зарегистрировать слушателя в web.xml.

...