Quartz执行逻辑(七)任务的暂停和恢复

  • 1.简介
  • 2.暂停与恢复任务
    • 2.1暂停任务
    • 2.2恢复任务

1.简介

前面在Quartz执行逻辑(一)中说到trigger的状态是WAITING的,会在目标时间被触发,所以暂停与恢复任务自然是修改了trigger的状态。

2.暂停与恢复任务

2.1暂停任务

暂停任务时通过调用Scheduler的pauseJob方法来实现这个操作。这个方法一直向下调用到了JobStoreSupport中的pauseJob方法。该方法中是对任务的trigger进行操作的,也证实了前面的猜想,只要修改trigger的状态就能实现任务的暂停与恢复。主要代码如下:

List<OperableTrigger> triggers = getTriggersForJob(conn, jobKey);for (OperableTrigger trigger: triggers) {pauseTrigger(conn, trigger.getKey());}

首先获取到该job的trigger再去暂停trigger。获取trigger自然是去查询QRTZ_TRIGGERS表,主要看一下pauseTrigger方法做了什么操作。主要代码如下:

String oldState = getDelegate().selectTriggerState(conn,triggerKey);if (oldState.equals(STATE_WAITING)|| oldState.equals(STATE_ACQUIRED)) {getDelegate().updateTriggerState(conn, triggerKey,STATE_PAUSED);} else if (oldState.equals(STATE_BLOCKED)) {getDelegate().updateTriggerState(conn, triggerKey,STATE_PAUSED_BLOCKED);}

和我们预想的一样,改变了触发器的状态。如果当前trigger的状态是WAITING或ACQUIRED,则更新为PAUSED。如果当前trigger的状态是BLOCKED则更新为PAUSED_BLOCKED。

2.2恢复任务

既然暂停任务是通过修改trigger的状态实现的,那么恢复任务很自然的会想到也是如此实现的,下面看一下具体的实现。同样的调用入口还是在Scheduler中,调用其resumeJob方法实现,该方法向下调用到了JobStoreSupport中的resumeJob方法,该方法的主要代码如下:

List<OperableTrigger> triggers = getTriggersForJob(conn, jobKey);for (OperableTrigger trigger: triggers) {resumeTrigger(conn, trigger.getKey());}

和暂停任务的操作如出一辙,还是先获取job的trigger,然后恢复trigger,具体看一下resumeTrigger方法:

TriggerStatus status = getDelegate().selectTriggerStatus(conn,key);if (status == null || status.getNextFireTime() == null) {return;}boolean blocked = false;if(STATE_PAUSED_BLOCKED.equals(status.getStatus())) {blocked = true;}String newState = checkBlockedState(conn, status.getJobKey(), STATE_WAITING);boolean misfired = false;if (schedulerRunning && status.getNextFireTime().before(new Date())) {misfired = updateMisfiredTrigger(conn, key,newState, true);}if(!misfired) {if(blocked) {getDelegate().updateTriggerStateFromOtherState(conn,key, newState, STATE_PAUSED_BLOCKED);} else {getDelegate().updateTriggerStateFromOtherState(conn,key, newState, STATE_PAUSED);}}

可以看到大体上的思想还是更新trigger的状态,只是要考虑nextFireTime和misfire。如果没有nextFireTime了,则没有向下继续修改trigger状态的必要了,直接return。checkBlockedstate方法中判断当前任务是否有触发了,根据QRTZ_FIRED_TRIGGERS表中的情况和当前的状态决定新的状态应该是什么:

