译者注: 目录在这 [译]Quartz.NET 3.x 教程

译者注: 原文在这 Lesson 4: More About Triggers

跟作业一样, 触发器也相当容易使用, 但确实包含各种可定制的选项, 在充分利用 Quartz.NET 之前, 你需要了解这些选项. 此外, 如前所述, 有不同类型的触发器, 你可以选择以满足不同的调度需求.

通用触发器属性

除了所有触发器类型都有的用于跟踪其标识的 TriggerKey 属性之外, 还有一些其他属性是所有触发器类型通用的. 在构建触发器定义时可以使用 TriggerBuilder 设置这些通用属性 (示例如下).

以下是所有触发器类型通用的属性列表:

  • JobKey 属性表示触发时应执行的作业的标识.
  • StartTimeUtc 属性表示触发器的调度首次生效的时间. 该值是一个 DateTimeOffset 对象用于定义给定日历日期上的时间点. 对于某些触发器类型, 触发器实际上会在开始时触发, 而对于其他类型, 它只是标记应该开始遵循的调度时间. 这意味着你可以存储一个触发器, 其中包含一个时间表, 如1月份的 “每月第5天”, 并且如果StartTimeUtc属性设置为4月1日, 则在第一次触发前几个月.
  • EndTimeUtc 属性表示触发器的调度何时不再有效. 换句话说, 一个调度时间为 "每月5日" 并且结束时间为7月1日的触发器将在6月5日激活最后一次触发.

其他属性, 将在下面的小节中进一步讨论解释.

优先级

有时候, 当你有很多触发器 (或者说你的 Quartz.NET 线程池中只有很少的工作线程) 时, Quartz.NET 可能没有足够的资源来立即触发所有计划同时触发的触发器. 在这种情况下, 你可能想要控制哪些触发器首先在可用的 Quartz.NET 工作线程中触发. 为此, 你可以在触发器上设置优先级属性. 如果N个触发器同时触发, 但当前只有Z个工作线程可用, 则首先执行具有最高优先级的Z个触发器. 如果你没有在触发器上设置优先级, 那么它将使用默认优先级5. 优先级的值可以设置为任意整数, 可以是正数或负数.

注意: 仅当触发器具有相同的触发时间时才比较优先级. 计划在10:59执行的触发器始终在11:00执行的触发器的前触发.

注意: 当检测到触发器的作业需要恢复时, 其调度恢复的优先级与原始触发器相同.

哑火说明

触发器的另一个重要属性是其 "Misfire Instructions". 如果由于调度程序关闭而导致持续触发器 "遗漏" 其触发时间, 或者 Quartz.NET 线程池中没有可用的线程来执行作业, 则会发生哑火. 不同的触发类型可以使用不同的哑火指令. 默认情况下, 他们使用 "智能策略" 指令 - 它具有基于触发类型和配置的动态行为. 当调度程序启动时, 她会搜索任何发生故障的持久化的触发器, 然后根据各自配置的哑火指令更新其中的每个触发器. 当你在自己的项目中开始使用 Quartz.NET 时, 你应该让自己熟悉在给定触发器类型上定义的哑火指令, 并在他们的 API 文档中解释. 关于哑火指令的更多具体信息将在针对每种触发类型的教程课程中给出.

日历

实现了 ICalendar 接口的 Quartz. NET Calendar 对象可以在触发器存储在调度程序中时与触发器关联. 日历对于从触发器的调度时间表中排除时间块非常有用. 例如, 你可以创建一个触发器, 并在每个工作日的上午9:30触发一个作业, 随后再添加日历排除所有的业务假期.

日历可以是任何实现 ICalendar 接口的可序列化对象, ICalendar 接口定义如下:

namespace Quartz
{
public interface ICalendar
{
string Description { get; set; } ICalendar CalendarBase { set; get; } bool IsTimeIncluded(DateTimeOffset timeUtc); DateTime GetNextIncludedTimeUtc(DateTimeOffset timeUtc); ICalendar Clone();
}
}

即使日历可以 "屏蔽" 一毫秒那么短的时间段, 但最有可能的是, 你会对 "屏蔽" 一整天更感兴趣. 为了方便起见, Quartz.NET 内置了类 HolidayCalendar, 她就是这么做的.

日历必须实例化并通过 AddCalendar(..) 方法注册到调度程序中. 如果你使用 HolidayCalendar, 那么在实例化之后, 你应该使用她的 AddExcludedDate(DateTime date) 方法来添加你希望排除在日程之外的日子. 同一日历实例可以用于多个触发器, 例如:

举个栗子

HolidayCalendar cal = new HolidayCalendar();
cal.AddExcludedDate(someDate); await sched.AddCalendar("myHolidays", cal, false); Trigger t = TriggerBuilder.Create()
.WithIdentity("myTrigger")
.ForJob("myJob")
.WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(9, 30)) // 每天 9:30 执行作业
.ModifiedByCalendar("myHolidays") // 指定节假日不执行
.Build(); // .. schedule job with trigger ITrigger t2 = TriggerBuilder.Create()
.WithIdentity("myTrigger2")
.ForJob("myJob2")
.WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(11, 30)) // 每天 11:30 执行作业
.ModifiedByCalendar("myHolidays") // 指定节假日不执行
.Build(); // .. schedule job with trigger2

触发器的构造/构建细节将在接下来的几节课程中给出. 现在, 只需要相信上面的代码创建了两个触发器, 每天触发一次调度. 另外, 在排除的日历期间内发生的任何触发都将被跳过.

请参阅 Quartz.Impl.Calendar 命名空间来获取更多可以适合你需求的 ICalendar 实现.

