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详细介绍里学到更多。

posted @ 2018-07-09 10:17 David Huang 阅读(260) 评论(0) 推荐(0) 编辑
摘要: Lesson 1: 使用Quartz 本系列文章是官方3.x文档的翻译,原文地址: "https://www.quartz scheduler.net/documentation/quartz 3.x/tutorial/index.html" 目录: "Lesson 1: 使用Quartz" "Le 阅读全文
posted @ 2018-07-05 16:56 David Huang 阅读(218) 评论(0) 推荐(0) 编辑
摘要: 需求 给指定列添加下拉列表。如下图: 思路 1. NPOI的文档网站不能访问了,这里参考的POI文档。 2. 加下拉列表有两种方式,一种直接写字符串,例如 。这种方式限制最大长度255. 3. 第二种引用其他单元格。本例中采取的这种方式。新建一个Sheet,将所有选项填入其中。如图中第一行是客户信息 阅读全文
posted @ 2018-04-09 10:50 David Huang 阅读(676) 评论(1) 推荐(0) 编辑
摘要: 需求 要导出一个Excel,第一行是不定长字符串,合并单元格(A G)已知,现要计算第一行的高度。 思路 已知,NPOI的宽度单位是1/256个英文字符,在本例中,A列的宽度是2048,即 2048 / 256 = 8 个英文字符。在A4单元格里也可以看出。如下图: 第一行默认的行高,正好显示一行文 阅读全文
posted @ 2018-04-04 09:53 David Huang 阅读(1006) 评论(1) 推荐(1) 编辑
摘要: Q:输出窗口乱码 A:修改.vscode文件夹下,tasks.json文件,具体内容见图 阅读全文
posted @ 2017-10-20 11:06 David Huang 阅读(525) 评论(0) 推荐(0) 编辑
摘要: 目前EF Core调用存储过程,限制很多,比如返回结果必须是定义好的DbSet<>等等。这里用一种曲线救国的方式,自定义两个方法,用原始ado.net解决问题。以MySql数据库为例,代码如下: 阅读全文
posted @ 2017-09-29 10:48 David Huang 阅读(806) 评论(0) 推荐(0) 编辑
摘要: 一、设置共享文件夹 二、访问 阅读全文
posted @ 2017-05-10 17:11 David Huang 阅读(379) 评论(0) 推荐(0) 编辑
摘要: 一、问题:解决winform动态画图闪的问题,网上搜的方法,大部分都是: 凡是直接这么给人解答问题的,基本都是属于道听途说,自己没试过的。或者根本就没注意要解决的是“动态”的问题。 二、解决方法:动态画图不闪的方法如下,先上效果图(请忽略鼠标样式,是gif录制软件的效果): 三、代码:简单封了个自定 阅读全文
posted @ 2017-02-09 16:41 David Huang 阅读(1032) 评论(0) 推荐(0) 编辑
摘要: sqlserver有output,Oracle有Sequence。Access用下面的方法,注意两次查询用一个connection: 阅读全文
posted @ 2016-12-14 17:26 David Huang 阅读(3708) 评论(0) 推荐(0) 编辑
摘要: 记录TransactionScope简单用法,示例如下: 问题1.这次使用的Access数据库,报错“提供程序不支持 ITransactionLocal 接口”。 解决方法:在连接字符串里,加上"OLE DB Services=-4",作用是禁用 OLE DB 会话池和自动事务登记。副作用是在频繁使 阅读全文
posted @ 2016-10-27 10:34 David Huang 阅读(587) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示