Quartz 任务强制删除

一、扯淡

公司调度平台使用 Quartz 框架实现,Job 信息持久化到 Oracle 数据库中;坑爹队友在开发环境开发了一个 Job,结果后期需求变更,又将此 Job 实现类移除,但移除代码前未删除相关的数据信息,导致数据库中残留相关 trigger、JobDetails 等信息,最终项目启动初始化 scheduler 失败,整个调度平台不可用……

二、强删 Job

1、排查报错原因 :

1
DefinitionInitializer: Quartz Scheduler failed to initialize: org.quartz.SchedulerConfigException: Failure occured during job recovery. [See nested exception: org.quartz.JobPersistenceException: Couldn't store trigger: com.xxxxx.xxxx.task.ContAutoCancelToStatuJob [See nested exception: java.lang.ClassNotFoundException: com.xxxxx.xxxx.task.ContAutoCancelToStatuJob]]  

从日志中可以看出,某个 trigger 有问题,原因是其引用的 Job 实现类已经被删除

2、查出所有 Quartz 的表 :

1
SELECT * FROM user_tab_comments T1 WHERE T1.table_name LIKE 'QRTZ_%'  ;

所有 Quartz 表如下 :

hexo_delete_quartzjob_alltable

3、删掉 trigger

查询所有 triger 相关的表,发现在 QRTZ_CRON_TRIGGERS 中有导致报错的 trigger(我们任务触发用的 cron 表达式方式),所以果断删除 :

1
DELETE  FROM QRTZ_CRON_TRIGGERS T1 WHERE T1.JOB_CLASS_NAME='com.xxxxx.xxxx.task.ContAutoCancelToStatuJob';

4、启动测试

再次启动发现报错信息已经没有了,但是悲剧的发现无法创建任何任务,其报错信息大致的意思还是 class no found,后排查发现 Job 相关的表中仍有残留的记录,所以同样需要清除

1
DELETE  FROM QRTZ_JOB_DETAILS T1 WHERE T1.JOB_CLASS_NAME='com.xxxxx.xxxx.task.ContAutoCancelToStatuJob';

删除时发现,此条记录无法删除,报错是有级联信息,但是我翻了半天没找到,最终无奈根据报错信息,先找到其约束,将其置为级联删除,再删主记录,最后把约束级联删除改回 no action 即可

5、修改约束&&级联删除

删除 QRTZ_JOB_DETAILS 时报错如下:

hexo_delete_quartzjob_deleteerror

查询该约束(图后截的,约束编号已变):

1
SELECT * FROM user_constraints T1 WHERE T1.constraint_name ='SYS_C0080707';

发现其约束 QRTZ_TRIGGERS 修改其约束级联删除关系:

hexo_delete_quartzjob_modify

此时再次删除即可,到此强删完成。


Quartz 任务强制删除
https://mritd.com/2016/06/07/force-delete-quartz-job/
作者
Kovacs
发布于
2016年6月7日
许可协议