Quartz.NET是一个开源的作业调度框架(转自张善友博客)

来源:互联网 发布:java怎么打印所有汉字 编辑:程序博客网 时间:2024/05/31 00:39

Quartz.NET是一个开源的作业调度框架,是OpenSymphony  Quartz API.NET移植,它用C#写成,可用于winformasp.net应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。它有很多特征,如:数据库支持,集群,插件,支持cron-like表达式等等。  
      你曾经需要应用执行一个任务吗?这个任务每天或每周星期二晚上1130,或许仅仅每个月的最后一天执行。一个自动执行而无须干预的任务在执行过程中如果发生一个严重错误,应用能够知到其执行失败并尝试重新执行吗?你和你的团队是用.NET编程吗?如果这些问题中任何一个你回答是,那么你应该使用Quartz.NET调度器。 Quartz.NET
允许开发人员根据时间间隔(或天)来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。整合了 Quartz.NET的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业.
   
   下面是官方的开发指南教程的中文版:英文版的参照官方网站(
http://quartznet.sourceforge.net/tutorial.html
  

 

Quartz.net官方开发指南 第一课:使用Quartz.net

 

    使用scheduler之前应首先实例化它。使用SchedulerFactory可以完成scheduler的实例化

 

Quartz.net官方开发指南 第二课:Jobs And Triggers

 

   JobDetail对象由Quartz客户端在Job被加入到scheduler时创建。它包含了Job的各种设置属性以及一个JobDataMap对象,这个对象被用来存储给定Job类实例的状态信息。 
Trigger
对象被用来触发jobs的执行。你希望将任务纳入到进度,要实例化一个Trigger并且调整它的属性以满足你想要的进度安排。Triggers也有一个JobDataMap与之关联,这非常有利于向触发器所触发的Job传递参数。Quartz打包了很多不同类型的Trigger,但最常用的Trigge类是SimpleTriggerCronTrigger

 

Quartz.net官方开发指南 第三课:更多关于Jobs和JobDetails

 

  在所实现的类成为真正的“Job”时,期望任务所具有的各种属性需要通知给Quartz。通过JobDetail类可以完成这个工作,这个类在前面的章节中曾简短提及过。现在,我们花一些时间来讨论QuartzJobs的本质和Job实例的生命周期。

 

Quartz.net方开发指南 第四课:关于Triggers更多内容

 

     Job一样,trigger非常容易使用,但它有一些可选项需要注意和理解,同时,trigger有不同的类型,要按照需求进行选择  
Quartz.net官方开发指南 第五课: SimpleTrigger

 

   如果需要让任务只在某个时刻执行一次,或者,在某个时刻开始,然后按照某个时间间隔重复执行,简单地说,如果你想让触发器在2007820日上午112354秒执行,然后每个隔10秒钟重复执行一次,并且这样重复5次。那么SimpleTrigger 就可以满足你的要求。

 

Quartz.net官方开发指南 第六课 : CronTrigger

 

    如果你需要像日历那样按日程来触发任务,而不是像SimpleTrigger 那样每隔特定的间隔时间触发,CronTriggers通常比SimpleTrigger更有用。 
使用CronTrigger,你可以指定诸如每个周五中午,或者每个工作日的9:30”或者从每个周一、周三、周五的上午900到上午1000之间每隔五分钟这样日程安排来触发。甚至,象SimpleTrigger一样,CronTrigger也有一个StartTime以指定日程从什么时候开始,也有一个(可选的)EndTime以指定何时日程不再继续。

 

Quartz.net官方开发指南 第七课 : TriggerListeners和JobListeners

 

   监听器是在scheduler事件发生时能够执行动作的对象。可以看出,TriggerListeners接收与triggers相关的事件,而JobListeners则接收与Job相关的事件。 

 

Quartz.net官方开发指南 第八课:SchedulerListeners

 

  SchedulerListenersTriggerListenersJobListeners非常相似,SchedulerListeners只接收与特定trigger job无关的Scheduler自身事件通知。 
Scheduler
相关的事件包括:增加job或者trigger,移除Job或者trigger, scheduler内部发生的错误,scheduler将被关闭的通知,以及其他。

 

Quartz.net官方开发指南 第九课: JobStore

 

    JobStore负责保持对所有scheduler “工作数据追踪,这些工作数据包括:job(任务),trigger(触发器),calendar(日历)等。为你的Quartz scheduler选择合适的JobStore是非常重要的一步,幸运的是,如果你理解了不同的JobStore之间的差别,那么选择就变得非常简单。在提供产生scheduler 实例的SchedulerFactory的属性文件中声明scheduler所使用的JobStore(以及它的配置)

 

Quartz.net官方开发指南 第十课: 配置、资源使用以及SchedulerFactory

 

    Quartz以模块方式构架,因此,要使它运行,几个组件必须很好的咬合在一起。幸运的是,已经有了一些现存的助手可以完成这些工作   

 

Quartz.net官方开发指南 第十一课: 高级(企业级)属性

 

   集群只能用在使用ADO.NET-Jobstore的情况。特新包括负载均衡和容错(如果JobDetail"request recovery"标记被设置为true 

 

Quartz.net官方开发指南 第十二课:Quartz 的其他特性

 

  Plug-Ins 插件 :Quartz提供了一个接口(ISchedulerPlugin)来插入附加的功能。 
  JobFactory 
:当触发器触发时,与之相关联的任务被Scheduler中配置的JobFactory所实例华。缺省的JobFactory只是简单地创建一个Job实例。你也许想创建自己的JobFactory实现,以完成诸如让应用的IoC或者 DI容器产生/初始化job实例的功能。
 
'Factory-Shipped' Jobs 
Quartz也提供了一些可以在你的应用中使用的实用的Jobs,比如,发邮件、调用远程对象。这些外来的Job可以在Quartz.Jobs命名空间里中找到。

 

 

 

 

 


Cron表达式

Quartz使用类似于Linux下的Cron表达式定义时间规则,Cron表达式由6或7个由空格分隔的时间字段组成。

 

表1 Cron表达式时间字段 

时间域名             允许值                      允许的特殊字符

1      秒                  0-59                           , - * /

2    分钟                  0-59                           , - * /

3     小时                  0-23                           , - * /

4    日期                  1-31                           , - * ? / L W C

5     月份                  1-12                           , - * /

6     星期                  1-7                            , - * ? / L C #

7    年(可选)              空值 1970-2099                  , - * /

 

 

Cron表达式的时间字段除允许设置数值外,还可使用一些特殊的字符,提供列表、范围、通配符等功能,细说如下: 
星号(*):可用在所有字段中,表示对应时间域的每一个时刻,例如,*在分钟字段时,表示“每分钟”; 

问号(?):该字符只在日期和星期字段中使用,它通常指定为“无意义的值”,相当于点位符; 

减号(-):表达一个范围,如在小时字段中使用“10-12”,则表示从10到12点,即10,11,12; 
逗号(,):表达一个列表值,如在星期字段中使用“MON,WED,FRI”,则表示星期一,星期三和星期五; 
斜杠(/):x/y表达一个等步长序列,x为起始值,y为增量步长值。如在分钟字段中使用0/15,则表示为0,15,30和45秒,而5/15在分钟字段中表示5,20,35,50,你也可以使用*/y,它等同于0/y; 
●L
:该字符只在日期和星期字段中使用,代表“Last”的意思,但它在两个字段中意思不同。L在日期字段中,表示这个月份的最后一天,如一月的31号,非闰年二月的28号;如果L用在星期中,则表示星期六,等同于7。但是,如果L出现在星期字段里,而且在前面有一个数值X,则表示“这个月的最后X天”,例如,6L表示该月的最后星期五; 
●W
:该字符只能出现在日期字段里,是对前导日期的修饰,表示离该日期最近的工作日。例如15W表示离该月15号最近的工作日,如果该月15号是星期六,则匹配14号星期五;如果15日是星期日,则匹配16号星期一;如果15号是星期二,那结果就是15号星期二。但必须注意关联的匹配日期不能够跨月,如你指定1W,如果1号是星期六,结果匹配的是3号星期一,而非上个月最后的那天。W字符串只能指定单一日期,而不能指定日期范围; 
●LW
组合:在日期字段可以组合使用LW,它的意思是当月的最后一个工作日; 

井号(#):该字符只能在星期字段中使用,表示当月某个工作日。如6#3表示当月的第三个星期五(6表示星期五,#3表示当前的第三个),而4#5表示当月的第五个星期三,假设当月没有第五个星期三,忽略不触发; 
● C
:该字符只在日期和星期字段中使用,代表“Calendar”的意思。它的意思是计划所关联的日期,如果日期没有被关联,则相当于日历中所有日期。例如5C在日期字段中就相当于日历5日以后的第一天。1C在星期字段中相当于星期日后的第一天。 
Cron表达式对特殊字符的大小写不敏感,对代表星期的缩写英文大小写也不敏感。 


表2下面给出一些完整的Cron表示式的实例: 

"0 0 12 * * ? "每天12点运行

"0 15 10 ? * *"每天10:15运行

"0 15 10 * * ?"每天10:15运行

"0 15 10 * * ? *"每天10:15运行

"0 15 10 * * ? 2008"在2008年的每天10:15运行

"0 * 14 * * ?"每天14点到15点之间每分钟运行一次,开始于14:00,结束于14:59。

"0 0/5 14 * * ?"每天14点到15点每5分钟运行一次,开始于14:00,结束于14:55。

"0 0/5 14,18 * * ?"每天14点到15点每5分钟运行一次,此外每天18点到19点每5钟也运行一次。

"0 0-5 14 * * ?"每天14:00点到14:05,每分钟运行一次。

"0 10,44 14 ? 3 WED" 3月每周三的14:10分到14:44,每分钟运行一次。

"0 15 10 ? * MON-FRI"每周一,二,三,四,五的10:15分运行。

"0 15 10 15 * ?"每月15日10:15分运行。

"0 15 10 L * ?"每月最后一天10:15分运行。

"0 15 10 ? * 6L"每月最后一个星期五10:15分运行。

"0 15 10 ? * 6L 2007-2009"在2007,2008,2009年每个月的最后一个星期五的10:15分运行。

"0 15 10 ? * 6#3"每月第三个星期五的10:15分运行。

 

其中:不用设置的用”?”.
(1)每月第几天和每星期第几天是互斥的,两个只能设置1个。如果有好几个时间点,可以使用”,”符号,例如:”0 0 10,12,14 * * ?”表示每天的10时,12时,14时执行Job. 
(2)
对于连续时间可以使用”-”符号。例如:”0 10,12,14 1-15 * ?”表示每月的1到15日10时,12时,14时执行Job. 
(3)
时间格式的年可以不用制定。例如”0 0 10,12,14 ? MON 2006”表示2006年每星期一的10时,12时,14时执行Job. 

 

 

原创粉丝点击