译者注:

目录在这 Quartz.NET 3.x 教程

原文在这 Lesson 5: SimpleTrigger

如果你需要在特定的时间点执行一次作业, 或者在特定的时间点执行一次作业, 然后在特定的时间间隔重复执行一次作业, 那么简单触发器应该能够满足你的调度需求. 或者说, 如果你想让触发器2005年1月13日上午11:23:54触发, 然后每10秒再出发5次.

如上所述, 你可能会发现简单触发器的属性包括: 开始时间, 结束时间, 重复次数和重复间隔. 所有这些属性都是你所期望的, 还有几个与结束时间属性相关的特殊注释.

重复次数可以是零, 正整数, 或常量值 SimpleTrigger.Repeatedeniminate. 重复间隔属性必须是 TimeSpan.Zero, 或正 TimeSpan 值. 注意重复间隔为零将导致触发器的 '重复次数' 触发同时发生 (或尽可能接近调度程序可以管理的并发).

如果你已经熟悉 DateTime 相关的类, 你可能会发现她有助于计算触发器触发时间, 具体取决于你试图创建的 startTimeUtc (或 endTimeUtc).

EndTimeUtc 属性 (如果已指定) 会覆盖重复次数属性. 如果你想创建一个触发器, 比如每10秒触发一次, 直到某个指定的时间点, 而不必计算其在开始时间和结束时间之间重复的次数, 那么这个方法很有用, 你可以简单地指定结束时间, 然后无限期地使用 RepeatIndefinitely 的重启次数 (你甚至可以指定某个巨大数字的重复次数, 肯定会比触发器在结束时间到达之前实际触发的次数大的多).

SimpleTrigger 实例是使用 TriggerBuilder (用于触发器的主属性) 和 WithSimpleSchedule 扩展方法 (用于 SimpleTrigger 的特定属性) 构建的.

构建一个在某时刻立即触发的触发器, 并且不重复执行:

// 触发器构建器默认创建简单触发器, 实际上会返回一个 ITrigger
ISimpleTrigger trigger = (ISimpleTrigger) TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.StartAt(myStartTime) // some Date
.ForJob("job1", "group1") // 用名称和组名标识作业
.Build();

构建一个在某时刻立即触发的触发器, 然后每10秒执行10次:

trigger = TriggerBuilder.Create()
.WithIdentity("trigger3", "group1")
.StartAt(myTimeToStartFiring) // 如果没有给出开始时间 (如果省略了这一行), 则隐含为 "现在"
.WithSimpleSchedule(x => x
.WithIntervalInSeconds(10)
.WithRepeatCount(10)) // 注意这里设置重复次数10次, 但一共会执行11次
.ForJob(myJob) // 用 JobDetail 本身的句柄标识 job
.Build();

构建一个在5分钟之后触发一次的触发器:

trigger = (ISimpleTrigger) TriggerBuilder.Create()
.WithIdentity("trigger5", "group1")
.StartAt(DateBuilder.FutureDate(5, IntervalUnit.Minute)) // 用 DateBuilder 创建一个将来的日期
.ForJob(myJobKey) // 用 JobKey 标识作业
.Build();

构建一个马上触发的触发器, 然后每5分钟重复触发一次, 直到 22:00:

trigger = TriggerBuilder.Create()
.WithIdentity("trigger7", "group1")
.WithSimpleSchedule(x => x
.WithIntervalInMinutes(5)
.RepeatForever())
.EndAt(DateBuilder.DateOf(22, 0, 0))
.Build();

构建一个在下个小时整点触发的触发器, 然后每2个小时重复触发一次, 直到海枯石烂:

trigger = TriggerBuilder.Create()
.WithIdentity("trigger8") // 由于未指定组, "trigger8" 将会在默认组里
.StartAt(DateBuilder.EvenHourDate(null)) // 得到下一个偶数小时 (分秒为0 ("00:00"))
.WithSimpleSchedule(x => x
.WithIntervalInHours(2)
.RepeatForever())
// 注意在此示例中, 没有调用 'forJob(..)' 方法如果需要把触发器与作业一起传递给计划程序, 则该选项有效
.Build(); await scheduler.scheduleJob(trigger, job);

花点时间好好看看由 TriggerBuilder 以及扩展方法 WithSimpleSchedule 定义的所有可用方法, 以便熟悉上面示例中可能没有演示的可用选项.

简单触发器哑火说明

简单触发器有几个指令可用于通知 Quartz.NET 在发生哑火时应执行的操作. (本教程的 "更多关于触发器" 部分介绍了哑火说明). 这些指令被定义在常量 MisfirePolicy.SimpleTrigger 里 (包括描述其行为的API文档). 说明包括:

简单触发器的哑火说明常量

  • MisfireInstruction.IgnoreMisfirePolicy
  • MisfirePolicy.SimpleTrigger.FireNow
  • MisfirePolicy.SimpleTrigger.RescheduleNowWithExistingRepeatCount
  • MisfirePolicy.SimpleTrigger.RescheduleNowWithRemainingRepeatCount
  • MisfirePolicy.SimpleTrigger.RescheduleNextWithRemainingCount
  • MisfirePolicy.SimpleTrigger.RescheduleNextWithExistingCount

