美文网首页
Quartz 触发器状态与生命周期

Quartz 触发器状态与生命周期

作者: 饱饱想要灵感 | 来源:发表于2023-10-12 09:26 被阅读0次

    转载自 quartz管中窥豹之触发器状态 , 在此膜拜大神

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

    触发器状态

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

    Triggers表状态 描述
    WAITING 创建任务触发器的默认状态
    ACQUIRED 当到达触发时间时,置为已获得状态
    EXECUTING 运行中,此状态存在于firedTrigger表中
    COMPLETE 完成状态,任务结束
    BLOCKED 阻塞状态
    ERROR 错误状态
    PAUSED 暂停状态
    PAUSED_BLOCKED 暂停阻塞状态,非并发下
    DELETED 删除状态

    下面是触发器状态图:描述调度线程QuartzSchedulerThread自动状态切换和手动状态切换(动态调用定时任务CRUD方法)的过程。

    trigger_status_diagram.png

    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、常量类定义的触发器状态值


    jdbcjobstore.Constants.png

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


    jdbcjobstore.Constants.png

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

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

    相关文章

      网友评论

          本文标题:Quartz 触发器状态与生命周期

          本文链接:https://www.haomeiwen.com/subject/gtpwbdtx.html