开源的作业调度框架 - Quartz.NET

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命名空间里中找到。

 

作者: 自由、创新、研究、探索……
出处:http://shanyou.cnblogs.com/
版权:本文版权归作者和博客园共有
转载:欢迎转载,为了保存作者的创作热情,请按要求【转载】,谢谢
要求:未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
posted @ 2007-08-25 10:31 张善友 阅读(19395) 评论(28) 编辑 收藏

 回复 引用 查看   
#1楼 2007-08-25 10:37 幸运草      
顶一个
 回复 引用 查看   
#2楼 2007-08-25 10:38 wingoo      
正好用,原来还想从communityserver抽出来个呢:)
 回复 引用 查看   
#3楼 2007-08-25 11:07 阿毅      
早知道,有这么个玩意,也许此前我就不用那么辛苦了。

不知道它是否支持对多个分布式作业进行步调控制。比如我需要同时启动 4 个相同功能但服务对象不同的作业,而且它们每个都必须至少间隔1分钟,每次完成作业后它们都将报告结果。如果这 4 个作业同时进行的话,那么我可能需要超过 1 分钟才能得到报告(因为作业本身也需要花费一点时间)。但实际的需求是我得尽可能短的周期内得到报告(无论它是关于哪个具体对象),这就得对各个作业动态调整启动时间。
为了完成这点,我是费尽心力,总算是实现了,效果也还令人满意。但现在很难扩充(相对于时限而言)。

不知道博主说的这个具体用起来如何。

 回复 引用 查看   
#4楼 2007-08-25 12:42 无处坏      
好东西,先收藏再来研究
 回复 引用 查看   
#5楼 2007-08-25 17:01 玻璃*杯      
好东西..先用再研究...
 回复 引用 查看   
#6楼 2007-08-26 17:39 随风流月      
非常感谢您的工作。
 回复 引用 查看   
#7楼 2007-08-26 22:33 Michael Wang      
想知道Castle里面有定时器吗?
 回复 引用 查看   
#8楼 2007-08-27 08:52 Yok      
没有。但是自己写个这样的facility应该很容易
 回复 引用 查看   
#9楼 2007-08-27 14:32 try      
个人感觉,方法等的命名不是太好。
 回复 引用 查看   
#10楼 2007-08-28 11:30 charleschen      
# re: 开源的作业调度框架 - Quartz.NET 2007-08-25 10:38 wingoo
正好用,原来还想从communityserver抽出来个呢:)



我。。55.。。。才发现。。。

 回复 引用 查看   
#11楼 2007-08-28 16:22 高海东      
有文件同步的功能吗
@高海东
文件同步应当是具体的job,Quartz.net没有这样的job

 回复 引用 查看   
#13楼 2007-08-29 09:14 邓林海      

 回复 引用 查看   
#14楼 2007-09-29 09:16 冷火      
楼主能不能写一个Winform的例子呢
在窗体里运行例子,不要在控制台里的。
最好是CronTrigger 例子,谢谢!!!

 回复 引用 查看   
#15楼 2007-09-29 09:40 冷火      
楼主,我要在每天早上10:20 下午16:30 晚上22:40运行一个办法getchange(),怎么样写好,能不能写个例子给我,非常感谢!!
@冷火
用CronTrigger 就可以满足你的要求,具体怎么写你自己写吧。

 回复 引用 查看   
#17楼 2007-10-06 09:12 冷火      
楼让我就是搞不懂怎么用CronTrigger 来调用办法getchange()
真晕

@冷火
你把Quartz.NET教程好好的看看吧,要学会自己解决问题,我一直提倡授人以鱼不如授人以漁

 回复 引用 查看   
#19楼 2007-10-09 13:43 冷火      
问题是如果没鱼那来的漁
 回复 引用 查看   
#20楼[楼主] 2009-05-03 15:19 geff zhang      
1、支持远程控制-也就是说你可以写个Windows Service来执行定时任务,使用ASP.Net编写程序控制此Windows Service何时执行定时任务,并且可以取得目前Windows Service上排程的执行状况.此点是一个非常重要的功能,用此功能就可以在程序中将大量复杂运算的工作交由后台定时任务执行,而User也可以由Web接口上看到目前执行状况,解决了Web对于长时间运算机制的问题.
2.支持回复机制-这也是一个非常重要的特性,当运作定时任务的Service重新启动,就可以让原来运作的工作回复重新执行.
3.群集架构支持-Quartz.Net允许多台机器同时处理定时任务工作,分散Loading除此之外群集架构也代表当某个节点当机可以由其它结点负责,在一些需要高有效率的环境下Quartz.Net的群集架构可以解决问题.

 回复 引用 查看   
#21楼 2010-01-04 12:54 live-evil      
试试,以前都是放到global.asax里的.
 回复 引用 查看   
#22楼 2011-02-28 17:46 GooesFly      
第一次到你博客,原来就在深圳的高手。博客里面蛮多好文章的嘛。收藏blog。学习。
 回复 引用 查看   
#23楼 2011-04-02 09:49 aierong      

你好,你的blogs我仔细看了,收获不小
我在网上下载一个例题QuartzExampleWin32.rar,该例题,运行后,并关闭,发现一个奇怪问题,怎么进程还存在!
请问您遇到这样事情吗?怎么解决的?

我自己也做了一个winForm程序,利用Quartz.NET实现了一个作业调度,并且成功运行,但是程序关闭后,也发现windows任务管理器里面还存在进程

请看 下图

 回复 引用 查看   
#24楼 2011-04-02 17:36 冷火      
引用aierong:
你好,你的blogs我仔细看了,收获不小
我在网上下载一个例题QuartzExampleWin32.rar,该例题,运行后,并关闭,发现一个奇怪问题,怎么进程还存在!
请问您遇到这样事情吗?怎么解决的?

我自己也做了一个winForm程序,利用Quartz.NET实现了一个作业调度,并且成功运行,但是程序关闭后,也发现windows任务管理器里面还存在进程

请看 下图

这个问题应该是你的作业没关掉



 回复 引用 查看   
#25楼[楼主] 2011-04-03 08:52 shanyou      
@aierong
@冷火
冷火说的很对,把代码贴出来Review才知道

 回复 引用 查看   
#26楼 2011-04-04 08:13 aierong      
引用冷火:
引用aierong:
你好,你的blogs我仔细看了,收获不小
我在网上下载一个例题QuartzExampleWin32.rar,该例题,运行后,并关闭,发现一个奇怪问题,怎么进程还存在!
请问您遇到这样事情吗?怎么解决的?

我自己也做了一个winForm程序,利用Quartz.NET实现了一个作业调度,并且成功运行,但是程序关闭后,也发现windows任务管理器里面还存在进程

请看 下图
[...


我一个winForm应用程序,我整个应用程序都已经关闭了,
还是可以看到那个进程存在
 回复 引用 查看   
#27楼 2011-04-04 08:16 aierong      
引用shanyou:
@aierong
@冷火
冷火说的很对,把代码贴出来Review才知道



后来 我找到原因,我在主窗体事件
private void FormMain_FormClosing ( object sender , FormClosingEventArgs e )
中,把调度器关闭就不会,存在进程了

if ( scheduler != null )
{
scheduler.Shutdown ( );
}

 回复 引用 查看   
#28楼 2011-09-07 10:28 任清晓(NET)      
请问这个能最大支持多少个作业执行?