过程
项目中需求统计数据,涉及大屏展示,展示的数据很复杂,所以采取了晚上把数据汇总出来存到redis缓存,供白天查询的方式。
用到了quartz定时任务,写好sql、逻辑等测试没问题,就愉快的部署到了生产。
可一段时间观察下来发现定时任务有时候执行,有时候不执行。
排查了多次也没发现问题出在哪,也没有错误日志输出,代码里明明打了日志。
索性下决心开始刨quartz的逻辑,发现有个记录错误的表,记录了一些错误信息。
看表里的错误迹象是找不到定时任务的bean,奇了怪了 ,测试明明没问题的。。。。。。
after a long time。。。。。。
无意间在服务器上执行ps -ef|grep xxx 命令时发现一个应用,名字和我这个项目非常类似,只是端口不一样。想起来是以前部署的一版测试程序。好了,我感觉定时任务不执行的案子要破了。。。
原因
quartz定时任务是读取表里的配置信息去触发执行,若是分布式,有一个服务执行了则其他服务不会重复执行。如数据库里存12点执行任务A,两个程序都读到了这条数据,都去执行任务bean,可想而知,若那版测试程序抢了先去执行,代码里并没有任务bean,所以就报错找不到bean了。然后另一个程序也不会去执行了。
不小心弄了个瘸腿的分布式。。。。。。
解决
是个非常低级的错误,服务器中启了两个应用,停掉一个就好了。