Quartz.NET c# 教程 - 课程二:Jobs 和 Triggers

Quartz API

The key interfaces and classes of the Quartz API are:

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

  • IScheduler - 和 Scheduler 交互的主要接口.
  • IJob - 自定义的执行模块所要继承的接口, scheduler 会调用这个实现该接口的模块.
  • IJobDetail - 用来定义 Job 实例.
  • ITrigger - 用来定义 schedule 的模块, 根据该模块中的 schedule 来决定哪个 job 应该执行.
  • JobBuilder - 用来构建 JobDetail 实例.
  • TriggerBuilder - 用来构建 Trigger 实例.

在本教程中,以下概念可以替换使用: 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 可用的扩展方法有:

  • WithCalendarIntervalSchedule
  • WithCronSchedule
  • WithDailyTimeIntervalSchedule
  • WithSimpleSchedule

DateBuilder 有一系列方法来轻松地为特定的时间点来构造 DateTimeOffset 实例 (例如下一个偶数整点时间 - 比如 10:00:00 如果当前时间是 9:43:27).

Jobs 和 Triggers

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.

Identities

在把 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 »

原文

你可能感兴趣的:(C#系列,quartz,jobs,schedule,c#)