Quartz执行逻辑(七)任务的暂停和恢复
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执行逻辑(七)任务的暂停和恢复相关推荐
- Quartz执行逻辑(三)QRTZ_FIRED_TRIGGERS表的作用
1.介绍 在Quartz执行逻辑(一)中介绍到的操作基本都是对QRTZ_TRIGGERS表进行的,该表存的是job对应的触发器的记录.本篇介绍一下QRTZ_FIRED_TRIGGERS表在Quartz ...
- quartz暂停及恢复任务解决恢复时一咕噜把未执行的全补回来的问题
网上文章都说了 pauseTrigger resumeTrigger神马的暂停恢复任务 但是这样设了之后,在恢复的时候会把暂停期间没执行的任务又TM给补上了,很多人便说了,这TM不是我想要的啊! 你想 ...
- SpringBoot集成Quartz实现定时任务的动态创建、启动、暂停、恢复、删除。
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:毅大师 blog.csdn.net/qq_39648 ...
- SpringBoot整合Quartz执行持久化定时任务
使用: 个人博客项目,定时刷新帖子排名用到了定时任务,在这里记录下来SpringBoot整合Quartz的基本使用,记录的同时也希望能帮助到大家. 1.什么是Quartz 官方介绍: Quartz是一 ...
- spring框架使用Quartz执行定时任务实例详解
版权声明:本文为博主原创文章,如需转载,请标明出处. https://blog.csdn.net/alan_liuyue/article/details/80382324 Quartz简介 1.Qua ...
- java动态执行逻辑_动态执行代码逻辑
动态执行逻辑的方法据我所知有一下两种方式 QLExpress Groovy QLExpress QLExpress是阿里开源的动态脚本执行的项目. 由阿里的电商业务规则.表达式(布尔组合).特殊数学公 ...
- SAP 电商云 Spartacus UI 点了 Shipping Method 之后的执行逻辑
shipping method 两个备选项,通过类型为 radio 的 input 控件实现: 值发生 change 之后,触发 changeMode 方法的执行: changeMode 会把执行逻辑 ...
- 如何debug 右键菜单执行逻辑 - Test BSP Application page implementation
Created by Jerry Wang, last modified on Aug 11, 2014 需要在SE80里debug 在右键菜单里选择了Test之后的执行逻辑. 直接在command ...
- 【Flink】Flink SQL 架构 以及 执行逻辑
1.概述 本博客是视频:P46 No.45 - 第二章 - Flink SQL架构及执行逻辑 的学习笔记. 假设有一行SQL insert into rst select stu.name,stu.a ...
最新文章
- win7x64注册表显卡渲染速度_Geek3D GpuTest GUI(显卡测试软件)下载-Geek3D GpuTest GUI(显卡测试软件)免费版下载v0.7.0...
- Innodb Buffer Pool的三种Page和链表
- volatile和synchronized的区别
- SQL Server 2005 在建立与服务器的连接时出错,错误26收藏
- android studio socket 失败,Android应用开发Android Studio建立Socket连接失败解决方法
- win10资源管理器怎么打开_让你效率倍增的电脑神器,最强资源管理器增强工具「QTTabBar」...
- JavaScript学习(八十六)—运算符知识点总结
- Thrift原理与使用实例
- 双目测距(四)--罗德里格斯变换
- Android 小红点 未读消息功能 BadgeHelper
- 重构实例-消息发送-原始代码及准备-1
- android 系统隐藏和显示虚拟按键的几种方法
- xv6 6.S081 Lab1: util
- iOS 使用 Fastlane 打包上传 App 到蒲公英
- android OTG (USB读写,U盘读写)最全使用相关总结
- 写论文之mathpix snipping tool识别图片中的公式并通过MathType粘贴到word
- Rockland检测开发丨Rockland 免疫分析开发方案
- 基于java的养老院管理系统
- android实现计算器功能吗,简单实现Android计算器功能
- JS打印一维条形码,Layui打印一维条形码。