你应该回顾一下前面的课程所有触发器都可以使用 MisfirePolicy.SmartPolicy 指令, 并且此指令也是所有触发器类型的默认指令.

如果使用 '智能策略' 指令, 则 SimpleTrigger 会根据给定的 SimpleTrigger 实例的配置和状态, 在其各种哑火指令之间动态选择. SimpleTrigger.UpdateAfterMisfire () 方法的文档解释了这种动态行为的细节.

构建 SimpleTriggers 时, 可以将哑火指令作为简单调度的一部分 (通过 SimpleSchedulerBuilder):

trigger = TriggerBuilder.Create()
.WithIdentity("trigger7", "group1")
.WithSimpleSchedule(x => x
.WithIntervalInMinutes(5)
.RepeatForever()
.WithMisfireHandlingInstructionNextWithExistingCount())
.Build();

Quartz.NET - 教程 5: 简单触发器的更多相关文章

  1. Quartz.NET学习笔记(三) 简单触发器

    触发器是Quartz.NET的另外第一个核心元素,他有2种类型,简单触发器(Simple Trigger)和计划任务触发器(Cron  Trigger), 一个触发器可以绑定一个任务. 通用触发器属性 ...

  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 API,Jobs和Triggers简介

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

  4. Quartz.Net - Lesson2: 任务和触发器

    Lesson 2: 任务和触发器 本系列文章是官方3.x文档的翻译,原文地址:https://www.quartz-scheduler.net/documentation/quartz-3.x/tut ...

  5. 《zw版·Halcon-delphi系列原创教程》简单的令人发指,只有10行代码的车牌识别脚本

    <zw版·Halcon-delphi系列原创教程>简单的令人发指,只有10行代码的车牌识别脚本 简单的令人发指,只有10行代码的车牌识别脚本      人脸识别.车牌识别是opencv当中 ...

  6. Playmaker全面实践教程之简单的使用Playmaker示例

    Playmaker全面实践教程之简单的使用Playmaker示例 简单的使用Playmaker示例 通过本章前面部分的学习,相信读者已经对Playmaker有了一个整体的认识和印象了.在本章的最后,我 ...

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

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

  8. Oracle数据库零散知识06 -- Package的定义与简单触发器

    CREATE OR REPLACE PACKAGE pak_02 IS--包头 --这里可定义公共参数 FUNCTION fun_01 RETURN NUMBER; PROCEDURE pro_01 ...

  9. ASP.NET Core 基础教程总结 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 基础教程总结 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 基础教程总结 ASP.NET Core 基础教程总算是有了个简单 ...

随机推荐

  1. CDH 离线安装 CM

    CDH支持Yum包,Tar包,RPM包,Cloudera Manager(CM)四种安装方式 Cloudera Manager(CM) 用于CDH集群管理,可进行节点安装,配置,服务管理等,提供Web ...

  2. 使用abp框架与vue一步一步写我是月老的小工具(1)

    一.前言 因为工作的原因,我真正写代码的时间很少,技术面广但深度一直不够,兴趣广泛但缺乏专业精神.以前一直想用asp.net写一款框架,用来在企业开发过程中做一些基础工作,不过后来我找到abp这个框架 ...

  3. 时序数据库 Apache-IoTDB 源码解析之文件格式简介(三)

    上一章聊到在车联网或物联网中对数据库的需求,以及 IoTDB 的整体架构,详情请见: 时序数据库 Apache-IoTDB 源码解析之系统架构(二) 打一波广告,欢迎大家访问IoTDB 仓库,求一波 ...

  4. 如何为wordpress 的文章添加分页

    原文参考:http://www.wpdaxue.com/add-next-page-button-wordpress-post-editor.html 1.在编辑文章时切到text 模式,然后加上&l ...

  5. java设计模式5——适配器模式

    java设计模式5--适配器模式 1.结构型模式介绍 1.1.作用 从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题. 分类: 适配器模式 代理模式 桥接模式 装饰模式 组合模式 ...

  6. [flask]邮件配置-20171227

    环境变量配置: # PowerShell设置环境变量: $env:MAIL_USERNAME = "" $env:MAIL_PASSWORD = "" 国内: ...

  7. Codeforces_708_A

    http://codeforces.com/problemset/problem/708/A 贪心,先把前面连续的一串'a'排除,再向后知道找到第一个'a',注意特殊情况. #include<i ...

  8. eclipse新下载,安装和配置

    question1 java11没有jre,无法通过eclipse-inst-win64进行安装 solution Windows 7 64bit 安装jdk i586还是jdk x64?jdk x6 ...

  9. Java并发编程(三):ReentrantLock

    ReentrantLock是可以用来代替synchronized的.ReentrantLock比synchronized更加灵活,功能上面更加丰富,性能方面自synchronized优化后两者性能没有 ...

  10. Gdal随笔

    开始研究遥感影像的分割,尝试去通过gdal对影像进行读取并对图像进行分割.过程中遇到了许多问题,现总结如下. 1.error1:range must be finite 报这个错误是因为数组中有Nan ...