Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top