第二课:QuartzAPI,Jobs和Triggers简介

Quartz API

Quartz API 关键的几个接口:

Scheduler:跟任务调度相关的最主要的API接口。

Job:你期望任务调度执行的组件定义(调度器执行的内容),都必须实现该接口。

JobDetail:用来定义Job的实例。

Trigger:定义一个指定的Job何时被执行的组件,也叫触发器。

JobBuilder:用来定义或创建JobDetail的实例,JobDetail限定了只能是Job的实例。

TriggerBuilder:用来定义或创建触发器的实例。

调度器的生命周期,起始于SchedulerFactory的创建,终止于调用shutdown方法。当调度器接口实例创建完成后,就可以添加,删除和查询Jobs和Triggers对象,也可以执行其它的跟调度器相关的操作,比如中止触发器的触发。并且,调度器在调用start方法之前,不会触发任何一个触发器去执行作业任务,如第一课所示的例子。

Quartz框架提供许多构造器类来定义一套领域特定语言,简称DSL,有时候也称为“流接口”。在上一课中我们看到的示例,现在重新展示一部分代码如下:

    // 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()
.RepeatForever())
.Build(); // Tell quartz to schedule the job using our trigger
sched.scheduleJob(job, trigger);

上面的代码,使用JoBuilder创建了IJobDetail对象,同样,TriggerBuilder创建了ITrigger对象。IJobDetail:定义工作的使用,ITrigger:定义触发器。

其他的扩展方法:

WithCalendarIntervalSchedule
        WithCronSchedule
        WithDailyTimeIntervalSchedule
        WithSimpleSchedule

功能各样的Schedule类提供多种方法来定义不同类型的调度器。

DateBuilder类包含了许多方法可以更简捷地构建Date实例对象,尤其针对特定的时间点,比如下一个的整点时间,换言之现在是9:43:27,我需要得到10:00:00的时间对象。

Jobs和Triggers

作业任务类实现Job接口,只有一个方法

IJob接口

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

当作业任务的触发器被触发的那一刻,调度器的一个工作线程,将会调用该Job的execute方法。JobExecutionContext对象会向execute方法传递运行时环境的工作任务信息:执行该方法的调度器引用,触发该方法执行的触发器引用,Job实例的JobDetail对象,以及一些其它信息。

当调度器添加Job实例时,会在Quartz客户端程序中(咱们自己开发的代码)创建JobDetail对象。JobDetail为Job实例提供了许多设置属性,以及JobDataMap成员变量属性,它用来存储特定Job实例的状态信息。这是从本质上定义Job实例,我们将会在下一节中深入地讨论相关的细节。

触发器对象用来触发Job对象的执行,当你希望调度一项作业任务,你可以实例化一个触发器并且将触发时间属性调整为你期望的时间表。触发器也可以关联JobDataMap对象,可以非常方便地将具体的被触发的触发器当作参数传递给Job实例。

Quartz框架附带少数不同类型的触发器,但最常用的类型是SimpleTrigger和CronTrigger。

SimpleTrigger适用于一次性的任务执行(在给定的时间段只执行一次的作业任务),或者你需要在指定时间多次触发作业任务,每次触发都延迟固定的时间。CronTrigger适用于基于类似日历时间表的触发,比如“每个周五的下午”或是“每月10号的10:15”。

为什么要分别定义作业任务和触发器?许多作业调度并没有区分作业任务和触发器的概念。有些框架把作业任务简单定义成执行时间(或计划)以及一些小作业标识符,其他框架更像是整合了Quartz框架的作业和触发器对象。因此我们设计Quartz时,我们决定构建调度器时拆分开调度和任务是有意义的,在我看来,这样做还是有许多好处。

例如,作业任务可以独立于触发器在作业调度中创建和存储,多个触发器可以关联到相同的作业任务中。另一个好处是在作业任务关联的触发器失效后,仍然能够在调度器上松耦合地配置作业任务,因此该作业不需要重新定义,一段时间后能够重新调度。它还允许你在不重新实例化关联的作业任务下修改和替换触发器。

Identites(标识符)
        作业任务和触发器被注册到Quartz调度器时需要提供标识信息。这种标识信息(也称作作业任务键和触发器键)允许作业任务和触发器按组存放,这样可以很方便地将你的作业任务和触发器分组,比如分为“报表类Job”和“维护类Job”。作业任务和触发器的键的名称部分在同一个组内必须唯一,换句话说,作业任务和触发器的键(或标识符)的名字是由键名和组名共同组成的。

现在你对作业任务和触发器有一个大概的了解了,你可以在“第三课 更多关于Jobs和JobDetails”和“第四课 更多关于Triggers”学到更多关于它们的知识。

最新文章

  1. 设计模式之行为类模式大PK
  2. 通过Zabbix API实现对主机的增加(无主机资产的添加和带主机资产的添加)、删除、获取主机id、获取模板id、获取组id
  3. Redis for .NET 系列之实现分页需求
  4. Android系列之Fragment(四)----ListFragment的使用
  5. setTimeout延时0毫秒的作用和问题
  6. Unity3D GUI学习之GUILayout控件及使用
  7. Qt颜色下拉框
  8. c++运行时函数
  9. NFS常见问题
  10. 【UVA10140】Prime Distance
  11. 一个可以参考的JVM内存分配
  12. Spring Boot 2.0 整合 FreeMarker 模板引擎
  13. 怎样使用EOS.JS的API
  14. word2010怎么把白色方框变成黑色方框?
  15. django模型查询操作
  16. xgCalendar在ASP.NET中的使用
  17. windows本地调试安装hadoop(idea) : ERROR util.Shell: Failed to locate the winutils binary in the hadoop binary path
  18. Javascript---add to favorite | Set Homepage
  19. MyEclipse中常用的快捷键大全
  20. 【Maven学习】Nexus OSS私服仓库的安装和配置

热门文章

  1. UVALive 6912 Prime Switch 暴力枚举+贪心
  2. maven项目org.springframework.web.context.ContextLoaderListener的异常和tomcat zipexception的异常
  3. css3浏览器私有属性前缀使用详解
  4. Java进行Base64的编码(Encode)与解码(Decode)
  5. Ajax修改全局变量问题解决方法(Zepto版)
  6. Vue2.0 - 全局操作 Vue.set
  7. Jmeter介绍+安装
  8. BZOJ3637 Query on a tree VI(树链剖分+线段树)
  9. 洛谷 P2057 善意的投票(网络流最小割)
  10. NHibernate 设置主键不自增长