天天看点

QUARTZ任务不写入数据库

在使用quartz遇到了很诡异的bug,通过google及百度都没有找到解决方案,最后通过搭建quartz源码环境,发现问题所在。

最近接手一个系统的升级开发,系统中使用了quartz任务调度,在大部分的需求开发完毕后,对之前开发的部分功能模块进行测试及优化,当优化任务调度并进行测试,问题出现了,每当我添加定时任务时,任务添加成功且在到达定时时间后,任务会被执行,但是任务切没有写入数据库!!!

检查代码后,发现系统中定义了两套quartz任务调度,一种是基于内存的任务调度,另一种是据于数据库的任务任务调用,检测代码和数据源配置后,没有发现任何问题,最后找来了源码并在开发环境进行调试。调试过程中发现当SchedulerRepository初始化时,会使用一个hashMap来存放已初始化的schedualer,使用的key为instanceid,数据库方式的instanceid为属性文件里配置org.quartz.scheduler.instanceName,而内存方式的instanceid为默认的DefaultQuartzScheduler,问题就出现在这里,如果系统中同时存在着两种任务存储方式且属性文件中配置org.quartz.scheduler.instanceName=DefaultQuartzScheduler时,任务永远不会被写入到数据库,因为数据库的schedualer已被内存的schedualer覆盖。

继续阅读