Quartz.NET - 教程 4: 更多关于触发器的更多相关文章

  1. Quartz.NET - 教程 5: 简单触发器

    译者注: 目录在这 Quartz.NET 3.x 教程 原文在这 Lesson 5: SimpleTrigger 如果你需要在特定的时间点执行一次作业, 或者在特定的时间点执行一次作业, 然后在特定的 ...

  2. (转)Java任务调度框架Quartz入门教程指南(四)Quartz任务调度框架之触发器精讲SimpleTrigger和CronTrigger、最详细的Cron表达式范例

    http://blog.csdn.net/zixiao217/article/details/53075009 Quartz的主要接口类是Schedule.Job.Trigger,而触发器Trigge ...

  3. Quartz 框架 教程(中文版)2.2.x

    Quartz 框架 教程(中文版)2.2.x 之第一课 开始使用Quartz框架 Quartz 框架 教程(中文版)2.2.x 之第二课 Quartz API,Jobs和Triggers简介 Quar ...

  4. (转)Java任务调度框架Quartz入门教程指南(二) 使用job、trigger、schedule调用定时任务

    http://blog.csdn.net/zixiao217/article/details/53044890 读完第一节,我们已经对Quartz有了一个大体的认识,它可以定时帮我们执行一些处理程序, ...

  5. Quartz.NET教程:(01) 使用Quartz

    使用调度器 (scheduler) 之前要先用 ISchedulerFactory 的一个实现来实例化调度器(scheduler).一旦调度器实例化完成,则它可以被启动.置于备用模式或者关闭.需要注意 ...

  6. [译]Quartz 框架 教程(中文版)2.2.x 之第二课 Quartz API,Jobs和Triggers简介

    第二课:QuartzAPI,Jobs和Triggers简介 Quartz API Quartz API 关键的几个接口: Scheduler:跟任务调度相关的最主要的API接口. Job:你期望任务调 ...

  7. (转)Java任务调度框架Quartz入门教程指南(三)任务调度框架Quartz实例详解深入理解Scheduler,Job,Trigger,JobDetail

    http://blog.csdn.net/zixiao217/article/details/53053598 首先给一个简明扼要的理解: Scheduler 调度程序-任务执行计划表,只有安排进执行 ...

  8. [译]Quartz 框架 教程(中文版)2.2.x 之第一课 开始使用Quartz框架

    第一课:开始使用Quartz框架 在你使用调度器之前,需要借助一些具体的例子去理解(谁愿意只是猜啊?).你可以使用SchedulerFactory类来达到程序调度的目的.有一些Quartz框架的用户可 ...

  9. Quartz定时任务学习(五)触发器

    顾名思义,Trigger(触发器)的责任就是触发一个 Job 去执行.当用 Scheduler 注册一个 Job 的时候要创建一个 Trigger 与这个 Job 相关联.Quartz 提供了四种类型 ...

随机推荐

  1. NLP新秀 - Bert

    目录 什么是Bert Bert能干什么? Bert和TensorFlow的关系 BERT的原理 Bert相关工具和服务 Bert的局限性和对应的解决方案 沉舟侧畔千帆过, 病树前头万木春. 今天介绍的 ...

  2. requests的post提交form-data; boundary=????

    提交这种用boundary分隔的表单数据时,有两种方法,一种是以传入files参数,另一种是传入data参数,data参数需要自己用boundary来分隔为指定的形式,而files参数则以元组的形式传 ...

  3. ESXi以及WorkStation缩减thin provision模式Linux虚拟机磁盘的方法

    1. 公司的服务器采用ESXi 进行管理. 有时候为了灵活性,需要将虚拟机从ESXi服务器上面导出来. 放置到不同的客户机器上面去. 2. 但是发现,比如我在linux里面安装了Oracle数据库, ...

  4. 强烈推荐 10 款珍藏的 Chrome 浏览器插件

    Firebug 的年代,我是火狐(Mozilla Firefox)浏览器的死忠:但后来不知道为什么,该插件停止了开发,导致我不得不寻求一个新的网页开发工具.那段时间,不少人开始推荐 Chrome 浏览 ...

  5. SpringBoot2.x操作缓存的新姿势

    一.介绍 spring cache 是spring3版本之后引入的一项技术,可以简化对于缓存层的操作,spring cache与springcloud stream类似,都是基于抽象层,可以任意切换其 ...

  6. python学习(1)python的基本概念

    1.python是世界上最流行的程序语言之一,用途广泛. 2.python是解释型语言,与C++编译类语言相比,python扩展性强,简单易上手.但是缺点也很明显,执行速度慢. 3.python定义中 ...

  7. Oracle 12C In-Memory特性研究

    Oracle 12C In-Memory特性研究一.Oracle In-Memory1.1 In-Memory 开启方法1.2 开启与关闭IM column store1.3 inmemory优先级调 ...

  8. javascript HierarchicalTaskAnalysis-hta编程(.hta)

    main.hta  code: <script>window.resizeTo(400,300);</script> <head> <hta:applicat ...

  9. 20200223--python学习第15天

    今日内容 模块知识 内置模块 time/datatime/json/其他 内容回顾&作业题 重点知识点 构造字典和函数对应的关系,避免重复的if  else a = 1 b = 2 ----- ...

  10. 《自拍教程29》Sublime_小脚本编写首选

    Sublime Sublime 是一个轻量.简洁.高效.跨平台的编辑器, 最新的是Sublime Text 3. Sublime对Python支持非常好,如果只是简单的编写批处理脚本编写, 或者小范围 ...