文档章节

Quartz的Misfire处理规则 错过任务执行时间的处理机制

独钓渔
 独钓渔
发布于 07/15 02:39
字数 995
阅读 31
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>

调度(scheduleJob)或恢复调度(resumeTrigger,resumeJob)后不同的misfire对应的处理规则

CronTrigger  

withMisfireHandlingInstructionDoNothing
——不触发立即执行
——等待下次Cron触发频率到达时刻开始按照Cron频率依次执行

withMisfireHandlingInstructionIgnoreMisfires
——以错过的第一个频率时间立刻开始执行
——重做错过的所有频率周期后
——当下一次触发频率发生时间大于当前时间后,再按照正常的Cron频率依次执行

withMisfireHandlingInstructionFireAndProceed
——以当前时间为触发频率立刻触发一次执行
——然后按照Cron频率依次执行



SimpleTrigger  

withMisfireHandlingInstructionFireNow
——以当前时间为触发频率立即触发执行
——执行至FinalTIme的剩余周期次数
——以调度或恢复调度的时刻为基准的周期频率,FinalTime根据剩余次数和当前时间计算得到
——调整后的FinalTime会略大于根据starttime计算的到的FinalTime值

withMisfireHandlingInstructionIgnoreMisfires
——以错过的第一个频率时间立刻开始执行
——重做错过的所有频率周期
——当下一次触发频率发生时间大于当前时间以后,按照Interval的依次执行剩下的频率
——共执行RepeatCount+1次

withMisfireHandlingInstructionNextWithExistingCount
——不触发立即执行
——等待下次触发频率周期时刻,执行至FinalTime的剩余周期次数
——以startTime为基准计算周期频率,并得到FinalTime
——即使中间出现pause,resume以后保持FinalTime时间不变


withMisfireHandlingInstructionNowWithExistingCount
——以当前时间为触发频率立即触发执行
——执行至FinalTIme的剩余周期次数
——以调度或恢复调度的时刻为基准的周期频率,FinalTime根据剩余次数和当前时间计算得到
——调整后的FinalTime会略大于根据starttime计算的到的FinalTime值

withMisfireHandlingInstructionNextWithRemainingCount
——不触发立即执行
——等待下次触发频率周期时刻,执行至FinalTime的剩余周期次数
——以startTime为基准计算周期频率,并得到FinalTime
——即使中间出现pause,resume以后保持FinalTime时间不变

withMisfireHandlingInstructionNowWithRemainingCount
——以当前时间为触发频率立即触发执行
——执行至FinalTIme的剩余周期次数
——以调度或恢复调度的时刻为基准的周期频率,FinalTime根据剩余次数和当前时间计算得到

——调整后的FinalTime会略大于根据starttime计算的到的FinalTime值

MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT
——此指令导致trigger忘记原始设置的starttime和repeat-count
——触发器的repeat-count将被设置为剩余的次数
——这样会导致后面无法获得原始设定的starttime和repeat-count值

 

 

 

问题:想要实现调度的启动和暂停以及恢复功能,但是暂停遇到问题
暂停后重新启动,会连续多次调用job中的execute方法。如果当前工作的处理时间过长必然会导致问题。

答案:

1
misfireInstruction = CronTrigger.MISFIRE_INSTRUCTION_DO_NOTHING
2
quartz.properties
#这个时间大于10000(10秒)会导致MISFIRE_INSTRUCTION_DO_NOTHING不起作用。
org.quartz.jobStore.misfireThreshold = 5000

代码:

public String add() throws IOException, SchedulerException {// 一定要紧跟Validate之后写验证结果类
String seconds = job.getCronExpression();
//String cronExp = "0/" + seconds + " * * * * ?";
String cronExp = seconds;
job.setCronExpression(cronExp);
Scheduler scheduler = schedulerFactoryBean.getScheduler();
TriggerKey triggerKey = TriggerKey.triggerKey(job.getJobName(), job.getJobGroup());


// 获取trigger,即在spring配置文件中定义的 bean id="myTrigger"
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);


