Quartz.Net任务和触发器实现方法详解

 更新时间:2022年02月07日 11:05:22   作者:David Huang  
这篇文章主要介绍了Quartz.Net任务和触发器实现方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

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)的组合是惟一的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C#获取Excel第一列的实例方法

    C#获取Excel第一列的实例方法

    在本篇文章里小编给各位分享了关于C# 怎么获取Excel第一列的实例方法和代码,需要的朋友们可以学习下。
    2019-08-08
  • 自己编写sqlhelper类示例分享

    自己编写sqlhelper类示例分享

    这篇文章主要介绍了自己编写sqlhlper类示例,需要的朋友可以参考下
    2014-04-04
  • C#创建Excel多级分组的方法

    C#创建Excel多级分组的方法

    这篇文章主要为大家详细介绍了C#创建Excel多级分组的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • 浅析C#中静态方法和非静态方法的区别

    浅析C#中静态方法和非静态方法的区别

    C#静态方法与非静态方法的区别不仅仅是概念上的,那么他们有什么具体的区别呢?让我们通过本文向大家介绍下C#中静态方法和非静态方法的区别,一起看看吧
    2017-09-09
  • 基于C#实现音乐文件的播放功能

    基于C#实现音乐文件的播放功能

    本文介绍了如何使用C#编写一个简单的程序来实现音乐文件的播放功能,程序能够读取MP3文件和ogg文件,并通过合适的控件进行播放,同时,程序具备处理异常、良好的用户界面和兼容性的特点,感兴趣的朋友可以自己动手尝试一下
    2024-05-05
  • C#拼接SQL语句 用ROW_NUMBER实现的高效分页排序

    C#拼接SQL语句 用ROW_NUMBER实现的高效分页排序

    C#拼接SQL语句,SQL Server 2005+,多行多列大数据量情况下,使用ROW_NUMBER实现的高效分页排序
    2012-05-05
  • C# WinForm实现Win7 Aero透明效果代码

    C# WinForm实现Win7 Aero透明效果代码

    这篇文章主要介绍了C# WinForm实现Win7 Aero透明效果代码,通过调用dwmapi.dll相关方法实现,需要的朋友可以参考下
    2014-07-07
  • Unity3D实现打砖块游戏

    Unity3D实现打砖块游戏

    这篇文章主要为大家详细介绍了Unity3D实现打砖块游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • C#获取进程或线程相关信息的方法

    C#获取进程或线程相关信息的方法

    这篇文章主要介绍了C#获取进程或线程相关信息的方法,涉及C#操作进程及线程的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • C#中事件只能在内部调用的原因分析

    C#中事件只能在内部调用的原因分析

    事件(Event) 基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些提示信息,如系统生成的通知。应用程序需要在事件发生时响应事件,这篇文章主要介绍了C#中事件为什么只能在内部调用,需要的朋友可以参考下
    2021-11-11

最新评论