NullPointerException с кварцем и пружиной
Я использую интеграцию 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 ответа
Если вы посмотрите на SchedulerFactoryBean, у него есть свойство с именем waitForJobsToCompleteOnShutdown
, Когда Spring ApplicationContext получает запрос на отключение, он сообщает Quartz Scheduler о завершении работы, условно говоря ему дождаться завершения всех заданий перед завершением работы.
Но Spring может обработать запрос на отключение (и сообщить Quartz) о завершении работы только в том случае, если он получит уведомление об удалении контекста Tomcat. Как вы используете Spring в Tomcat? У вас есть ServletContextListener
зарегистрирован, чтобы позвонить applicationContext.destroy()
?
Фактический NPE, вероятно, вызван тем, что Tomcat установил все static
ссылки внутри classLoader, в который запускается ваше приложение null
на выключении. Это позволяет предотвратить утечки памяти во время перезапуска / перезапуска Tomcat. Но если у вас есть потоки, которые живут в контейнере Tomcat, которые все еще работают (потому что они не были должным образом отключены, такие как ваши потоки Quartz), то вы увидите ошибки, когда код в этом потоке (такой как код в вашем Кварцевая нить, которая пытается получить доступ к своему логгеру - который, вероятно, сохраняется как static
) пытается получить доступ к любым статическим ссылкам, которые были аннулированы.
У вас есть копия журнала регистрации общего пользования, упакованная внутри вашей WAR? В этом случае может возникнуть странное взаимодействие между копией, которая входит в состав Tomcat, и копией, которая находится в вашей WAR. Попробуйте удалить копию WAR и посмотрите, поможет ли это.