Quartz.net misfire实践

?

1.问题描述

在使用Quartz.net定时运行作业时,存在一种情况:作业错过了某次执行,当作业恢复的时候应该怎么处理?如:job1在3:50的时候应该执行的,但此刻job1处于暂停状态,而到3:55的时候,job1 resume,那么错过的3:50该怎么处理?

?

对此,Quartz.net使用misfire机制,misfire可以翻译为"错过了触发"。

?

2.misfire机制

这里以CronTrigger为例,提供了两种可选的值,

DoNothing:不触发立即执行。等待下次Cron触发频率到达时刻开始按照Cron频率依次执行。即如果错过了某次执行,直接忽略。

FireOnceNow:以当前时间为触发频率立刻触发一次执行,然后按照Cron频率依次执行。

?

?

?

而原始的Quartz的还提供了更多的选项:

http://blog.csdn.net/sailorhdx/article/details/7656021

?

3.如何使用?

3.1 配置文件中

  1. <!--清除日志文件-->
  2. <job>
  3. ??<name>RemoveLogFileEveryDay</name>
  4. ??<group>InnerBusiness</group>
  5. ??<description>每天清除两周以前的日志文件</description>
  6. ??<job-type>NS.RemoveLogFileEveryDay, NS</job-type>
  7. ??<durable>false</durable>
  8. ??<recover>true</recover>
  9. </job>
  10. <trigger>
  11. ??<cron>
  12. ????<name>RemoveLogFileEveryDayTrigger</name>
  13. ????<group>RemoveLogFileEveryDayTrigger</group>
  14. ????<description>每天23:00点执行一次</description>
  15. ????<job-name>RemoveLogFileEveryDay</job-name>
  16. ????<job-group>InnerBusiness</job-group>
  17. ????<misfire-instruction>DoNothing</misfire-instruction>
  18. ????<cron-expression>0 0 23 * * ?</cron-expression>
  19. ??</cron>
  20. </trigger>

?

如上:配置了DoNothing。

?

3.2 代码中

  1. ICronTrigger myCronTrigger = scheduler.GetTrigger(triggerKey) as ICronTrigger;
  2. ????????????????myCronTrigger.GetTriggerBuilder().WithCronSchedule(cronExpresion, (zw) => { zw.WithMisfireHandlingInstructionDoNothing(); }).Build();

?

仍然配置了DoNothing

?

?

4.艰辛的过程:查找配置方法——?<misfire-instruction>DoNothing</misfire-instruction>

一开始,我就想搜一下,如何配置misfire-instruction的配置,但是怎么都找不到,网上有一堆关于quartz_jobs.xml的配置的例子,可是都没有misfire的配置,因为misfire模式使用的FireOnceNow。

?

于是去官网的API搜索配置,还是没有找到

?

然后看到了github,就下载了代码

?

找到这个文件XMLSchedulingDataProcessor.cs,继续找到QuartzXmlConfiguration20,

XmlSerializer xs = new
XmlSerializer(typeof (QuartzXmlConfiguration20));

?

终于知道是misfire-instruction,而且必须配置在cron-expression的前面,比较严格

?

继续找到枚举值,直接配置字符串而已~

时间: 2024-10-26 14:16:00

Quartz.net misfire实践的相关文章

Quartz的misfire特性

Quartz的misfire特性 只有一个线程.多个job 第一个job产生misfire(executeTime>Interval) 且是repeatForever 那么只会运行第一个job,后面所有job都无法运行 第一个job产生misfire(executeTime>Interval) 且是withRepeatCount(N),默认情况下(withMisfireHandlingInstructionNowWithExistingCount),第一个job执行完后会执行第二个job; 但

Quartz的misfire处理机制分析

Quartz是一个特性丰富的开源的任务调度开发库,它可以很方便的集成到你的应用程序中.在Quartz中,当一个持久的触发器因为调度器被关闭或者线程池中没有可用的线程而错过了激活时间时,就会发生激活失败(misfire).那么,我们需要明确2个问题:如何判定激活失败:如何处理激活失败. 一.激活失败判定 quartz.properties配置文件中有一个属性是misfireThreshold(单位为毫秒),用来指定调度引擎设置触发器超时的"临界值".也就是说Quartz对于任务的超时是有

