2

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

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)

誰もこれを前に見たことがありますか?

4

2 に答える 2

7

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

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

実際の NPE はstatic、アプリケーションがシャットダウン時に実行される classLoader 内のすべての参照を Tomcat が設定することが原因である可能性がありますnull。これは、Tomcat のリサイクル/再起動中のメモリ リークを防ぐために行われます。ただし、Tomcat コンテナ内にまだ実行中のスレッドがある場合 (Quartz スレッドなど、適切にシャットダウンされていないため)、そのスレッド内のコード (そのロガーへのアクセスを取得しようとするクォーツ スレッド (これは として保持される可能性がありstaticます) は、無効化された静的参照にアクセスしようとします。

于 2009-06-17T20:58:35.007 に答える
1

WAR 内にパッケージ化された commons-logging のコピーがありますか? その場合、Tomcat の一部として提供されるコピーと、WAR にあるコピーとの間に奇妙な相互作用がある可能性があります。WAR コピーを削除してみて、問題が解決するかどうかを確認してください。

于 2009-06-17T20:56:17.883 に答える