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

原文

时间: 2024-08-09 15:07:37

Quartz.NET c# 教程 - 课程二:Jobs 和 Triggers的相关文章

solr与.net系列课程(二)solr的配置文件及其含义

 solr与.net系列课程(二)solr的配置文件及其含义  本节内容还是不会涉及到.net与数据库的内容,但是不要着急,这都是学时solr必学要掌握的东西,solr可不是像其他的dll文件一样,只需要引用就能调出方法与数据的,你不配置好是无法使用,前两节主要是起铺垫作用的,看起来会很枯燥无味的. 本章节内容是为下一节连接数据库做准备的,单拿出来看的话,会让人很迷糊,没关系,就当提前预习了,知道有这么个东西就行了,等下一节结合数据库后就好理解了 上一节我们已经完成了solr的基本配置,这里我们

SpringCloud 教程 之二 服务发现(Eureka Discovery Client + Ribbon)

1.启动服务注册中心 可参考 SpringCloud 教程 之一 服务注册中心及服务注册(Eureka Server + Eureka Client) 第1节 创建[服务注册中心]工程,即 Eureka Server.创建并运行工程. 2.创建服务提供者工程 2.1.新建Spring Boot 工程 springcloud-eureka-provider 2.2.工程pom.xml文件添加如下依赖: <dependency> <groupId>org.springframework

Windows server 2012 搭建VPN图文教程(二)配置路由和远程访问服务

Windows server 2012 搭建VPN图文教程(一)安装VPN相关服务 Windows server 2012 搭建VPN图文教程(二)配置路由和远程访问服务 Windows server 2012 搭建VPN图文教程(三)配置VPN访问账户 Windows server 2012 搭建VPN图文教程(四)客户端访问VPN测试 PartII 配置路由和远程访问服务 本部分主要介绍如何安装和配置路由及远程访问服务的方法,请参考以下操作步骤: (续上)前面提到重新启动操作系统,重启后服务

Docker入门教程(二)命令

Docker入门教程(二)命令 [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第二篇,介绍了Docker的基本命令以及命令的用法和功能. 在Docker系列教程的第一篇文章中,我们了解了Docker的基础知识,知道了它是如何工作以及如何安装的.在这篇文章中,我们将学习15个Docker命令,并通过实践来学习它是如何工作的. 首先,让我们通过下面的命令来检查Docker的安装是否正确: docker info  如果没有找到这条命令,则表示Docke

【COCOS CREATOR 系列教程之二】脚本开发篇&事件监听、常用函数等示例整合

[Cocos Creator ](千人群):  432818031 上一篇,介绍了Himi在使用过cc所有组件后的一篇总结,没有具体介绍每个组件的原因在于官方文档很齐全,而且也有视频的介绍. 所以希望童鞋们可以把我这两篇博文当成对组件.脚本两部分开发的整理与总结. 后续的文章,Himi应该主要更新一些官方还未补充或者还没有的教程.避免无用功. 下面直接放出代码,因为不是很难理解.所以不再一一赘述,都是常用的函数.事件监听.动作回调.定时器等开发过程中必接触的. 大致内容如下: cc 属性介绍 获

微信公众平台开发教程(二) 基本原理及消息接口

微信公众平台开发教程(二) 基本原理及消息接口 一.基本原理 在开始做之前,大家可能对这个很感兴趣,但是又比较茫然.是不是很复杂?很难学啊? 其实恰恰相反,很简单.为了打消大家的顾虑,先简单介绍了微信公众平台的基本原理. 微信服务器就相当于一个转发服务器,终端(手机.Pad等)发起请求至微信服务器,微信服务器,然后将请求转发给自定义服务(这就里就是我们的具体实现). 服务处理完毕,然后挥发给微信服务器,微信服务器再将具体响应回复到终端. 通信协议为:HTTP 数据格式为:XML 具体的流程如下图

Linux平台上SQLite数据库教程(二)——C语言API介绍

Linux平台上SQLite数据库教程(二)--C语言API介绍 前言:本文将介绍几个基本的SQLite3数据库的C语言API接口,主要用到两个文件:sqlite3.c.sqlite3.h.源码地址:https://github.com/AnSwErYWJ/SQLite. 打开数据库 1.原型: int sqlite3_open( const char* filename, /* 数据库文件名, 必须为 UTF-8 格式 */ sqlite3** ppDB /* 输出: SQLite 数据库句柄

JSP 简明教程(二):JSP基本语法

基本语法 JSP只是在html的基础上嵌入一些动态的元素.下面是HelloWorld代码: <html> <% out.println("hello world"); %> </html> 以上代码中的<% %>就是动态元素.JSP中所有的特殊语法如下: <% %>:用于表示一段Java代码.这段代码在编译之后会放在_jspService()方法中. <%! %>:多了一个叹号,也用于表示一段Java代码,但是这段

【REACT NATIVE 系列教程之二】创建自定义组件&&导入与使用示例

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/react-native/2219.html 在上一篇  [REACT NATIVE 系列教程之一]触摸事件的两种形式与四种TOUCHABLE组件详解 中的最后介绍了如何使用Touchable的四种组件进行监听触摸事件.  那么紧接着我们利用Touchable来包装一个带图片的Button组件,且设计成可接受很多自定义参数. 一:创建我们自定义