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