公司业务中有定时需求选中了quartz这个定时框架,在使用中遇见了很多的问题
- 最初始遇见了java.lang.NoSuchMethodException和java.lang.classNotFoundException这个两个错误,一看就知道是没有找打方法和类的错误信息,但是我所有定时器里面的方法都是public所以不可能是方法作用域引起的问题,然后经过了解知道quartz是一个集群定时框架(公司业务太忙没有时间详细了解)在你启动项目的时候会把你的信息储存到数据库里面,然后在执行任务的时候会随机选择一个节点去执行,这就找到问题所在了(我们的项目好多都是用的一个数据库然后在启动的时候都会注册到quartz里面)QRTZ_SCHEDULER_STATE 在这个表里面就能看见,有多少个实例被注册进去了,然后在执行任务的时候随机找到一个节点去执行,在那个节点里面没有这个方法和这个类,就产生了这个错误。然后我就开始研究quartz单机执行,修改配置文件
Properties prop = new Properties();
// 集群模式修改为false
prop.put("org.quartz.jobStore.isClustered", "false");
但是并不好用,而且QRTZ_SCHEDULER_STATE这个表里面已经不存在实例了。
问题依旧出现,在一个项目创建定时任务,其他项目执行的问题。
也不知道有没有大佬能看见,解决我的疑惑,现在依然没有解决。
就只能把quartz需要的十一个表复制出去,加一个前缀
比如:a_QRTZ_SCHEDULER_STATE
加一个a_
继续修改配置文件,修改表前缀
prop.put("org.quartz.jobStore.tablePrefix", "a_QRTZ_");
以后所有数据就都会往带有这个前缀的表里增删改查
就临时解决了这个问题。