NullPointerException使用Quartz&弹簧
-
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关闭,有条件地告诉它在关闭之前等待所有作业完成。
但是,如果通知Tomcat上下文被处理,Spring只能处理关闭请求(并告诉Quartz)关闭。你是如何在Tomcat中使用Spring的?您是否注册了 ServletContextListener
来调用 applicationContext.destroy()
?
实际的NPE可能是由Tomcat在关闭时将应用程序运行的classLoader中的所有 static
引用设置为 null
引起的。这样做有助于防止在Tomcat的回收/重启期间发生任何内存泄漏。但是,如果您的Tomcat容器中存在仍在运行的线程(因为它们没有正确关闭,例如您的Quartz线程),那么当该线程中的代码(例如您的代码中的代码)时,您将看到错误尝试访问它的记录器的Quartz线程 - 可能保存为 static
)尝试访问已被清空的任何静态引用。
其他提示
您是否在WAR中打包了commons-logging的副本?如果是这样,作为Tomcat的一部分的副本与WAR中的副本之间可能存在奇怪的交互。尝试删除WAR副本,看看是否有帮助。
不隶属于 StackOverflow