[译]Quartz.NET 框架 教程(中文版)2.2.x 之第五课 SimpleTrigger

第五课 SimpleTrigger

如果你需要在一个指定时间段内执行一次作业任务或是在指定的时间间隔内多次执行作业任务,SimpleTrigger应该能满足你的调度需求。例如,你希望触发器在2015年1月13日上午11:23:54准时触发,或是希望在那个时间点触发,然后再重复触发5次,每隔10秒一次。有了这样的描述,你就不会对SimpleTrigger包含的参数感到奇怪:开始执行时间,结束执行时间,重复次数和重复执行间隔时间。所有的参数都是你期望的那样,只是关于结束执行时间参数有两条特别的提示。

重复次数可以为0,正整数或是SimpleTrigger.REPEAT_INDEFINITELY常量值。重复执行间隔必须为0或长整数(long类型),它表示毫秒数的值。注意如果重复执行间隔时间为0会导致数量为“重复次数”的触发器并发执行(或是在调度器控制下接近并发执行)。

如果你还不熟悉Quartz的DateBuilder类,你尝试创建日期对象时会发现它非常方便地根据startTimeUtc 或 endTimeUtc参数计算触发器的触发时间。

EndTimeUtc参数(如果被指定)会覆盖重复次数参数的效果。当你希望创建一个触发器,每隔10秒被触发一次直到给定的截止时间,而不是必须完成在给定的开始和结束时间段内的触发次数,使用endTime参数会非常方便,你可以仅仅指定一个end-time参数,并且将重复次数设置为REPEAT_INDEFINITELY(你甚至可以将重复次数指定为非常大的值,确保比结束执行时间到达前实际要执行的次数大就行)。

下面是使用简易调度器定义触发器的几个案例,请通读一遍,每个例子都至少展示了一个新的、不同的知识点:

创建触发器时指定具体的时间,不重复执行:

1 // trigger builder creates simple trigger by default, actually an ITrigger is returned
2 ISimpleTrigger trigger = (ISimpleTrigger) TriggerBuilder.Create()
3     .WithIdentity("trigger1", "group1")
4     .StartAt(myStartTime) // some Date
5     .ForJob("job1", "group1") // identify job with name, group strings
6     .Build();

创建触发器时指定具体的时间,然后每隔10秒触发一次,共重复触发10次:

1 trigger = TriggerBuilder.Create()
2     .WithIdentity("trigger3", "group1")
3     .StartAt(myTimeToStartFiring) // if a start time is not given (if this line were omitted), "now" is implied
4     .WithSimpleSchedule(x => x
5         .WithIntervalInSeconds(10)
6         .WithRepeatCount(10)) // note that 10 repeats will give a total of 11 firings
7     .ForJob(myJob) // identify job with handle to its JobDetail itself
8     .Build();

创建触发器,5分钟后将会触发一次:

trigger = (ISimpleTrigger) TriggerBuilder.Create()
    .WithIdentity("trigger5", "group1")
    .StartAt(DateBuilder.FutureDate(5, IntervalUnit.Minute)) // use DateBuilder to create a date in the future
    .ForJob(myJobKey) // identify job with its 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小时触发一次,永不停歇:

 1 trigger = TriggerBuilder.Create()
 2     .WithIdentity("trigger8") // because group is not specified, "trigger8" will be in the default group
 3     .StartAt(DateBuilder.EvenHourDate(null)) // get the next even-hour (minutes and seconds zero ("00:00"))
 4     .WithSimpleSchedule(x => x
 5         .WithIntervalInHours(2)
 6         .RepeatForever())
 7     // note that in this example, ‘forJob(..)‘ is not called
 8     //  - which is valid if the trigger is passed to the scheduler along with the job
 9     .Build();
10
11 scheduler.scheduleJob(trigger, job);

花点时间查阅TriggerBuilder和SimpleScheduleBuilder类的所有可用方法,以便你能熟悉在上面演示代码中可能没有展示的有用操作。

注意TriggerBuilder(或是Quartz别的创建类)在你没有明确设置参数值时一般会选择合理的值。例如,如果你没有调用withIdentity方法,TriggerBuilder会为你的触发器产生一个随机的名字,如果你没有调用startAt方法,它会假设是立即触发。

SimpleTrigger的触发失败指令

SimpleTrigger有几条指令,用来告知Quartz当触发失败时该如何操作。(在第四课更多关于触发器已经介绍过触发失败的情况)。这些指令在SimpleTrigger类中设计成常量(包含JavaDoc描述了它们的行为)。指令有:

SimpleTrigger的触发失败指令常量:

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

回顾前面的课程可以知道:所有的触发器都可以使用Trigger.MISFIRE_INSTRUCTION_SMART_POLICY指令,并且这条指令也是所有触发器的默认指令。

如果使用“智能策略”指令,SimpleTrigger会从多条触发失败指令集中根据配置和SimpleTrigger实例的状态动态地选择指令。文档中SimpleTrigger的SimpleTrigger.UpdateAfterMisfire()方法解释了动态选择行为更详细的信息。
    当你创建SimpleTrigger时,可以通过SimpleSchedulerBuilder指定触发失败指令作为调度器的一部分。

1 trigger = TriggerBuilder.Create()
2     .WithIdentity("trigger7", "group1")
3     .WithSimpleSchedule(x => x
4         .WithIntervalInMinutes(5)
5         .RepeatForever()
6         .WithMisfireHandlingInstructionNextWithExistingCount())
7     .Build();
时间: 2024-08-02 14:23:03

