Quartz.NET - 教程 2: 作业和触发器
译者注:
目录在这 Quartz.NET 3.x 教程
原文在这 Lesson 2: Jobs And Triggers
Quartz API
Quartz API 的主要接口和类如下:
IScheduler- 跟调度器交互的主要应用程序接口IJob- 你希望调度器执行的作业组件需要实现这个接口IJobDetail- 用来定义作业ITrigger- 定义指定作业的调度计划的组件JobBuilder- 用来定义/构建作业详情实例,并用来定义作业实例.TriggerBuilder- 用来定义/构建触发器实例
为了便于阅读以下术语可在本教程中互换使用: IScheduler 和 Scheduler, IJob 和 Job, IJobDetail 和 JobDetail, ITrigger 和 Trigger.
一个 调度器 (Scheduler) 的生命周期受其创建的限制, 通过 SchedulerFactory 和对其 Shutdown() 方法的调用. 一旦创建了 IScheduler 接口后可以使用添加, 移除, 和列出 Jobs 和 Triggers, 以及执行其他调度相关的操作 (例如暂停一个触发器). 但是, 在使用 Start() 方法启动之前 Scheduler 不会对任何触发器 (执行作业) 有实际行动, 就如 [课程1:] 中所示.
Quartz 提供了一些领域特定语言 (Domain Specific Language) (简称 DSL, 有时也被叫做 "流式接口 (fluent interface)")的 "构建器 (builder)" 类. 在上一课中你看到过一个示例, 我们在这里再次介绍其中的一部分:
// 定义作业并绑定我们的 HelloJob 类
IJobDetail job = JobBuilder.Create<HelloJob>()
.WithIdentity("myJob", "group1") // 作业名称 "myJob", 组名 "group1"
.Build();
// 触发作业并立刻执行, 之后每40秒执行一次
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("myTrigger", "group1")
.StartNow()
.WithSimpleSchedule(x => x
.WithIntervalInSeconds(40)
.RepeatForever())
.Build();
// 告诉 quartz 使用我们的触发器来调度作业
await sched.scheduleJob(job, trigger);
构建作业定义的代码块使用作业构建器 JobBuilder 的的流式接口创建了一个东东, IJobDetail. 同样的, 构建触发器的代码块使用触发器构建器 TriggerBuilder 的流式接口和一些特定类型触发器的扩展方法, 可能的调度扩展方法有:
WithCalendarIntervalSchedule()WithCronSchedule()WithDailyTimeIntervalSchedule()WithSimpleSchedule()
日期构建器类 (DateBuilder) 包含各种方法以便构造特定时间点的 DateTimeOffset 实例 (例如表示下一个偶数小时的日期 - 或者说如果现在 9:43:27 那么下个偶数小时就是 10:00:00).
Jobs 和 Triggers
通常 Job 是一个实现了 IJob 接口的类, 她仅有一个简单方法:
IJob 接口
namespace Quartz
{
public interface IJob
{
Task Execute(JobExecutionContext context);
}
}
当作业的触发器被激活时 (稍后会更多), Execute(..) 方法会被调度器的某个工作线程调用. 传递给这个方法的参数 JobExecutionContext 对象向作业实例提供其 "运行时" 环境的相关信息 - 执行其的 Scheduler 的句柄, 触发其执行的触发器的句柄, 作业的 JobDetail 对象, 以及一些其他项.
JobDetail 对象由 Quartz.NET 客户端 (你的程序) 在将 Job 添加到调度器时创建. 她包含 Job 的各种属性设置, 以及 JobDataMap, 可用于给你的作业实例存储相关状态信息. 这本质上是作业实例的定义, 会在下一课中进一步详细讨论.
Trigger 对象被用来触发作业的执行 (或 "激发"). 当你希望调度一个作业时, 你需要实例化一个触发器并 '调优' 其属性来提供你想要的调度. Quartz 附带了几种不同的触发器类型, 但最常用的类型是 SimpleTrigger (接口是 ISimpleTrigger) 和 CronTrigger (接口是 ICronTrigger).
SimpleTrigger 适用于如果需要 '一次性' 的执行 (在给定的时间内只执行一次), 或者如果你需要在给定的时间触发一个作业, 并让其重复 N 次, 执行之间的延迟为 T. CronTrigger 更适用于如果你希望基于类似日历调度 - 例如 "每周五, 中午" 或 "每月10日 10:15".
为什么是 Jobs 和 Triggers? 许多其他调度器对作业和触发器没有单独的概念. 一些只是简单的把 'job' 定义为执行时间 (或调度) 以及一些小的作业标识符. 另一些更像是 Quartz 里的作业和触发器的混合体. 在开发 Quartz 的过程中, 我们决定制造概念来分离调度和该调度下执行的工作, 这样会有 (我们觉得) 很多好处.
例如, Jobs 可以独立于触发器在作业调度器中被创建和被存储, 并且多个触发器可以关联同一个作业. 这种松耦合的另一个好处是能够在相关联的触发器过期后依旧保留在调度器中配置的作业, 以便以后可以重新调度这些作业, 而不需要重新定义她们. 她还允许你修改和替换触发器而不必重新定义相关联的作业.
Identities
Jobs 和 Triggers 注册到 Quartz 调度器时会被赋予标识键, 通过Jobs 和 Triggers 的标识键 (也就是JobKey 和 TriggerKey) 可以将她们放置到不同的 '分组'中这对于将你的作业和触发器组织为形如 "reporting jobs" 和 "maintenance jobs" 等类别分组很有帮助. 在同一个分组内作业和触发器的标识键名称必须是唯一的
- 或者换句话说, 作业或触发器的完整键 (或者叫标识符) 是名称和组的组合.
现在你大致了解了什么是 Jobs 和 Triggers, 你可以在 教程 3: 和 教程 4: 中更多的了解她们.
Quartz.NET - 教程 2: 作业和触发器的更多相关文章
- Quartz.NET - 教程 4: 更多关于触发器
译者注: 目录在这 [译]Quartz.NET 3.x 教程 译者注: 原文在这 Lesson 4: More About Triggers 跟作业一样, 触发器也相当容易使用, 但确实包含各种可定制 ...
- Quartz.Net进阶之一:初识Job作业和触发器
前几天写了一篇有关Quartz.Net入门的文章,大家感觉不过瘾,想让我在写一些比较深入的文章.其实这个东西,我也是刚入门,我也想继续深入了解一下,所以就努力看了一些资料,然后自己再整理和翻译 ...
- Quartz.NET - 教程 5: 简单触发器
译者注: 目录在这 Quartz.NET 3.x 教程 原文在这 Lesson 5: SimpleTrigger 如果你需要在特定的时间点执行一次作业, 或者在特定的时间点执行一次作业, 然后在特定的 ...
- (转)Java任务调度框架Quartz入门教程指南(四)Quartz任务调度框架之触发器精讲SimpleTrigger和CronTrigger、最详细的Cron表达式范例
http://blog.csdn.net/zixiao217/article/details/53075009 Quartz的主要接口类是Schedule.Job.Trigger,而触发器Trigge ...
- Quartz入门教程
public class App { public static void main(String[] args) throws MessagingException, IOException { / ...
- [译]Quartz 框架 教程(中文版)2.2.x 之第二课 Quartz API,Jobs和Triggers简介
第二课:QuartzAPI,Jobs和Triggers简介 Quartz API Quartz API 关键的几个接口: Scheduler:跟任务调度相关的最主要的API接口. Job:你期望任务调 ...
- Quartz 框架 教程(中文版)2.2.x
Quartz 框架 教程(中文版)2.2.x 之第一课 开始使用Quartz框架 Quartz 框架 教程(中文版)2.2.x 之第二课 Quartz API,Jobs和Triggers简介 Quar ...
- Quartz 使用教程
首先说说,为什么要写这篇文章: Quartz 的 v2.3.2 版本改动比较大,目前网上的资料都是旧版本,很缺乏相关资料 很多资料讲解非常不全面,例如 Quartz Listener 的介绍和使用基本 ...
- Quartz定时任务学习(五)触发器
顾名思义,Trigger(触发器)的责任就是触发一个 Job 去执行.当用 Scheduler 注册一个 Job 的时候要创建一个 Trigger 与这个 Job 相关联.Quartz 提供了四种类型 ...
- Quartz.NET教程:(01) 使用Quartz
使用调度器 (scheduler) 之前要先用 ISchedulerFactory 的一个实现来实例化调度器(scheduler).一旦调度器实例化完成,则它可以被启动.置于备用模式或者关闭.需要注意 ...
随机推荐
- Note - 速通 NPC?有限域算术!
浅谈有限域在 OI 中的一些应用 (2023 国家集训队论文), 戚朗瑞. \(\textbf{Example 1.}\) 给定一张有向图 \(G=(V,E)\), \(|V|=n\), \( ...
- CDS标准视图:维护活动类型描述 I_MaintenanceActivityTypeText
视图名称:维护活动类型描述 I_MaintenanceActivityTypeText 视图类型:基础 视图代码: 点击查看代码 @AbapCatalog.sqlViewName: 'IMTACTTY ...
- 《C++并发编程实战》读书笔记(1):线程管控
1.线程的基本管控 包含头文件<thread>后,通过构建std::thread对象启动线程,任何可调用类型都适用于std::thread. void do_some_work(); st ...
- 一个超经典 WinForm,WPF 卡死问题的终极反思
一:背景 1. 讲故事 写这篇文章起源于训练营里一位朋友最近在微信聊到他对这个问题使用了一种非常切实可行,简单粗暴的方式,并且也成功解决了公司里几个这样的卡死dump,如今在公司已是灵魂级人物,让我也 ...
- Java注意事项
阅读目录 一.Comparable简介 二.Comparator简介 三.Comparable和Comparator区别比较 一.Comparable简介 Comparable是排序接口.若一个类实现 ...
- DBeaver出现“Public Key Retrieval is not allowed”错误的解决办法
1.问题描述 我们在使用DBeaver连接MySql的时候,可能会出现"Public Key Retrieval is not allowed"的错误提示,如下图所示: 2.解决办 ...
- 定制Allure报告
定制Allure报告 自定义Logo图标 效果图 实现步骤 定位资源文件夹:首先,您需要定位到 allure/plugins/custom-logo-plugin/static 文件夹.这个文件夹通常 ...
- 2025苹果春季发布会前瞻:新品迭出,Apple Intelligence国行版即将上线!
随着2025年的到来,苹果公司的春季发布会也渐行渐近.作为科技行业的领军企业,苹果每一次的新品发布都备受瞩目.本次春季发布会,苹果预计会带来一系列令人期待的新品,同时,国行Mac用户也将迎来一个重大更 ...
- 最新demo版|如何0-1开发支付宝小程序之前期准备篇(一)
小程序作为目前一种轻量.便捷的应用.目前应用越来越广泛了. 很多没有开发经验的开发同学可能初次接触就是小程序开发,为了详细讲解下小程序开发的步骤,我会按照小程序的开发流程一步一步从零开始给大家介绍下如 ...
- linux的使用(3)
1.tar 包 压缩和解压 (1)tar -cvf 打包 (2)tar -xvf 解压压缩包 图片 (3)tar.gz 打包 案例:tar -zcvf ys.tar.gz aa bb hh tt (4 ...