集群式Quartz定时任务框架实践

在日常开发汇总,经常会遇到需要定时任务的场景,简单的,可以使用Spring的定时任务调度框架,也可以使用Quartz.无论使用哪种,都需要解决一个问题,那就是集群问题.一般情况下,定时任务能且仅能运行于一台应用实例上. 前提 本文工程基于spring boot 2.1.7.RELEASE 工程配置  一.pom依赖 如下图所示: 二.yml配置 yml配置如下图所示: 三.quartz.properties quartz相关属性配置如图: 注意: 1.重中之重,要设置org.quartz.job

Quartz教程五:SimpleTrigger

原文链接 | 译文链接 | 翻译:nkcoder 本系列教程由quartz-2.2.x官方文档翻译.整理而来,希望给同样对quartz感兴趣的朋友一些参考和帮助,有任何不当或错误之处,欢迎指正:有兴趣研究源码的同学,可以参考我对quartz-core源码的注释(进行中). SimpleTrigger可以满足的调度需求是:在具体的时间点执行一次,或者在具体的时间点执行,并且以指定的间隔重复执行若干次.比如,你有一个trigger,你可以设置它在2015年1月13日的上午11:23:54准时触发,或

Elastic-Job - 分布式定时任务框架

Elastic-Job是ddframe中dd-job的作业模块中分离出来的分布式弹性作业框架.去掉了和dd-job中的监控和ddframe接入规范部分. ddframe其他模块也有可独立开源的部分,之前当当曾开源过dd-soa的基石模块DubboX. 项目开源地址:https://github.com/dangdangdotcom/elastic-job Elastic-Job主要功能 定时任务: 基于成熟的定时任务作业框架Quartz cron表达式执行定时任务. 作业注册中心: 基于Zook

quatz集群化定时任务使用简介

概要 主要介绍quartz如何使用,原理请阅读下面的参考文献,整理的已经很详细.使用quartz集群的主要目的是避免单点job故障,重要job故障后自动重新执行. 使用指南 加入quartz jar 包依赖 <dependency> <groupId>com.opensymphony.quartz</groupId> <artifactId>com.springsource.org.quartz</artifactId> <version&

Quartz最佳实践

本文来自对http://www.quartz-scheduler.org/documentation/best-practices.html的翻译. 表示还没用过Quartz,正准备用的,然后在官网上看到了这个,然后觉得还挺短的,就翻译一下. 最佳实践 对生产环境中使用Tips 任务数据映射Tips 触发Tips JDBC的JobStore daylight savings time(这个翻译是夏令时,所以我不知道怎么翻译了) 任务 监听器(触发监听器,任务监听器,调度监听器) 通过应用暴露调度

开源调度框架Quartz最佳实践

开源调度框架Quartz最佳实践 Quartz是一个Java调度框架,当前的最新版本为2.2.1. 以Quartz 2.2.1版为例,Quartz最佳实践(用于生产系统)总结如下: 1.跳过更新检查Quartz内置了一个“更新检查”特性,因此Quartz项目每次启动后都会检查官网,Quartz是否存在新版本.这个检查是异步的,不影响Quartz项目本身的启动和初始化.可以在Quartz配置文件中,设置org.quartz.scheduler.skipUpdateCheck的属性为true来跳过更

Quartz应用实践入门案例二(基于java工程)

在web应用程序中添加定时任务,Quartz的简单介绍可以参看博文<Quartz应用实践入门案例一(基于Web应用)> .其实一旦学会了如何应用开源框架就应该很容易将这中框架应用与自己的任何程序中.只要你的程序中需要这项功能!但是对于一些刚开始学习某种框架的菜鸟而言,这似乎就不是那么简单了.如果在学习开源框架API的同时,能有一两个案例小程序配着其API去看,那应该就是事半功倍了. 本文是在自己学习源码和网上查找资料的基础上完成的,将详细叙述在java工程中如何巧妙的融入Quartz框架,小案