The key interfaces and classes of the Quartz API are:
Quartz API 的主要接口和类如下:
在本教程中,以下概念可以替换使用: IScheduler 和 Scheduler, IJob 和 Job, IJobDetail 和 JobDetail, ITrigger 和 Trigger.
一个 Scheduler 实例的生命周期从 SchedulerFactory 构建出它的实例开始到它调用 Shutdown() 方法结束. 一旦被创建,这个实例就可以用来进行 add, remove, 以及 list Jobs 和 Triggers 等操作, 或者执行其他和调度相关的动作 (例如暂停 trigger). 不过, 它实际上不会执行任何 triggers (运行 jobs) 直到它调用了 Start() 方法来启动自己, 参考 Lesson 1.
Quartz 提供了 "builder" 来定义一个 Domain Specific Language ( DSL, 有时也叫流式接口 "fluent interface"). 在上节课中有过一个例子, 我们在下面再列出一部分:
// define the job and tie it to our HelloJob class
IJobDetail job = JobBuilder.Create<HelloJob>()
.WithIdentity("myJob", "group1") // name "myJob", group "group1"
.Build();
// Trigger the job to run now, and then every 40 seconds
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("myTrigger", "group1")
.StartNow()
.WithSimpleSchedule(x => x
.WithIntervalInSeconds(40)
.RepeatForever())
.Build();
// Tell quartz to schedule the job using our trigger
sched.scheduleJob(job, trigger);
这段代码通过流式接口,使用 JobBuilder 来 build job 实例 同样的,通过流式接口,使用 TriggerBuilder 的扩展方法来 build 指定类型的 trigger. schedule 可用的扩展方法有:
DateBuilder 有一系列方法来轻松地为特定的时间点来构造 DateTimeOffset 实例 (例如下一个偶数整点时间 - 比如 10:00:00 如果当前时间是 9:43:27).
Job 是实现了 IJob 的类, 接口只有一个简单的方法:
IJob 接口
namespace Quartz
{
public interface IJob
{
void Execute(JobExecutionContext context);
}
}
当 Job 的 trigger 触发的时候, Execute(..) 方法就会在 scheduler 的工作线程中执行. JobExecutionContext 作为参数传递给这个方法,它提供了 job 实例以及 job 允许时的环境信息- 一个指向执行该 job 的 Scheduler 的句柄, 一个指向触发该方法的 trigger 的句柄, 这个 job 的 JobDetail 对象, 以及另外一些数据项.
JobDetail 对象在 job 被加入 scheduler 时由 Quartz.NET client 构建 (也就是你的程序) . 它包含了 job 的各种设置信息, 包括 JobDataMap, 用来保存一个 job 实例的状态信息. 它是这个 job 实例的最完整的定义, 在接下来的课程中会深入讨论.
Trigger 用于触发 job 的执行. 如果你希望调度 job, 你需要初始化 trigger 调整它的属性值来设置调度方式. Triggers 可能会有 JobDataMap 与之相关联 - 这样可以在某一个特定的触发动作发生时,给 Job传递参数. Quartz 提供了一些不同的 trigger 类型, 最常用的有以下几种 SimpleTrigger (interface ISimpleTrigger) 和 CronTrigger (interface ICronTrigger).
如果你需要“执行且仅执行一次”的动作,那么 SimpleTrigger 能满足你 (只在某个特定的时间执行一次某 job), 或者你需要在一个特定的时间触发该 job, 然后重复这个 job N 次, 每次重复时间间隔 T . CronTrigger 在你要用到类似日历调度时很有用 - 比如 "每周五, 中午" 或者 "每个月第十天的 10:15 ."
Why Jobs AND Triggers? 许多任务调度器没有把 jobs 和 triggers 区分开来. 有一些只是把 'job' 简单的定义为一次执行,或者和一些小的 job 识别器一起调度的任务. 其他的更像是 job 和 trigger 的混合. 在开发 Quartz 时, 我们觉得把 schedule 和 job 的概念分离是比较合理的. 这样会有很多好处.
比如, Jobs 可以在不关心 trigger 的情况下构建并保存在 schedule 里面, 然后很多不同的 triggers 都可以关联到这个 job. 这种低耦合设计的另一个好处是提供了在所有 trigger 过期的情况下,配置 scheduler 中剩余的 jobs 的能力, 这样它就可以被重新调度, 而不需要重新定义一个一模一样的 job. 另外它也允许你重新定义或者修改 trigger 而不需要去定义新的 job.
在把 Jobs 和 Triggers 注册到 Quartz scheduler 是, 他们被赋予了唯一键值. JobKey 和 TriggerKey 可以帮我们对 job 和 trigger 进行分组. 这样你就可以给 jobs 按照类似 "reporting jobs" 和 "maintenance jobs" 这样的分组来组织. 在一个组里面 jobkey 或者 triggerkey 必须是唯一的, 完整的键值是键名加上组名.
现在,你对 Jobs 和 Triggers 有一个大概的了解, 接下来你可以继续学习 Lesson 3: More About Jobs & JobDetails 和 Lesson 4: More About Triggers
« Lesson 1 | Lesson 3 »原文