译者注:

目录在这 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. openlayer3 坐标系转换

    'EPSG:4326'-经纬度坐标-WGS84'EPSG:3857'- xy坐标-web墨卡托 ol3默认的坐标系为3857,即在创建ol.map的时候,若不指定projection,则默认为EPSG ...

  2. ubuntu 中使用makefile组织c++多文件的简陋方法

    现有类定义Sales_item.hpp Sales_item.cpp 主函数my7_31.cpp(代码来源于c++primer 习题解答7_31) 希望使用makefile在Ubuntu中进行编译链接 ...

  3. 技术派-github常见的一些用法和缩写

    PR: Pull Request. 拉取请求,给其他项目提交代码 LGTM: Looks Good To Me.  看起来不错,代码已 review,可以合并 SGTM: Sounds Good To ...

  4. ATL窗口

    标准的Windows应用程序框架: /*------------------------------------------------------------ HELLOWIN.C -- Displ ...

  5. windows 安裝 gcc 編譯器 - MinGW

    MinGW 介紹 MinGW 全稱 Minimalist GNU For Windows,是個精簡的Windows平台C/C++.ADA及Fortran編譯器,相比Cygwin而言,體積要小很多,使用 ...

  6. uredis ------ 异步 redis 封装的访问库(c++),基于hiredis.

    详见 github : https://github.com/uniqss/uredis 底层使用hiredis库,使用libuv库. 只支持异步 支持分表分库,一般是用玩家的ID去取模,比如分库10 ...

  7. C语言宏的神奇写法:语句块作为参数,算半个函数式编程?

    我想要写几个循环做测试代码,每次都写 `for(size_t i = 0; i < n; i++)` 很烦人,然后就灵机一动,能不能用宏实现,然后就写出了: #define repeat(n, ...

  8. python strip()方法使用

    描述 python strip() ,用于去除述字符串头尾指定字符(默认为空格或换行符)或字符序列. 注意:此方法只能去除头尾的空格或是换行符,不能去除中间的. 语法: str.strip([char ...

  9. php扩展模块的安装

    PHP的扩展模块安装 模块安装总则: 进入到ext/目录下对应的模块 执行/usr/local/php/bin/phpize 也就是执行一遍phpize生成编译文件 ./configure --wit ...

  10. gulp 压缩文件2 摘

    一下代码用来简单的压缩 .js  和 .css   ;  在cmd里执行 gulp minifycss    minifyjs,各task执行是正常的. 注意,先安装后相应的模块,建议安装到本地. 说 ...