Quartz管中窥豹之触发器状态

in Java with 0 comment

Quartz随着任务的创建,触发和销毁,触发器状态也做出改变,流转成相应的变化。我们可以通过触发器状态变化观察到定时任务的生命周期。

触发器状态

我们可以看下Quartz org.quartz.impl.jdbcjobstore.Constants常量类中定义的触发器的几种状态:

Triggers表状态 描述
WAITING 创建任务触发器默认状态
ACQUIRED 当到达触发时间时,获得状态
EXECUTING 运行中,firedTrigger表中
COMPLETE 完成状态,任务结束
BLOCKED 阻塞状态
ERROR 错误状态
PAUSED 暂停状态
PAUSED_BLOCKED 暂停阻塞状态,非并发下
DELETED 删除状态
下图是**触发器状态图**:描述调度线程QuartzSchedulerThread自动状态切换和手动状态切换(动态调用定时任务CRUD方法)的过程。

trigger_status_diagram

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,则会将触发器状态置为PAUSEDPAUSED_BLOCKED,相应地,调用resumeJob恢复任务,则触发器状态重置成WAITING状态。

这些生命周期跟线程状态很像,熟悉线程生命周期,就很容易理解。

代码参见

1、常量类定义的触发器状态值

Quartz org.quartz.impl.jdbcjobstore.Constants

jdbcjobstore.Constants

2、Quartz提供了定时任务动态改变的方法

org.quartz.core.QuartzScheduler

core.QuartzScheduler

对于用可视化界面动态进行定时任务CRUD管理可以利用这些方法,可以在这基础上再统一封装一层定时任务管理的API

对于触发器生命周期的状态流转,并没有一一的跟进验证,只是看着源码画出自己理解的状态图,难免跟实际情况有些出入。