Quartz持久化到数据库后,一到执行时间,任务状态就变为ERROR的一系列解决过程
Quartz项目上线后,项目应用和数据库(MYSQL)在同一台服务器上,然后经常是一个任务正常执行完之后,任务状态变为了ERROR,网上找了很多
1.有的说quartz版本2.1.7有问题,换版本就好了,但是我的工程不是2.1.7 版本,然后我把2.2.1-2.3.0都试了,一样的错
2.很奇怪我项目几乎每次跑都会报这个错,但是网上只有一个人提到过类似问题
转到本地跑正常,于是将应用服务器和数据库服务器分开,还是直接报错,
突然灵光一闪,看了下服务器时间,比北京时间快了2分多钟,将服务器时间调为北京时间,再跑,问题解决!
具体原因不明。。。
整理一下思路,也对这个问题做一个记录。以后找到原因再来更新。
============================================================================================================
分割线
============================================================================================================
今天问题又出现了,网上查不到什么资料,经过一个下午的排查,直接说结论:
原因是我之前有个工程也是用了这11张QUARTZ表,我还自作聪明的将quartz.properties里的属性
org.quartz.scheduler.instanceName: 分别设置成了两个不同的名字,然而并没有什么卵用。
根据tomcat日志可以看出其实之前的工程A将所有的QUARTZ里的job都调度了,但是因为A工程不存在B工程的代码,显然,会报错。
解决办法也显而易见,要不就放到一个工程里,要不就使用不同的库或不同的QUARTZ表。
============================================================================================================
分割线
============================================================================================================
问题再次出现,发现将所有相关的项目从tomcat移除【Undeploy】,即,确认没有项目在跑后,数据库里的Quartz相关的表的状态还是会变(上次执行执行,下次执行时间,状态变为ERROR)
解决过程:1.将所有部署过项目的tomcat关掉重启,数据库里的Quartz相关的表的状态就不变了
2.因为其他工作,重新打包的时候,将web.xml里的一段注释掉之后,发现居然QUARTZ还能正常跑(生产机在跑,测试机和本地都是正常没跑)
web.xml
<!-- <servlet> <servlet-name>quartz-init</servlet-name> <servlet-class>com.xxx.xxx.quartz.fitter.QuartzInit</servlet-class> <load-on-startup>3</load-on-startup> </servlet> -->
解释一下,应该都能知道这一段意思是项目启动时调这个类,我在里面就一句话,启动quart的调度器,从而实现启动项目就启动quartz。
按这个项目的开发经验说,不加这句,QUART就不会自动启动,但是这次意外打包,注释掉这句后,居然QUARTZ还正常在跑,真的是特别正常,所有JOB都没有再报错了,而且确认了是在该服务器跑的定时器(该服务器有日志)
目前原因还未知,做个记录,因为QUARTZ的一直以来的神经病事件,再网上寻求答案无果后写下此文,也为其他人做一个参考
浙公网安备 33010602011771号