译者注: 目录在这 [译]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. Linux系统实现ansible自动化安装配置httpd

    1.使用ansible的playbook实现自动化安装httpd 1)首先配置好ansible的hosts文件,让其对应主机能够受ansible控制 提示:我们在主机清单上配置了所管控的主机地址,但是 ...

  2. FPGA VGA+PLL+IP核笔记

    1.实现了预定功能!整个工程,没有使用例程的25MHZ,全部统一使用50MHZ.2.分辨率使用了800*600@72HZ.3.实现了只显示白色部分,黑色部分RGB == 0,要显示背景色.VGA图形基 ...

  3. eclipse使用jdbc方式连接sql server 2012数据库史上最新最详细教程(2015年4月已亲测)

    步骤分为3部:1.通过sql server 配置管理器配置1433端口   2.将sqljdbc41.jar类库添加到对应的工程中   3.在java程序中连接数据库 步骤1:打开sql server ...

  4. java jdk1.8 32/64位 官方绿色版下载附安装教程

    java jdk1.8 32/64位 官方绿色版下载附安装教程 地址:https://www.jb51.net/softs/691593.html

  5. Git 分支设计规范

    概述 这篇文章分享 Git 分支设计规范,目的是提供给研发人员做参考. 规范是死的,人是活的,希望自己定的规范,不要被打脸. 在说 Git 分支规范之前,先说下在系统开发过程中常用的环境. 简称 全称 ...

  6. pytorch之 Variable

    import torch from torch.autograd import Variable # Variable in torch is to build a computational gra ...

  7. Vue之Vuex的使用

    重点看懂这张图: 重点记住: 1.Mutation 必须是同步函数,即mutations里只能处理同步操作. 2.如果处理的是同步操作可直接commit提交mutations更改state,如果是异步 ...

  8. img 标签上的src 链接图片不存在时 怎么处理

    // .html <img [src]="nzSrc" *ngIf="nzSrc && hasSrc" (error)="img ...

  9. CentOS6.5安装指定的PHP版本(php5.5)(转)

    查询是否安装有php #rpm -qa|grep php 删除之前安装的php版本 (yum install 安装) #rpm -e php-fpm-5.3.3-47.el6.x86_64 --nod ...

  10. Hibernate框架预览以及基础介绍

    前言 从本节我们开始进入到对于Hibernate框架的学习,当前Hibernate框架还未正式发布6.0稳定版本,所以这里我们以5.4.12Final版本进行讲解. Hibernate框架 Hiber ...