[译]Quartz.NET 框架 教程(中文版)2.2.x 之第五课 SimpleTrigger的相关文章

[译]Quartz.NET 框架 教程(中文版)2.2.x 之第四课 更多关于Triggers

第四课 更多关于Triggers 跟作业任务类似,触发器也非常容易使用,但是在你能够充分掌握Quartz之前,你需要知道并理解许多触发器的客户化的参数.前面已经提到过,有许多不同类型的触发器供你选择,适用不同的调度需求. 你将会在第五课 Simple Trigger和第六课 Triggers学到这两种常用的触发器类型. 触发器通用属性 所有类型的触发器都有TriggerKey属性去跟踪触发器标识,除了这一个事实之外,还有许多其他的属性,对所有触发器类型都适用.这些通用属性在创建触发器定义时通过T

[译]Quartz.Net 框架 教程(中文版)2.2.x 之第三课 更多关于Jobs和JobDetails

第三课 更多关于Jobs和JobDetails 在这二课我们已经学习到,Jobs接口非常容易实现,只有一个execute方法.我们需要再学习一些知识去理解jobs的本质,Job接口的execute方法以及JobDetails接口. 当你实现Job接口类,Quartz需要你提供job实例的各种参数,Job接口实现类中的代码才知道如何去完成指定类型Job的具体工作.这个过程是通过JobDetail类来完成的,该类会在下一个章节作简要介绍.        JobDetail的实例是调用JobBuild

[译]Quartz.NET 框架 教程(中文版)2.2.x 之第七课 触发监听器和作业任务监听器

第七课:触发监听器和作业任务监听器 监听器是在调度器中基于事件机制执行操作的对象.你大概可以猜到,触发监听器接收响应跟触发器有关的事件,作业任务监听器接收响应跟作业任务有关的事件. 跟触发器有关的事件包括:触发器被触发,触发器触发失败(在触发器课程中讨论过),以及触发器触发完成(触发器完成后作业任务开始运行). 1 public interface ITriggerListener 2 { 3 string Name { get; } 4 5 void TriggerFired(ITrigger

[译]Quartz.NET 框架 教程(中文版)2.2.x 之第六课 CronTrigger

第六课 CronTrigger CronTrigger比SimpleTrigger更常用,当你需要一个基于日历般概念的作业调度器,而不是像SimpleTrigger那样精确指定间隔时间. 使用SimpleTrigger,你可以这样指定触发时间表例如“每周五的中午”,或是“每周末的上午9:30”,甚至是“一月份每周一.三.五上午9:00到10:00之间每5分钟”. 虽然如此,跟SimpleTrigger一样,CronTrigger也需要指定startTime让调度器生效,指定endTime让调度器

[译]Quartz.NET 框架 教程(中文版)2.2.x 之第八课 调度监听器

第八课 调度监听器 调度监听器和触发监听器和触发监听器.作业任务监听器非常相似,只是调度监听器在调度器内接收通知事件,而不需要关联具体的触发器或作业任务事件. 跟调度监听器相关的事件,添加作业任务/触发器,移除作业任务/触发器,调度器发生严重错误,调度器关闭等. The ISchedulerListener Interface public interface ISchedulerListener { void JobScheduled(Trigger trigger); void JobUns

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

Quartz 框架 教程(中文版)2.2.x 之第一课 开始使用Quartz框架 Quartz 框架 教程(中文版)2.2.x 之第二课 Quartz API,Jobs和Triggers简介 Quartz 框架 教程(中文版)2.2.x 之第三课 更多关于Jobs和JobDetails Quartz 框架 教程(中文版)2.2.x 之第四课 更多关于Triggers Quartz 框架 教程(中文版)2.2.x 之第五课 SimpleTrigger Quartz 框架 教程(中文版)2.2.x

tinyshop框架教程模板开发与开发手册讲解

第一课 tiny框架的处理流程与目录结构 [录播]了解tiny框架的处理流程与目录结构(27分钟) 02 第二课 tiny框架的程序入口与url模式 [录播]tinyshop框架的程序入口与url模式(15分钟) 03 第三课 tiny框架的配置文件与配置参数讲解 [录播]tinyshop框架的配置文件与配置参数讲解(11分钟) 04 第四课 tiny框架的命名规范 [录播]tinyshop框架的命名规范(13分钟) 05 第五课 tiny框架的配置文件system.php的参数讲解 [录播]t

(译)Windsor入门教程---第五部分 添加日志功能

介绍 现在我们已经有了基础的框架了,是时候添加内容了,那么我们首先应该考虑的就是在应用程序中添加日志功能.我们会使用Windsor来配置,在这一部分,你将学习Windsor之外的其他功能. Logging Facility 在上一部分说过,Windsor有很多自带的可选的功能组件,他们扩展了Windsor的即用性.在这一部分,我们将在程序中添加日志功能. Logging Facility提供了一些常用的日志框架比如Log4net.Nlog,以及mvc内置的日志框架Trace.Logging Fa

(译)Windsor入门教程---第三部分 编写第一个Installer

简介 在第二部分我们创建了控制器工厂.现在我们要把我们的控制器交给Windsor来管理. Installer Windsor有一个专门的类installer.cs,用来向容器注册组件.在你的应用程序中至少会有几个这样的installer类,所以要保持他们的代码整洁以及可见性.接下来在我们的应用程序中新建一个专门的文件夹"Installer"来存放这些类.我们首先要注册到容器中的就是控制器,所以我们先来新建一个ControllersInstaller.cs类. Controller in