QUARTZ任务不写入数据库
2015-09-21 17:09
1051 查看
在使用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覆盖。
最近接手一个系统的升级开发,系统中使用了quartz任务调度,在大部分的需求开发完毕后,对之前开发的部分功能模块进行测试及优化,当优化任务调度并进行测试,问题出现了,每当我添加定时任务时,任务添加成功且在到达定时时间后,任务会被执行,但是任务切没有写入数据库!!!
检查代码后,发现系统中定义了两套quartz任务调度,一种是基于内存的任务调度,另一种是据于数据库的任务任务调用,检测代码和数据源配置后,没有发现任何问题,最后找来了源码并在开发环境进行调试。调试过程中发现当SchedulerRepository初始化时,会使用一个hashMap来存放已初始化的schedualer,使用的key为instanceid,数据库方式的instanceid为属性文件里配置org.quartz.scheduler.instanceName,而内存方式的instanceid为默认的DefaultQuartzScheduler,问题就出现在这里,如果系统中同时存在着两种任务存储方式且属性文件中配置org.quartz.scheduler.instanceName=DefaultQuartzScheduler时,任务永远不会被写入到数据库,因为数据库的schedualer已被内存的schedualer覆盖。
相关文章推荐
- Oracle Jdbc 防sql注入
- 备忘:连接数据库的写法
- Mysql免安装版安装配置及常用操作
- SQL Server数据库优化的10多种方法
- memcache CAS实现原子操作
- 数据库SQL优化大总结之 百万级数据库优化方案
- Oracle存储过程的简单示例
- mysql常用引擎
- MongoDB 的安装和使用
- sql存储过程查询栏目下面的所有子栏目
- MYSQL用户和权限操作
- 数据库设计三大范式
- [MySQL分享]--interactive_timeout和wait_timeout小结(interactive_timeout会覆盖wait_timeout)
- MongoDB 基础操作
- mysql语句:批量更新多条记录的不同值
- PostgreSQL-角色、库、模式、表
- 不同场景下MySQL的迁移方案
- oracle中的null
- plsql的安装,与plsql链接服务器的操作步骤。
- redis 的两种持久化方式及原理