Quartz 作业(Jobs)与触发器(Triggers)

作业触发器 将成为您使用 Quartz 库时的核心工具。

作业

作业是一个实现了 IJob 接口的类,该接口仅有一个简单的方法:

namespace Quartz
{
    public interface IJob
    {
        Task Execute(JobExecutionContext context);
    }
}

当作业的触发器触发时(稍后详细介绍),调度器的一个工作线程将调用 Execute(..) 方法。传递给此方法的 JobExecutionContext 对象为作业实例提供了关于其“运行时”环境的信息,包括执行它的 IScheduler 的句柄、触发执行的触发器的句柄、作业的 IJobDetail 对象以及一些其他项目。

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

触发器

触发器用于触发作业的执行(或“触发”)。当您希望调度作业时,您会实例化一个触发器并使用其属性来配置所需的调度。触发器也可能关联一个 JobDataMap ——这对于向作业传递特定于触发器触发的参数非常有用。Quartz 提供了几种不同类型的触发器,但最常用的类型是简单触发器(接口 ISimpleTrigger)和 cron 触发器(接口 ICronTrigger)。

SimpleTrigger 在需要“一次性”执行(仅在给定时间点单次执行作业)或需要在给定时间触发作业,并重复 N 次,每次执行之间延迟 T 时间的情况下非常方便。这应该类似于.NET 的 Timer 类。

var example = TriggerBuilder.Create()
    .WithIdentity("trigger-name", "trigger-group")
    .ForJob("job-name", "job-group")
    .WithSimpleSchedule(o =>
    {
        o.WithRepeatCount(5)
            .WithInterval(TimeSpan.FromMinutes(5));
    })
    .Build();

CronTrigger 如果您希望基于类似日历的调度来触发作业,例如“每周五中午”或“每月 10 号的 10:15”,则非常有用。您可以使用Cron Maker来探索语法。

var example = TriggerBuilder.Create()
    .WithIdentity("trigger-name", "trigger-group")
    .ForJob("job-name", "job-group")
    .WithCronSchedule("45 23 * * 6")
    .Build();

为何区分作业和触发器?

许多作业调度器没有作业和触发器的独立概念。有些将“作业”简单定义为执行时间(或调度)加上一些小的作业标识符。其他的则很像 Quartz 的作业和触发器对象的联合体。在开发 Quartz 时,我们决定在调度和要按照该调度执行的工作之间创建分离是有意义的。我们认为,这有许多好处。

例如,作业可以在不依赖触发器的情况下创建并存储在作业调度器中,而且多个触发器可以与同一个作业关联。这种松耦合的另一个好处是可以配置在关联触发器过期后仍保留在调度器中的作业,以便稍后重新调度,而无需重新定义。它还允许您在不重新定义其关联作业的情况下修改或替换触发器。

标识

作业和触发器在注册到 Quartz 调度器时被赋予标识键。作业和触发器的键(JobKeyTriggerKey)使它们能够被放入“组”中,这对于将您的作业和触发器组织成类别(如“报告作业”和“维护作业”)很有用。作业或触发器键的名称部分在其组内必须唯一。作业或触发器的完整键(或标识符)是名称和组的组合。

现在您对作业和触发器有了一个大概的了解,您可以在 第 4 课:更多关于作业与 JobDetails第 5 课:更多关于触发器 中学习更多关于它们的信息。

在本文档中