NullPointerException с кварцем и пружиной - PullRequest
2 голосов
/ 18 июня 2009

Я использую интеграцию 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)

Кто-нибудь видел это раньше?

Ответы [ 2 ]

7 голосов
/ 18 июня 2009

Если вы посмотрите на SchedulerFactoryBean, у него есть свойство с именем waitForJobsToCompleteOnShutdown. Когда Spring ApplicationContext получает запрос на отключение, он сообщает Quartz Scheduler о завершении работы, условно говоря ему дождаться завершения всех заданий перед завершением работы.

Но Spring может обработать запрос на отключение (и сообщить Quartz) о завершении работы, только если он получит уведомление об удалении контекста Tomcat. Как вы используете Spring в Tomcat? У вас ServletContextListener зарегистрировано звонить applicationContext.destroy()?

Фактический NPE, вероятно, вызван тем, что Tomcat устанавливает все ссылки static в classLoader, в котором ваше приложение запускается на null при завершении работы. Это сделано для предотвращения утечек памяти во время утилизации / перезапуска Tomcat. Но если у вас есть потоки, которые живут в контейнере Tomcat, которые все еще работают (потому что они не были должным образом отключены, такие как ваши потоки Quartz), то вы увидите ошибки, когда код в этом потоке (например, код внутри Кварцевый поток, который пытается получить доступ к своему логгеру - который, вероятно, сохраняется как static), пытается получить доступ ко всем статическим ссылкам, которые были обнулены.

1 голос
/ 18 июня 2009

Есть ли у вас копия регистрации общего пользования, упакованная внутри вашей WAR? В этом случае может возникнуть странное взаимодействие между копией, которая входит в состав Tomcat, и копией, которая находится в вашей WAR. Попробуйте удалить копию WAR и посмотрите, поможет ли это.

...