2009-06-17 11 views
2

私はSpring Quartzの統合を使用しています。Tomcatをシャットダウンしようとするたびに、Quartzプロセスはシャットダウンできません。これはスタックトレースです。QuartzとSpringのNullPointerException

Exception in thread "org.springframework.scheduling.quartz.SchedulerFactoryBean#0_QuartzSchedulerThread" 
     java.lang.NullPointerException 
    at org.apache.commons.logging.LogFactory.getCachedFactory(LogFactory.java:979) 
    at org.apache.commons.logging.LogFactory.getFactory(LogFactory.java:435) 
    at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:685) 
    at org.quartz.core.QuartzSchedulerThread.getLog(QuartzSchedulerThread.java:475) 
    at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:404) 

これは誰でも以前のようですか?

答えて

7

SchedulerFactoryBeanを見ると、waitForJobsToCompleteOnShutdownという名前のプロパティがあります。 Spring ApplicationContextはシャットダウン要求を受け取ると、Quartz Schedulerにシャットダウンを指示し、シャットダウンする前にすべてのジョブが完了するまで待機するように条件付きで指示します。

しかし、Springは、Tomcatコンテキストが破棄されたことが通知された場合にのみ、シャットダウン要求を処理してシャットダウンすることができます。 Tomcatの中でSpringをどのように使っていますか? applicationContext.destroy()に電話するにはServletContextListenerが登録されていますか?

実際のNPEはおそらくTomcatがシャットダウン時にnullにアプリケーションが実行されているclassLoader内のすべてのstatic参照を設定しているためです。これは、Tomcatのリサイクル/再起動中にメモリリークを防ぐのに役立ちます。しかし、Tomcatコンテナ内で実行されているスレッドが(Quartzスレッドなどのように正しくシャットダウンされていないため)実行している場合は、そのスレッド内のコード(たとえば、Quartzスレッド内のコードなど) staticのように保持される可能性のある、ロガーへのアクセスを試みる石英スレッド)は、ゼロにされた静的参照にアクセスしようとします。

+0

これについてのドキュメントはどこにありますか? –

+0

"tomcat context reload static classloader"のようなものをgoogleに入れることができます。私はTomcat、Spring、Hibernate、log4jをコンサートで使うときにメモリリークに関する情報を調べようとするときにたくさんのことを読んでいます。 –

1

WARの中にcommons-loggingのコピーが入っていますか?その場合、Tomcatの一部として提供されるコピーとあなたのWARにあるコピーとの間に、奇妙な相互作用が存在する可能性があります。 WARコピーを削除して、それが役立つかどうか確認してください。

+0

これはNullPointerExceptionの最初の問題を修正しましたが、ClassNotFound例外に置き換えられました...私はあなたに投票しましたが、Mattの答えは実際に残りの問題を解決しました。ありがとう! – stevedbrown

関連する問題