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的前面,比较严格

 

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

Quartz.net misfire实践的更多相关文章

  1. Quartz的misfire特性

    Quartz的misfire特性 只有一个线程.多个job 第一个job产生misfire(executeTime>Interval) 且是repeatForever 那么只会运行第一个job, ...

  2. Quartz的misfire理解

    misfire用于Trigger触发时,线程池中没有可用的线程或者调度器关闭了,此时这个Trigger变为misfire.当下次调度器启动或者有可以线程时,会检查处于misfire状态的Trigger ...

  3. Quartz的misfire处理机制分析

    Quartz是一个特性丰富的开源的任务调度开发库,它可以很方便的集成到你的应用程序中.在Quartz中,当一个持久的触发器因为调度器被关闭或者线程池中没有可用的线程而错过了激活时间时,就会发生激活失败 ...

  4. Quartz.Net—MisFire

    什么是misfire misfire就是哑火,就是trigger没有得到正常的触发. 1.所有的threadpool都在工作,而且工作时间很长,导致trigger没有threadpool去执行. 2. ...

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

    在日常开发汇总,经常会遇到需要定时任务的场景,简单的,可以使用Spring的定时任务调度框架,也可以使用Quartz.无论使用哪种,都需要解决一个问题,那就是集群问题.一般情况下,定时任务能且仅能运行 ...

  6. Quartz任务调度:MisFire策略和源码分析

    Quartz是为大家熟知的任务调度框架,先看看官网的介绍: ---------------------------------------------------------------------- ...

  7. Quartz小记(一):Elastic-Job - 分布式定时任务框架

    Elastic-Job是ddframe中dd-job的作业模块中分离出来的分布式弹性作业框架.去掉了和dd-job中的监控和ddframe接入规范部分.该项目基于成熟的开源产品Quartz和Zooke ...

  8. Quartz教程五:SimpleTrigger

    原文链接 | 译文链接 | 翻译:nkcoder 本系列教程由quartz-2.2.x官方文档翻译.整理而来,希望给同样对quartz感兴趣的朋友一些参考和帮助,有任何不当或错误之处,欢迎指正:有兴趣 ...

  9. Quartz.NET | 佳佳的博客

    原文:Quartz.NET | 佳佳的博客 Quartz.NET 是一个定时计划任务的框架,支持 .NET Core. 本文示例代码大部分来自于官方教程:Quartz.NET - Quartz.NET ...

随机推荐

  1. Android5.0版本之后切换听筒模式

    5.0以前Android听筒模式和扬声器模式这样就管用 扬声器://关闭麦克风  mAudioManager.setMicrophoneMute(false);  // 打开扬声器  mAudioMa ...

  2. 对比WDCP面板与AMH面板的区别与选择

    转载: http://www.laozuo.org/2760.html | 老左博客 随着VPS主机的性价比提高(其实就是降价)我们很多站长会越来越多的选择使用VPS搭建网站或者运营一些项目,相比较而 ...

  3. HDOJ 1870

    #include<stdio.h> #include<stack> #include<string.h> #include<iostream> usin ...

  4. Java中static静态关键字的使用

    我们可以基于一个类创建多个对象,每个对象都拥有自己的成员,所有成员变量的值是根据对象而存在的,有些时候我们希望一个类的所有对象共享一个成员,这就用到了static静态关键字 被静态关键字修饰的成员属于 ...

  5. php接口和多态的概念以及简单应用

    接口是面向对象中的一个重要特性,也是面向对象开发不可缺少的一个概念,下面简单说一下接口的概念,先看一段简单的代码: interface ICanEat { public function eat($f ...

  6. 利用VMware虚拟机(Android-x86 2.2)和eclipse,调试安卓代码

    下载 android-x86-2.2-generic.iso (这里包含eth0)  http://www.android-x86.org/download XP32位 只能使用 VMware Wor ...

  7. canvas API ,通俗的canvas基础知识(六)

    这篇是canvas API系列的首尾之作,这篇以后,所有的canvas的属性和方法就将完了,哦,不对,应该是大部分常用的,还有部分不常用的属性和方法,因为种种原因,就不介绍了,后期的重点就是多写一点c ...

  8. 5.django笔记之form保存表单信息,动态select

    作者:刘耀 一.使用form保存用户输入过的信息 场景:例如 如果用户注册,那么他输入n多个表单之后,那么他提交是时候,如果错误返回的时候,那么需要重新再输入表单内容.这样会影响用户体验,所以,使用f ...

  9. 2.python基础深入(元组、字符串、列表、字典)

    一,对象与类 对象: python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,玩的手机就是对象. 我们通过描述属性(特征)和行为来描述一个对象的. 在python中,一个对象的特 ...

  10. 新建myeclipse工作空间需要的工作

    接触了许多个项目,都挺大的,每次都需要配置,简单总结总结. 第一.右击项目,选择Text file encoding 第二.点击window-->preferences-->myeclip ...