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 触 ...
随机推荐
- java数组集合
一.ArrayList 1. ArrayList底层采用数组实现,当使用不带参数的构造方法生成ArrayList对象时,实际上会在底层生成一个长度为10的Object类型数组2. 如果增加的元素个数超 ...
- Web/JAVA 简单题目汇总
[Java标识符,变量.常量] 一.Java合法标识符命名规则 (1)区分字母大小写,标识符长度不限 (2) 英文,Unicode码双字节文字字符(日文,韩文,中文),数字,下划线,$(美元符号)均 ...
- frp -- proxy name [ssh] is already in use
- zoj 3430 Detect the Virus(AC自己主动机)
题目连接:zoj 3430 Detect the Virus 题目大意:给定一个编码完的串,将每个字符相应着表的数值转换成6位二进制.然后以8为一个数值,又一次形成字符 串,推断给定询问串是否含有字符 ...
- 记一次有惊无险的Linux数据恢复过程
问题阶段 起因: 昨天晚上思路不是很清晰(上了一天班回来有点蒙),还是强忍着疲惫想搞事情,结果悲剧了… … 本来想拿SD卡做一张linux烧录卡,烧录脚本是很久以前写的,有git记录,一直不成功,就回 ...
- 关于hibernate中映射中有many to one等外键关联时的问题
hibernate中的对象的3种状态的理解及导致报错object references an unsaved transient instance - save the transient insta ...
- 10 种机器学习算法的要点(附 Python)(转载)
一.前言 谷歌董事长施密特曾说过:虽然谷歌的无人驾驶汽车和机器人受到了许多媒体关注,但是这家公司真正的未来在于机器学习,一种让计算机更聪明.更个性化的技术 也许我们生活在人类历史上最关键的时期:从使用 ...
- idea 搭建spring boot
打开IntelliJ IDEA,在菜单栏选择File菜单-->New-->Project...-->Spring Initializr,Project SDK即选择JDK的版本,Ch ...
- Python连接mongodb提取部分字段内数据并写入txt文件
#coding=utf-8 import sys reload(sys) sys.setdefaultencoding('utf-8') from pymongo import MongoClient ...
- easyui datagrid 批量编辑和提交数据
easyui datagrid 行编辑和提交方,废话就不多说了,直接上代码 <div style="margin: 5px;"> <table id=" ...