Quartz API

Quartz API 的关键接口和类有:

  • IScheduler - 与调度程序交互的主要 API。
  • IJob - 由您希望由调度程序执行的组件实现的接口。
  • IJobDetail - 用于定义作业的实例。
  • ITrigger - 定义执行给定作业的时间表的组件,作业可以有多个关联的触发器
  • JobBuilder - 用于定义/构建 JobDetail 实例,这些实例定义了 Jobs 的实例。
  • TriggerBuilder - 用于定义/构建触发器实例。
  • SchedulerBuilder - 用于定义/构建调度程序实例,需要 Quartz 3.1 或更高版本。

在本教程中,为了便于阅读,以下术语可互换使用:ISchedulerSchedulerIJobJobIJobDetailJobDetailITTriggerTrigger

Scheduler 的生命周期受其创建的限制,通过 SchedulerFactory 和对其 Shutdown() 方法的调用。一旦创建了 IScheduler 接口,就可以使用添加、删除和列出作业和触发器,并执行其他与调度相关的操作(例如暂停触发器)。但是,调度程序在使用 Start() 方法启动之前不会实际操作任何触发器(执行作业),如第 1 课所示。

Quartz 提供了定义领域特定语言(或 DSL,有时也称为“流利接口”)的“构建器”类。在上一课中,您看到了它的一个示例,我们在这里再次展示其中的一部分:

  1. // define the job and tie it to our HelloJob class
  2. IJobDetail job = JobBuilder.Create<HelloJob>()
  3. .WithIdentity("myJob", "group1") // name "myJob", group "group1"
  4. .Build();
  5. // Trigger the job to run now, and then every 40 seconds
  6. ITrigger trigger = TriggerBuilder.Create()
  7. .WithIdentity("myTrigger", "group1")
  8. .StartNow()
  9. .WithSimpleSchedule(x => x
  10. .WithIntervalInSeconds(40)
  11. .RepeatForever())
  12. .Build();
  13. // Tell quartz to schedule the job using our trigger
  14. await sched.scheduleJob(job, trigger);

构建作业定义的代码块使用 JobBuilder 使用流利的接口来创建产品 IJobDetail。 同样,构建触发器的代码块使用 TriggerBuilder 的流畅接口和特定于给定触发器类型的扩展方法。 可能的调度扩展方法有:

  • WithCalendarIntervalSchedule
  • WithCronSchedule
  • WithDailyTimeIntervalSchedule
  • WithSimpleSchedule

DateBuilder 类型包含各种方法,用于轻松地为特定时间点构造 DateTimeOffset 实例(例如表示下一个偶数小时的日期 - 或者换句话说,如果当前是 9:43:27,则为 10:00:00)。

作业和监听器

作业是实现 IJob 接口的类,它只有一个简单的方法:

  1. namespace Quartz
  2. {
  3. public interface IJob
  4. {
  5. Task Execute(JobExecutionContext context);
  6. }
  7. }

当 Job 的触发器触发时(稍后会详细介绍),调度程序的一个工作线程调用 Execute(..) 方法。传递给此方法的 JobExecutionContext 对象为作业实例提供有关其“运行时”环境的信息 —— 执行它的调度程序的句柄、触发执行的触发器的句柄、作业的 JobDetail 对象和其他几项。

JobDetail 对象由 Quartz.NET 客户端(您的程序)在 Job 添加到调度程序时创建。它包含 Job 的各种属性设置,以及 JobDataMap,可用于存储作业类的给定实例的状态信息。它本质上是作业实例的定义,将在下一课中进一步详细讨论。

触发器对象用于触发作业的执行(或“firing”)。当您希望安排作业时,您可以实例化一个触发器并“调整”它的属性以提供您希望的安排。触发器也可能有一个与之关联的 JobDataMap - 这对于将参数传递给特定于触发器触发的 Job 很有用。 Quartz 附带了一些不同的触发器类型,但最常用的类型是 SimpleTrigger(接口 ISimpleTrigger)和 CronTrigger(接口 ICronTrigger)。

如果您需要“一次性”执行(仅在给定时间单次执行作业),或者如果您需要在给定时间触发作业并延迟重复 N 次,SimpleTrigger 非常方便执行之间的 T。如果您希望基于类似日历的时间表(例如“每周五中午”或“每月第 10 天 10:15”)触发,CronTrigger 非常有用。

为什么工作和触发器?许多作业调度程序没有单独的作业和触发器概念。有些人将“作业”简单地定义为执行时间(或计划)以及一些小的作业标识符。其他的很像 Quartz 的工作和触发对象的结合。在开发 Quartz 时,我们认为将时间表与要在该时间表上执行的工作分开是有意义的。这(在我们看来)有很多好处。

例如,作业可以独立于触发器创建和存储在作业调度程序中,并且许多触发器可以与同一个作业相关联。这种松耦合的另一个好处是能够配置在关联触发器过期后保留在调度程序中的作业,以便以后可以重新调度它,而无需重新定义它。它还允许您修改或替换触发器,而无需重新定义其关联作业。

标识

作业和触发器在注册到 Quartz 调度程序时被赋予识别键。 Jobs 和 Triggers 的键(JobKey 和 TriggerKey)允许将它们放入“组”中,这对于将作业和触发器组织到诸如“报告作业”和“维护作业”之类的类别中很有用。 作业或触发器的键的名称部分在组内必须是唯一的

  • 或者换句话说,作业或触发器的完整键(或标识符)是名称和组的组合。

您现在对什么是 Jobs 和 Triggers 有了一个大致的了解,您可以在 第 3 课:关于 Jobs 和 JobDetails 的更多信息第 4 课:关于触发器的更多信息 中了解更多信息