Quartz.NET - 教程 2: 作业和触发器

译者注:
目录在这 Quartz.NET 3.x 教程
原文在这 Lesson 2: Jobs And Triggers

Quartz API

Quartz API 的主要接口和类如下:

  • IScheduler - 跟调度器交互的主要应用程序接口
  • IJob - 你希望调度器执行的作业组件需要实现这个接口
  • IJobDetail - 用来定义作业
  • ITrigger - 定义指定作业的调度计划的组件
  • JobBuilder - 用来定义/构建作业详情实例,并用来定义作业实例.
  • TriggerBuilder - 用来定义/构建触发器实例

为了便于阅读以下术语可在本教程中互换使用: ISchedulerScheduler, IJobJob, IJobDetailJobDetail, ITriggerTrigger.

一个 调度器 (Scheduler) 的生命周期受其创建的限制, 通过 SchedulerFactory 和对其 Shutdown() 方法的调用. 一旦创建了 IScheduler 接口后可以使用添加, 移除, 和列出 Jobs 和 Triggers, 以及执行其他调度相关的操作 (例如暂停一个触发器). 但是, 在使用 Start() 方法启动之前 Scheduler 不会对任何触发器 (执行作业) 有实际行动, 就如 [课程1:] 中所示.

Quartz 提供了一些领域特定语言 (Domain Specific Language) (简称 DSL, 有时也被叫做 "流式接口 (fluent interface)")的 "构建器 (builder)" 类. 在上一课中你看到过一个示例, 我们在这里再次介绍其中的一部分:

// 定义作业并绑定我们的 HelloJob 类
IJobDetail job = JobBuilder.Create<HelloJob>()
    .WithIdentity("myJob", "group1") // 作业名称 "myJob", 组名 "group1"
    .Build();

// 触发作业并立刻执行, 之后每40秒执行一次
ITrigger trigger = TriggerBuilder.Create()
    .WithIdentity("myTrigger", "group1")
    .StartNow()
    .WithSimpleSchedule(x => x
        .WithIntervalInSeconds(40)
        .RepeatForever())
    .Build();

// 告诉 quartz 使用我们的触发器来调度作业
await sched.scheduleJob(job, trigger);

构建作业定义的代码块使用作业构建器 JobBuilder 的的流式接口创建了一个东东, IJobDetail. 同样的, 构建触发器的代码块使用触发器构建器 TriggerBuilder 的流式接口和一些特定类型触发器的扩展方法, 可能的调度扩展方法有:

  • WithCalendarIntervalSchedule()
  • WithCronSchedule()
  • WithDailyTimeIntervalSchedule()
  • WithSimpleSchedule()

日期构建器类 (DateBuilder) 包含各种方法以便构造特定时间点的 DateTimeOffset 实例 (例如表示下一个偶数小时的日期 - 或者说如果现在 9:43:27 那么下个偶数小时就是 10:00:00).

Jobs 和 Triggers

通常 Job 是一个实现了 IJob 接口的类, 她仅有一个简单方法:

IJob 接口

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

当作业的触发器被激活时 (稍后会更多), Execute(..) 方法会被调度器的某个工作线程调用. 传递给这个方法的参数 JobExecutionContext 对象向作业实例提供其 "运行时" 环境的相关信息 - 执行其的 Scheduler 的句柄, 触发其执行的触发器的句柄, 作业的 JobDetail 对象, 以及一些其他项.

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

Trigger 对象被用来触发作业的执行 (或 "激发"). 当你希望调度一个作业时, 你需要实例化一个触发器并 '调优' 其属性来提供你想要的调度. Quartz 附带了几种不同的触发器类型, 但最常用的类型是 SimpleTrigger (接口是 ISimpleTrigger) 和 CronTrigger (接口是 ICronTrigger).

SimpleTrigger 适用于如果需要 '一次性' 的执行 (在给定的时间内只执行一次), 或者如果你需要在给定的时间触发一个作业, 并让其重复 N 次, 执行之间的延迟为 T. CronTrigger 更适用于如果你希望基于类似日历调度 - 例如 "每周五, 中午" 或 "每月10日 10:15".

为什么是 Jobs 和 Triggers? 许多其他调度器对作业和触发器没有单独的概念. 一些只是简单的把 'job' 定义为执行时间 (或调度) 以及一些小的作业标识符. 另一些更像是 Quartz 里的作业和触发器的混合体. 在开发 Quartz 的过程中, 我们决定制造概念来分离调度和该调度下执行的工作, 这样会有 (我们觉得) 很多好处.

例如, Jobs 可以独立于触发器在作业调度器中被创建和被存储, 并且多个触发器可以关联同一个作业. 这种松耦合的另一个好处是能够在相关联的触发器过期后依旧保留在调度器中配置的作业, 以便以后可以重新调度这些作业, 而不需要重新定义她们. 她还允许你修改和替换触发器而不必重新定义相关联的作业.

Identities

JobsTriggers 注册到 Quartz 调度器时会被赋予标识键, 通过JobsTriggers 的标识键 (也就是JobKeyTriggerKey) 可以将她们放置到不同的 '分组'中这对于将你的作业和触发器组织为形如 "reporting jobs" 和 "maintenance jobs" 等类别分组很有帮助. 在同一个分组内作业和触发器的标识键名称必须是唯一的

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

现在你大致了解了什么是 JobsTriggers, 你可以在 教程 3: 教程 4: 中更多的了解她们.

posted @ 2019-03-11 18:02  taadis  阅读(1164)  评论(0编辑  收藏  举报