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