Quartz.Net - Lesson2: 任务和触发器
Lesson 2: 任务和触发器
本系列文章是官方3.x文档的翻译,原文地址:https://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/index.html
目录:
Lesson 1: 使用Quartz
Lesson 2: 任务和触发器
Lesson 3: Jobs & JobDetails详细介绍
Lesson 4: Triggers详细介绍
Quartz API
Quartz API的主要接口和类如下:
- IScheduler - 和调度器交互的主要API
- IJob - 调度器会执行实现这个接口的实例
- IJobDetail - 用来定义任务的实例
- ITrigger - 定义任务执行安排的组件
- JobBuilder - 用来定义/构造JobDetail的实例,其中JobDetail的实例定义Jobs的实例
- TriggerBuilder - 用来定义/构造Trigger的实例
在本文中,为了可读性,下列说法可互换: IScheduler 和 Scheduler, IJob 和 Job, IJobDetail 和 JobDetail, ITrigger 和 Trigger.
一个调度器的生命周期,从通过SchedulerFactory创建开始,到调用它的Shutdown()方法结束。一个IScheduler实现后,可以使用添加、删除、列出任务和触发器,或者其他调度相关的操作(例如暂停一个触发器)。然而,如Lesson 1里讲到的,一个调度器不会真正触发任务触发器(执行任务)直到调用 Start()方法启动它。
Quartz提供定义为领域特定语言(DSL,有时称为“流接口(fluent interface)”)的“构建者(builder)”类。在上一课中,你看到了它的一个例子,在这里我们再看其中一部分。
// 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
await sched.scheduleJob(job, trigger);
这段代码中,使用JobBuilder定义job时,使用了流接口去构建IJobDetail。同样,使用TriggerBuilder定义trigger时,使用了流接口和返回trigger类型的扩展方法。可用的的调度扩展方法有:
- WithCalendarIntervalSchedule
- WithCronSchedule
- WithDailyTimeIntervalSchedule
- WithSimpleSchedule
DateBuilder 类提供了多种方法以便于构造 DateTimeOffset 实例来指定特定时间点(例如,指定为下个小时的时间 - 换句话说,如果现在是9:43:27,指定的时间就是10:00:00)。
Jobs and Triggers
任务是一个实现了IJob接口的类,它只有一个简单的方法。
IJob 接口
namespace Quartz
{
public interface IJob
{
Task Execute(JobExecutionContext context);
}
}
当任务的触发器触发时,调度器的其中一个工作线程会调用Execute(..)方法。传递给这个方法的JobExecutionContext对象提供了包含它的“运行时(run-time)”环境信息的job实例,这些信息包括访问执行它的调度器的句柄,触发这个操作的触发器的句柄,任务的JobDetail对象,和一些其他信息。
JobDetail对象是 Quartz.NET 客户(client)(你的程序)把任务加入到调度器时产生的。它包括了多种Job的属性,而且提供了JobDataMap,它可以为job类的实例存储状态信息。这就是job实例的本质,下一节中会更详细的介绍。
触发器对象用来触发任务的执行。当你想调度一个任务时,应实例化一个触发器并“调整”它的属性以满足你希望的调度安排。触发器还可以拥有与其关联的JobDataMap对象,这对传递参数给任务是非常有用的。Quartz提供了几种不同类型的触发器,但应用最多的是SimpleTrigger(ISimpleTrigger接口)和CronTrigger(ICronTrigger接口)。
如果你需要“一次性”操作(在指定时间只进行一次操作),或者在指定时间进行一次任务,并在延迟时间执行N次,那么用SimpleTrigger是非常方便的。如果你触发任务基于像日历一样的计划,例如“每周五,中午”或“每月10号10:15”,那么CronTrigger是非常有用的。
为什么分开用任务和触发器?许多任务调度器里没有分开的任务和触发器的概念。其中一些简单定义一个“任务”为有简单任务标志符的一个执行时间(计划),其他的很像Quartz的任务和触发器综合到一起的概念。开发Quartz时,我们决定把计划和在计划中进行的工作分开是非常有意义的。这有很多好处(我们觉得)。
例如,任务可以独立于触发器,创建并存储在任务计划中,并且多个触发器可以与同一个任务关联。另一个低耦合的好处是,可以配置那些关联的触发器已经过期,但仍然在调度器里的任务,这使得之后不用重新定义就可以再次调度它。这同样允许你修改或替换一个触发器,而不用重新定义与它关联的任务。
Identities
任务和触发器在注册到Quartz调度器时可以给定标识键。任务和触发器的键(JobKey and TriggerKey)使得它们可以分组,方便分类规划你的任务和触发器,例如“报告任务”和“维护任务”。在同一组内任务和触发器的名称(name)属性必须是唯一的。话句话说,任务和触发器的完整键(标识),即名称(name)和组(group)的组合是惟一的。
你现在对任务和触发器是什么有了一个总体的认识,你可以在Lesson 3: Jobs & JobDetails详细介绍和Lesson 4: Triggers详细介绍里学到更多。
Quartz.Net - Lesson2: 任务和触发器的更多相关文章
- Quartz(自动任务)中的触发器Trigger
1.Quartz中的触发器TriggerJob 包含了要执行任务的逻辑,但是 Job 对何时该执行却一无所知.这个事情留给了 Trigger.Quartz Trigger 继承了抽象的 org.qua ...
- Quartz.NET - 课程 6: Cron 触发器
译者注: 目录在这 [译]Quartz.NET 3.x 教程 原文在这 Lesson 6: CronTrigger 如果你需要一个类似日历概念而不是像 SimpleTrigger 那样指定间隔来调度作 ...
- Quartz.NET - 教程 5: 简单触发器
译者注: 目录在这 Quartz.NET 3.x 教程 原文在这 Lesson 5: SimpleTrigger 如果你需要在特定的时间点执行一次作业, 或者在特定的时间点执行一次作业, 然后在特定的 ...
- Quartz.NET学习笔记(三) 简单触发器
触发器是Quartz.NET的另外第一个核心元素,他有2种类型,简单触发器(Simple Trigger)和计划任务触发器(Cron Trigger), 一个触发器可以绑定一个任务. 通用触发器属性 ...
- (5)Quartz学习
原文:http://blog.csdn.net/zxl315/article/details/10879927 介绍Quartz Quartz是一个开源的任务调度系统,它能用来调度很多任务的执行. 运 ...
- Quartz.NET学习系列
Quartz.NET它是一个开源的任务调度引擎,对于周期性任务,持久性任务提供了很好的支持,并且支持持久性.集群等功能. 这是什么对我来说Quartz.NET学习记录: 源代码下载http://yun ...
- spring quartz开发中使用demo
1.首先在pom.xml中配置quartz的jar: <!--定时器--> <dependency> <groupId>org.quartz-scheduler&l ...
- spring boot1.0 集成quartz 动态配置定时任务
转载自 https://www.imooc.com/article/36278 一.Quartz简介了解 Quartz Quartz 是一个完全由 Java 编写的开源作业调度框架,为在 Java 应 ...
- quartz详解2:quartz由浅入深
http://blog.itpub.net/11627468/viewspace-1763498/ 一.quartz核心概念 先来看一张图: scheduler 任务调度器 trigger 触 ...
随机推荐
- CodeChef February Challenge 2018 Broken Clock (三角函数推导 + 矩阵快速幂)
题目链接 Broken Clock 中文题面链接 令$cos(xα) = f(x)$ 根据三角函数变换公式有 $f(x) = \frac{2d}{l} f(x-1) - f(x-2)$ 我们现在 ...
- HDU 1074 Doing Homework(状压DP)
第一次写博客ORZ…… http://acm.split.hdu.edu.cn/showproblem.php?pid=1074 http://acm.hdu.edu.cn/showproblem.p ...
- Unity防破解 —— 加密Dll与Key保护
在阅读这篇文章之前,我在处理mono加密问题时,也是参考了雨凇的文章,所以建议先看一下雨凇写的关于加密Dll的文章: 1.Unity3D研究院之Android加密DLL与破解DLL .SO 2 ...
- zclip笔记:解决zclip失效问题
在一个子页面里想实现一键复制到剪贴版的功能,使用zclip插件,用jquery的方式实现时出现了诡异问题.复制功能平时正常,当页面中所列的内容过多时,一键复制的功能失效. 这个问题相当不好定位,先说结 ...
- luogu P1529 回家 Bessie Come Home
题目描述 现在是晚餐时间,而母牛们在外面分散的牧场中. 农民约翰按响了电铃,所以她们开始向谷仓走去. 你的工作是要指出哪只母牛会最先到达谷仓(在给出的测试数据中,总会有且只有一只最快的母牛). 在挤奶 ...
- 【BZOJ2276】Temperature
题面 Description The Byteotian Institute of Meteorology (BIM) measures the air temperature daily. The ...
- bzoj 4338: BJOI2015 糖果
4338: BJOI2015 糖果 Time Limit: 2 Sec Memory Limit: 256 MBSubmit: 200 Solved: 93[Submit][Status][Dis ...
- C语言基础之自增自减运算符及注意事项
1.具体用法 1: int b; 2: int a = 10; 3: // b = 10 + 12; 4: //b = (a++) + (++a); 5: 6: // b = 11 + 11; 7: ...
- Android kernel Crash后,定位出错点的方法
转载:http://blog.csdn.net/wlwl0071986/article/details/11635749 1. 将/prebuild/gcc/linux-x86/arm/arm-lin ...
- 玩转shell之符号篇
转:http://hi.baidu.com/hellosimple/item/21b31dfefd23e811e2e3bd47 在shell中常用的特殊符号罗列如下: # ; ;; . , / \\ ...