任务调度(定时调度,Quartz)问题排查

大家反馈任务调度在项目中会遇到不能执行问题,以下是总结的排查项:

1. 是否使用集群?集群中只有一个节点执行任务,不会并发执行。

  • 集群判定方式是是否有多个服务同时连接一个数据库,Quartz 集群是通过数据库控制的。
  • 如果开发环境与生产环境同时连接正式库会影响生产环境服务!
  • quartz-cluster.properties 文件中配置的 org.quartz.jobStore.isClustered = true 默认是集群模式
  • qrtz_schedule_state 表中可以看到执行的机器

image.png

2. 判断任务调度的数量与给任务调度开放的线程数

  • 配置文件 quartz-cluster.properties 中 org.quartz.threadPool.threadCount = 20
  • 生产环境的可预期并发任务不要操作该值不然会出现延迟执行问题

3. 注意 Cron 表达式写法

  • 每 3 分钟怎么写,如下写法是不对的,0 0/3 才对,* */3 会在每个 3 分钟执行 60 次。会导致执行不过来而堵塞。
  • 尽量用页面生成 cron 表达式,防止手写写错。

image.png

4. 分析 quartz 的日志文件 schedule.log

  • 如下日志看出堵塞导致很多任务错过了触发事件

image.png

5. 如果后台的 Job 是乱的,不是项目组配置的,可能是数据库被别的项目连接过,或初始化导入的数据,可以做数据清理。

  • 清理语句:

清理后重启服务

delete from QRTZ_BLOB_TRIGGERS;

delete from QRTZ_CALENDARS;

delete from QRTZ_CRON_TRIGGERS;

delete from QRTZ_FIRED_TRIGGERS;

delete from QRTZ_LOCKS;

delete from QRTZ_PAUSED_TRIGGER_GRPS;

delete from QRTZ_SCHEDULER_STATE;

delete from QRTZ_SIMPLE_TRIGGERS;

delete from QRTZ_SIMPROP_TRIGGERS;

delete from QRTZ_TRIGGERS;

delete from QRTZ_JOB_DETAILS;