我正在使用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副本,看看是否有帮助。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top