Quartz随着任务的创建,触发和销毁,触发器状态也做出改变,流转成相应的变化。我们可以通过触发器状态变化观察到定时任务的生命周期。
触发器状态
我们可以看下Quartz org.quartz.impl.jdbcjobstore.Constants
常量类中定义的触发器的几种状态:
Triggers表状态 | 描述 |
WAITING | 创建任务触发器默认状态 |
ACQUIRED | 当到达触发时间时,获得状态 |
EXECUTING | 运行中,firedTrigger表中 |
COMPLETE | 完成状态,任务结束 |
BLOCKED | 阻塞状态 |
ERROR | 错误状态 |
PAUSED | 暂停状态 |
PAUSED_BLOCKED | 暂停阻塞状态,非并发下 |
DELETED | 删除状态 |
下图是触发器状态图:描述调度线程QuartzSchedulerThread自动状态切换和手动状态切换(动态调用定时任务CRUD方法)的过程。
1、在创建JobDetail和Trigger并schedueJob初始化调度后默认状态为等待WAITING
状态
2、在调度线程QuartzSchedulerThread 获取下次触发队列acquireNextTriggers时更新为已获得ACQUIRED
状态
3、 JobStoreSupport.triggerFired的时候会根据是否取得绑定的Job判断,如果无法取得直接进入错误ERROR
状态,否则根据Job是否运行并发,Job体现为自定义Job实现类是否加类注解@DisallowConcurrentExecution
。如果允许并发,则判断下次触发时间NextFireTime,如果为空,则意味着任务生命周期已经结束,状态标记为完成COMPLETE
状态,如果下次触发时间NextFireTime不为空,则回到WAITING状态,等待下一次任务触发时间的到来;如果Job不允许并发,也会根据下次触发时间NextFireTime判断,如果下次触发时间NextFireTime不为空,不为空,则进入阻塞BLOCKED
状态,同时也会更新绑定相同Job实例的其他触发器的状态
4、对于动态任务管理,如暂定任务pauseJob,则会将触发器状态置为PAUSED
或PAUSED_BLOCKED
,相应地,调用resumeJob恢复任务,则触发器状态重置成WAITING状态。
这些生命周期跟线程状态很像,熟悉线程生命周期,就很容易理解。
代码参见
1、常量类定义的触发器状态值
Quartz org.quartz.impl.jdbcjobstore.Constants
2、Quartz提供了定时任务动态改变的方法
org.quartz.core.QuartzScheduler
对于用可视化界面动态进行定时任务CRUD管理可以利用这些方法,可以在这基础上再统一封装一层定时任务管理的API
对于触发器生命周期的状态流转,并没有一一的跟进验证,只是看着源码画出自己理解的状态图,难免跟实际情况有些出入。
发表评论