quartz(时间服务器)学习笔记

上传人:第*** 文档编号:32817816 上传时间:2018-02-12 格式:DOCX 页数:13 大小:72.44KB
返回 下载 相关 举报
quartz(时间服务器)学习笔记_第1页
第1页 / 共13页
quartz(时间服务器)学习笔记_第2页
第2页 / 共13页
quartz(时间服务器)学习笔记_第3页
第3页 / 共13页
quartz(时间服务器)学习笔记_第4页
第4页 / 共13页
quartz(时间服务器)学习笔记_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《quartz(时间服务器)学习笔记》由会员分享,可在线阅读,更多相关《quartz(时间服务器)学习笔记(13页珍藏版)》请在金锄头文库上搜索。

1、Quartz.NETQuartz.NET 是一个开源的作业调度框架,能够应用在小到轻量级的应用程序,大到重量级的企业级系统中的全功能的开源任务调度系统。一、特点 API 操作简单,只要几行简单的代码你就可以在应用程序里面实现自己的作业调度,并实时监视作业执行情况。 触发器功能强大,比 Windows 的任务计划提供更细的触发粒度,可以使用“Cron 表达式”(类似于正则表达式)。 良好的可扩展性,它基于接口编程,你可以实现自己的 Schedule 调度器,Job 作业,以及 Trigger 触发器等 。 作业可以保存在 RAM 中,也可以持久化到数据库,支持多种数据库类型:SqlServer、

2、Oracle 、MySql 等。 集群,这是一个高级应用,可以在多台计算机之间创建负载平衡、容错处理。 支持两种途径配置应用程序的运行时属性:声明式和编程式。二、Quartz 的目录结构内容目录名 存放内容Quartz.Collection 数据结构Quartz.Core 调度器,线程池Quartz.Impl 接口实现类Quartz.Job 作业Quartz. Listener 监听器Quartz. Plugin 扩展插件Quartz. Simpl 简单的调试器、线程池Quartz. SPI 接口Quartz. Util 实用方法Quartz. Xml Xml 配置操作类三、作业流程的定制作业

3、流程是在调度器的统一调度下完成的,它可以调度多个作业,触发器提供作业执行的条件(每天 8:00 am) ,触发器与作业关联,它们是 1:N 的关系。1. JobJob 每一个 Quartz Job 必须有一个实现 IJob 接口的具体类。这个接口仅有一个要在 Job 中实现的方法,execute(),方法 execute() 的原型如下:void Execute(JobExecutionContext context);可以在 execute() 方法中执行你的业务逻辑:例如,也许你会调用其他构造的实例上的方法,发送一个电子邮件、FTP 传一个文件、调用一个 Web 服务、执行一个工作流等。当

4、 Quartz 调用 execute() 方法,会传递一个 JobExecutionContext 上下文变量,里面封装有 Quartz 的运行时环境和当前正执行的 Job。通过 JobExecutionContext ,你可以访问到调度器的信息,作业和作业上的触发器的信息,还有更多更多的信息。例如:public class TestJobImpl : IExtendedJob private string jobContent;public string JobContentget return jobContent; set jobContent = value; public TestJ

5、obImpl(): base()public void Execute(JobExecutionContext context)jobContent = context.MergedJobDataMap.Get(JobContent).ToString();System.Diagnostics.ProcessStartInfo startInfo = new ProcessStartInfo();startInfo.FileName = jobContent;startInfo.WindowStyle = ProcessWindowStyle.Normal;Process pro = new

6、Process();pro.StartInfo = startInfo;pro.Start();pro.WaitForExit(5000);pro.Kill();IStatefulJob(有状态 Job)一个 Job 实例可以被定义为“有状态的”或者“ 无状态的” 。在执行无状态的任务过程中任何对 JobDataMap 所作的更改都将丢失。有状态的任务恰好相反,它在任务的每次执行之后重新存储 JobDataMap 。有状态任务的一个缺点就是它不能并发执行。也就是说,如果任务有状态,那么当触发器试图触发它,触发器就会被阻塞直到前面的执行完成。想使任务有状态,它就要实现 IStatefulJob

7、接口而不是实现 IJob 接口。IStatefulJob 接口仅仅是扩展了 Job 接口,未加入新的方法。你只需要通过使用与 Job 接口相同的 execute() 方法简单的实现 IStatefulJob 接口即可。假如你有已存在的 Job 类,你所有要做的只是改变 Job 的接口为 IStatefulJob。Public interface IStatefulJob : IJob IInterruptableJob(中断 Job)它扩展了普通的 Job 接口并提供了一个 interrupt() 方法:有时候需要能中断一个 Job,尤其是对于一个长时间执行的 Job。例如,假定你有一个 Jo

8、b 运行过程要花费一个小时,你发现在 5 分钟的时候因某个非受控的错误被中断需要接着执行。你或许也会中断 Job,修复问题,然后又继续运行。public interface IInterruptableJob : IJob void Interrupt(); 2. TriggerTrigger 的责任就是触发一个 Job 去执行。当用 Scheduler 注册一个 Job 的时候要创建一个 Trigger 与这个 Job 相关联。Quartz 打包了很多不同类型的 Trigger,但最常用的Trigge 类是 SimpleTrigger 和 CronTrigger。SimpleTrigger