List<FiredTriggerRecord> lst = getDelegate().selectFiredTriggerRecordsByJob(conn,jobKey.getName(), jobKey.getGroup());if (lst.size() > 0) {FiredTriggerRecord rec = lst.get(0);if (rec.isJobDisallowsConcurrentExecution()) { // OLD_TODO: worry about failed/recovering/volatile job  states?return (STATE_PAUSED.equals(currentState)) ? STATE_PAUSED_BLOCKED : STATE_BLOCKED;}}return currentState;

如果该job被触发了,同时job不允许并发执行且当前状态又是PAUSED,则新的状态任然为BLOKED,否则直接返回当前状态。调用时传入的当前状态是WAITING,所以一般该方法的返回值还是WAITING,这才符合对恢复任务的状态的预期。回到resumeTrigger方法向下,如果没有misfire且没block,则把PAUSED更新为WAITING。如果没有misfire但是BLOCK了,则把PAUSED_BLOCK更新为checkBlockedState方法的返回值。有关QRTZ_FIRED_TRIGGERS表的作用可以参考:Quartz执行逻辑(三)QRTZ_FIRED_TRIGGERS表的作用

如果nextFireTime早于当前时间则说明misfire了则要调用updateMisfireTrigger方法,该方法中调用的是doUpdateOfMisfireTrigger方法,该方法内容在:Quartz执行逻辑(六)misfire的处理中说过,故此不再赘述。

所以resumeTrigger方法在一般情况下做的操作时把trigger的状态从paused改为waiting。

Quartz执行逻辑(七)任务的暂停和恢复相关推荐

  1. Quartz执行逻辑(三)QRTZ_FIRED_TRIGGERS表的作用

    1.介绍 在Quartz执行逻辑(一)中介绍到的操作基本都是对QRTZ_TRIGGERS表进行的,该表存的是job对应的触发器的记录.本篇介绍一下QRTZ_FIRED_TRIGGERS表在Quartz ...

  2. quartz暂停及恢复任务解决恢复时一咕噜把未执行的全补回来的问题

    网上文章都说了 pauseTrigger resumeTrigger神马的暂停恢复任务 但是这样设了之后,在恢复的时候会把暂停期间没执行的任务又TM给补上了,很多人便说了,这TM不是我想要的啊! 你想 ...

  3. SpringBoot集成Quartz实现定时任务的动态创建、启动、暂停、恢复、删除。

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:毅大师 blog.csdn.net/qq_39648 ...

  4. SpringBoot整合Quartz执行持久化定时任务

    使用: 个人博客项目,定时刷新帖子排名用到了定时任务,在这里记录下来SpringBoot整合Quartz的基本使用,记录的同时也希望能帮助到大家. 1.什么是Quartz 官方介绍: Quartz是一 ...

  5. spring框架使用Quartz执行定时任务实例详解

    版权声明:本文为博主原创文章,如需转载,请标明出处. https://blog.csdn.net/alan_liuyue/article/details/80382324 Quartz简介 1.Qua ...

  6. java动态执行逻辑_动态执行代码逻辑

    动态执行逻辑的方法据我所知有一下两种方式 QLExpress Groovy QLExpress QLExpress是阿里开源的动态脚本执行的项目. 由阿里的电商业务规则.表达式(布尔组合).特殊数学公 ...

  7. SAP 电商云 Spartacus UI 点了 Shipping Method 之后的执行逻辑

    shipping method 两个备选项,通过类型为 radio 的 input 控件实现: 值发生 change 之后,触发 changeMode 方法的执行: changeMode 会把执行逻辑 ...

  8. 如何debug 右键菜单执行逻辑 - Test BSP Application page implementation

    Created by Jerry Wang, last modified on Aug 11, 2014 需要在SE80里debug 在右键菜单里选择了Test之后的执行逻辑. 直接在command ...

  9. 【Flink】Flink SQL 架构 以及 执行逻辑

    1.概述 本博客是视频:P46 No.45 - 第二章 - Flink SQL架构及执行逻辑 的学习笔记. 假设有一行SQL insert into rst select stu.name,stu.a ...

最新文章

  1. win7x64注册表显卡渲染速度_Geek3D GpuTest GUI(显卡测试软件)下载-Geek3D GpuTest GUI(显卡测试软件)免费版下载v0.7.0...
  2. Innodb Buffer Pool的三种Page和链表
  3. volatile和synchronized的区别
  4. SQL Server 2005 在建立与服务器的连接时出错,错误26收藏
  5. android studio socket 失败,Android应用开发Android Studio建立Socket连接失败解决方法
  6. win10资源管理器怎么打开_让你效率倍增的电脑神器,最强资源管理器增强工具「QTTabBar」...
  7. JavaScript学习(八十六)—运算符知识点总结
  8. Thrift原理与使用实例
  9. 双目测距(四)--罗德里格斯变换
  10. Android 小红点 未读消息功能 BadgeHelper
  11. 重构实例-消息发送-原始代码及准备-1
  12. android 系统隐藏和显示虚拟按键的几种方法
  13. xv6 6.S081 Lab1: util
  14. iOS 使用 Fastlane 打包上传 App 到蒲公英
  15. android OTG (USB读写,U盘读写)最全使用相关总结
  16. 写论文之mathpix snipping tool识别图片中的公式并通过MathType粘贴到word
  17. Rockland检测开发丨Rockland 免疫分析开发方案
  18. 基于java的养老院管理系统
  19. android实现计算器功能吗,简单实现Android计算器功能
  20. JS打印一维条形码,Layui打印一维条形码。

热门文章

  1. Qemu连接外网的配置方法
  2. 关于融云在APIcloud中的集成
  3. W801单片机学习笔记——调试器的配置与使用(适用于W801和W806)
  4. 单片机与ARM嵌入式,DSP,FPGA的联系与区别
  5. 一封台积电离职工程师的信
  6. 利用Turbo C进行平面二维图形的平移,旋转,缩放,对称
  7. HBase-拆分合并
  8. 吃!吃!吃!(python)
  9. 计算机语言中a 什么意思,"i=!a"在c语言中什么意思
  10. 1g的树莓派4b能做什么_树莓派4代B型1GB Raspberry Pi