2012-02-28 17 views
0

ウェブアプリケーションではlog4jを使用します。
私は、ログマネージャを終了するためにshutdownフックを使用していますTomcatをシャットダウンするときにLog4jでこの例外は何ですか?

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) 

答えて

1

例外の理由は、一部のクラス(たとえばNullEnumeration)が既にアンロードされているためです。

Webアプリケーションにフックを追加する適切な方法は、javax.servlet.ServletContextListenerを実装し、このコードをcontextDestroyedメソッドに追加することです。リスナーはweb.xmlに登録する必要があります。

+0

Ah!私はこのコードを ' ServletContextListener'ではなく、 'contextDestroyed'の' contextInitialized'にあります。 – Jim

+0

これで、シャットダウンフックは 'contextDestroyed'に移動しますか? – Jim

+0

特別なニーズがある場合を除き、通常はyesです。 – mindas

1

here

からこれはTomcatが失敗したWebアプリケーションを再ロードすることによって引き起こされている可能性があります。アプリはアンロードされますが、すべてのスレッドが正常にシャットダウンされません。結果として、スレッドが実行しようとすると、Tomcatがそのクラスローダーをシャットダウンし、エラーが記録されることによってスレッドが壊れてしまいます。 Tomcatのserver.xmlで宣言を見つけ、それがreloadable = "false"に設定されていることを確認してください。

関連する問題