9、是两个之中简单的那个,它主要用来激发单事件的 Job,Trigger 在指定时间激发,并重复 n 次-两次激发时间之间的延时为 m,然后结束作业。构造函数:/ 触发器名/ 触发器组名/ 绑定的任务名/ 绑定的任务组名/ 开始执行时间/ 结束执行时间/ 重复触发次数/ 触发间隔SimpleTrigger(string name, string group, string jobName, string jobGroup, DateTime startTimeUtc, NullableDateTime endTimeUtc,int repeatCount, TimeSpan repeatInter

10、val);实例:(每两小时执行一次,重复执行 3 次,开始执行时间为当前时间)SimpleTrigger trig = new SimpleTrigger();trig.Name = trigName;trig.RepeatInterval = 2;trig.RepeatCount = 3;CronTrigger 非常复杂且强大。它是基于通用的公历,当需要用一种较复杂的时间表去执行一个 Job 时用到。例如,四月至九月的每个星期一、星期三、或星期五的午夜。Cron 表达式包括以下 7 个字段( 1 个可选)秒 分 小时 月内日期 月 周内日期 年(可选)表达式的每个数值域都是一个有最大值和最小

11、值的集合,如:秒域和分钟域的集合是0-59,日期域是 1-31,月份域是 1-12。注意:秒、分、小时字段是从小到大排序的,在使用的时候要小心,不要颠倒过来。表 1. Cron 表达式允许值及对应表字段 允许值 允许的特殊字符秒 0-59 , - * /分 0-59 , - * /小时 0-23 , - * /月内日期 1-31 , - * ? / L W C月 1-12 或者 JAN-DEC , - * /周内日期 1-7 或者 SUN-SAT , - * ? / L C #年(可选) 留空, 1970-2099 , - * /表 2 特殊字符意义对应表特殊字符说明* 匹配所有的值。如:*在

12、分钟的字段域里表示 每分钟? 只在日期域和星期域中使用。它被用来指定“非明确的值”- 指定一个范围。如:“10-12”在小时域意味着“10 点、11 点、12 点”, 指定几个可选值。如:“MON,WED,FRI”在星期域里表示“星期一、星期三、星期五 ” / 指定增量。如:“0/15”在秒域意思是没分钟的 0,15,30 和 45 秒。 “5/15”在分钟域表示没小时的5,20 ,35 和 50。符号“*”在“/”前面(如: */10)等价于 0 在“/”前面(如: 0/10)L 表示 day-of-month 和 day-of-week 域,但在两个字段中的意思不同,例如 day-of-m

13、onth 域中表示一个月的最后一天。如果在 day-of-week 域表示7或者SAT,如果在 day-of-week 域中前面加上数字,它表示一个月的最后几天,例如6L就表示一个月的最后一个星期五W 只允许日期域出现。这个字符用于指定日期的最近工作日。例如:如果你在日期域中写 “15W”,表示:这个月 15 号最近的工作日。所以,如果 15 号是周六,则任务会在 14 号触发。如果 15 好是周日,则任务会在周一也就是 16 号触发。如果是在日期域填写“1W”即使 1 号是周六,那么任务也只会在下周一,也就是 3 号触发, “W”字符指定的最近工作日是不能够跨月份的。字符 “W”只能配合一个

14、单独的数值使用,不能够是一个数字段,如:1-15W 是错误的LWL 和 W 可以在日期域中联合使用,LW 表示这个月最后一周的工作日# 只允许在星期域中出现。这个字符用于指定本月的某某天。例如:“6#3”表示本月第三周的星期五(6 表示星期五, 3 表示第三周) 。 “2#1”表示本月第一周的星期一。 “4#5”表示第五周的星期三C 允许在日期域和星期域出现。这个字符依靠一个指定的“日历” 。也就是说这个表达式的值依赖于相关的“日历 ”的计算结果,如果没有“ 日历” 关联,则等价于所有包含的“ 日历” 。如:日期域是“5C”表示关联“日历”中第一天,或者这个月开始的第一天的后 5 天。星期域是

15、“1C” 表示关联“日历”中第一天,或者星期的第一天的后 1 天,也就是周日的后一天(周一)示例:0 0 0 1 1 ?” 每年元旦 1 月 1 日 0 点触发0 15 10 * * ? * 每天上午 10:15 触发 0 15 10 * * ? 2005 2005 年的每天上午 10:15 触发0 0-5 14 * * ? 每天下午 2 点到下午 2:05 期间的每 1 分钟触发 0 10,44 14 ? 3 WED 每年三月的星期三的下午 2:10 和 2:44 触发 0 15 10 ? * MON-FRI 周一至周五的上午 10:15 触发0 15 10 ? * 6#3 每月的第三个星期五上午 10:

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 工程造价

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号