任务调度(定时调度,Quartz)问题排查
大家反馈任务调度在项目中会遇到不能执行问题,以下是总结的排查项:
1. 是否使用集群?集群中只有一个节点执行任务,不会并发执行。
- 集群判定方式是是否有多个服务同时连接一个数据库,Quartz 集群是通过数据库控制的。
- 如果开发环境与生产环境同时连接正式库会影响生产环境服务!
- quartz-cluster.properties 文件中配置的 org.quartz.jobStore.isClustered = true 默认是集群模式
- qrtz_schedule_state 表中可以看到执行的机器
2. 判断任务调度的数量与给任务调度开放的线程数
- 配置文件 quartz-cluster.properties 中 org.quartz.threadPool.threadCount = 20
- 生产环境的可预期并发任务不要操作该值不然会出现延迟执行问题
3. 注意 Cron 表达式写法
- 每 3 分钟怎么写,如下写法是不对的,0 0/3 才对,* */3 会在每个 3 分钟执行 60 次。会导致执行不过来而堵塞。
- 尽量用页面生成 cron 表达式,防止手写写错。
4. 分析 quartz 的日志文件 schedule.log
- 如下日志看出堵塞导致很多任务错过了触发事件
- 如何分析是哪个任务导致的堵塞问题,通过数据库锁及线程堆栈分析。http://119.96.220.140:9099/article/1567822034934
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;
6. 关注下这个参数是否是打开的值为 on. 如果是 off 是不会启动定时调度的.
7. 查看 MES 日志, 看是否后台有报错. MES 业务报错说明定时调度执行了, 但是业务出错, 表象是没效果.