// 不存在,创建一个
if (null == trigger) {
JobDetail jobDetail = JobBuilder.newJob(QuartzJobFactory.class)
.withIdentity(job.getJobName(), job.getJobGroup()).build();
jobDetail.getJobDataMap().put("scheduleJob", job);


// 表达式调度构建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression());


// 按新的cronExpression表达式构建一个新的trigger
trigger = TriggerBuilder.newTrigger().withIdentity(job.getJobName(), job.getJobGroup())
.withSchedule(scheduleBuilder.withMisfireHandlingInstructionDoNothing()).build();
System.out.println("trigger.getMisfireInstruction() = "+trigger.getMisfireInstruction());
scheduler.scheduleJob(jobDetail, trigger);
} else {
// Trigger已存在,那么更新相应的定时设置
// 表达式调度构建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression());


// 按新的cronExpression表达式重新构建trigger
trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder.withMisfireHandlingInstructionDoNothing()).build();
System.out.println("trigger.getMisfireInstruction() = "+trigger.getMisfireInstruction());
// 按新的trigger重新设置job执行
scheduler.rescheduleJob(triggerKey, trigger);
}


return SUCCESS;
}

独钓渔
粉丝 49
博文 491
码字总数 198976
作品 0
沙坪坝
系统管理员
私信 提问
加载中
请先登录后再评论。
Netty那点事(三)Channel与Pipeline

Channel是理解和使用Netty的核心。Channel的涉及内容较多,这里我使用由浅入深的介绍方法。在这篇文章中,我们主要介绍Channel部分中Pipeline实现机制。为了避免枯燥,借用一下《盗梦空间》的...

黄亿华
2013/11/24
2W
22
访问安全控制解决方案

本文是《轻量级 Java Web 框架架构设计》的系列博文。 今天想和大家简单的分享一下,在 Smart 中是如何做到访问安全控制的。也就是说,当没有登录或 Session 过期时所做的操作,会自动退回到...

黄勇
2013/11/03
3.6K
8
用vertx实现高吞吐量的站点计数器

工具:vertx,redis,mongodb,log4j 源代码地址:https://github.com/jianglibo/visitrank 先看架构图: 如果你不熟悉vertx,请先google一下。我这里将vertx当作一个容器,上面所有的圆圈要...

jianglibo
2014/04/03
4.3K
3
beego API开发以及自动化文档

beego API开发以及自动化文档 beego1.3版本已经在上个星期发布了,但是还是有很多人不了解如何来进行开发,也是在一步一步的测试中开发,期间QQ群里面很多人都问我如何开发,我的业余时间实在...

astaxie
2014/06/25
2.7W
22
Nutch学习笔记4-Nutch 1.7 的 索引篇 ElasticSearch

上一篇讲解了爬取和分析的流程,很重要的收获就是: 解析过程中,会根据页面的ContentType获得一系列的注册解析器, 依次调用每个解析器,当其中一个解析成功后就返回,否则继续执行下一个解...

强子哥哥
2014/06/26
712
0

没有更多内容

加载失败,请刷新页面

加载更多

神奇“耳机”能刺激大脑神经,改善记忆力,外语学习能力提升13%

     大数据文摘出品   来源:inverse   编译:zeroInfinity   我们知道一句俗语叫做老狗难学新把戏。的确,多数成年人都会有这种感觉,学习新技能的能力远不如儿童,而这在语言学...

osc_l8yszczz
30分钟前
9
0
一周AI最火论文 | 使用图形界面就能搭建的强化学习模型

     大数据文摘出品   作者:Christopher Dossman   编译:李雷、Luna、云舟   呜啦啦啦啦啦啦啦大家好,本周的AI Scholar Weekly栏目又和大家见面啦!   AI ScholarWeekly是A...

osc_7slii3nj
32分钟前
0
0
女租户被偷拍4000条卧室视频,AI能发现“隐藏摄像头”吗?

     大数据文摘出品   作者:刘俊寰   你租的房子安全吗?   7月下旬,太原租客在房间发现多个隐蔽摄像头一事引起了多方关注。   根据澎湃新闻报道,一位女性租客租房中发现了多...

osc_zriqiio6
34分钟前
0
0
“别人”的毕设:造了个车!拆装驾驶一步到位,设计建模自行完成

     大数据文摘出品   作者:刘俊寰   疫情期间在家闭关能做点啥?看了几本书、补了几部美剧?   “别人家的孩子”利用这段时间,在家造出了一辆车!   你没听错,这是辆能上路...

osc_4eht81t7
35分钟前
14
0
“结婚”仍是应对竞争的优选,但斗鱼虎牙还要解决一个根本问题 - 知乎

作者|罗大肥 编辑|李春晖 百亿美元市值的中国新游戏直播巨头即将诞生,但人们远不像当初那样兴奋了。快抖B在侧,腾讯的“催婚”与其说是进攻,不如说是防守——两个人生活比单身省钱,父母也...

osc_2axit9df
37分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部