Java 使用石英和;春天
我使用的是SpringQuartz集成,每次我试图关闭Tomcat时,Quartz进程都无法关闭。这是堆栈跟踪:Java 使用石英和;春天,java,spring,tomcat,quartz-scheduler,apache-commons-logging,Java,Spring,Tomcat,Quartz Scheduler,Apache Commons Logging,我使用的是SpringQuartz集成,每次我试图关闭Tomcat时,Quartz进程都无法关闭。这是堆栈跟踪: Exception in thread "org.springframework.scheduling.quartz.SchedulerFactoryBean#0_QuartzSchedulerThread" java.lang.NullPointerException at org.apache.commons.logging.LogFactory.get
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)
以前有人看过吗?您的WAR中是否有一份commons日志?如果是这样的话,在Tomcat的副本和您的WAR中的副本之间可能会有一种奇怪的交互。尝试删除WAR副本,看看是否有帮助。如果查看SchedulerFactoryBean,它有一个名为
WaitForJobsToCompleteOnShutton的属性。当Spring ApplicationContext收到关闭请求时,它会通知Quartz调度程序关闭,有条件地告诉它在关闭之前等待所有作业完成
但是,如果Spring收到Tomcat上下文被释放的通知,它只能处理关闭请求(并告诉Quartz)关闭。您如何在Tomcat中使用Spring?您是否注册了一个ServletContextListener
来调用applicationContext.destroy()
实际的NPE可能是由于Tomcat在关闭时将应用程序运行的类加载器中的所有静态
引用设置为null
。它这样做是为了帮助防止在Tomcat的回收/重启过程中发生内存泄漏。但是,如果Tomcat容器中的线程仍在运行(因为它们没有正确关闭,例如Quartz线程),那么当该线程中的代码(例如Quartz线程中试图访问其记录器的代码-可能保持为静态
)时,您将看到错误尝试访问任何已为空的静态引用。这确实解决了我最初遇到的NullPointerException问题-但它被替换为ClassNotFound异常。。。所以我选了你,但是马特的答案实际上解决了剩下的问题,所以我选择了它。谢谢我在哪里可以找到这方面的文档?你可以在谷歌上搜索“tomcat上下文重载静态类加载器”之类的东西。我记得我读过很多关于它的书,当我在使用Tomcat、Spring、Hibernate和log4j的时候,我试图查找关于内存泄漏的信息,所以谷歌也这么做了。