开源作业调度框架 - Quartz.NET - 实战使用1
简介:
第一步:下载Quartz.NET
下载Quartz.NET只需要打开网址选择适宜的版本进行下载解压缩即可。
目前最新版本是2.3.3,压缩包为6MB,不过鉴于国内网速。我还是加一下博客园的下载链接会快一些。
下载链接:sourceforge
站内下载:cnblogs
第二步:添加到项目中
在VS中添加引用以下三个dll
Quartz.NET-2.3.3\bin\4.0\release\Quartz\Common.Logging.Core.dll
Quartz.NET-2.3.3\bin\4.0\release\Quartz\Common.Logging.dll
Quartz.NET-2.3.3\bin\4.0\release\Quartz\Quartz.dll
第三步:如何使用
一些最基本最常用类、接口和方法,知道了这些接口和类,可以满足一般的调度作业
//该接口为主要的调度者, Quartz.IScheduler //该类用于获取调度者对象 Quartz.Impl.StdSchedulerFactory //该类用于存储IJobDetail的唯一ID Quartz.JobKey //每个具体作业的实例对象 Quartz.IJobDetail //存储一个作业所需要的一些参数。 Quartz.JobDataMap //用于构建IJobDetail实例 Quartz.JobBuilder //触发规则接口 Quartz.ITrigger //用于构建Itrigger实例 Quartz.TriggerBuilder
//作业接口,每种作业均需要实现该接口
Quartz.IJob
现在是一个基本的代码
首先我们必须先实现IJob接口来完成一个具体作业的类。
using Quartz; using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Web; namespace Scheduler.Jobs { /// <summary> /// 计算报表作业类 /// </summary> public class Report : IJob { public Report() { } //当调度对象发现该作业满足Itrigger的规则时都会调用本方法 public void Execute(IJobExecutionContext context) { //从上下文对象(Context)中获取作业的运行参数JobDataMap,该对象中保存字典对象 JobDataMap jobData = context.JobDetail.JobDataMap; //具体读取参数,使用Key来获取。 string modid = jobData["modid"].ToString(); string type = jobData["type"].ToString(); string cron = jobData["cron"].ToString(); string date1 = jobData["date1"].ToString(); string date2 = jobData["date2"].ToString(); string[] date1Arr = date1.Split(new char[] { ' ' }); string[] date2Arr = date2.Split(new char[] { ' ' }); //具体实现代码blablablalbla int newId = sys_report.CreateReport(modid, begin, end, ""); sys_report.Run(newId); } } }
using Quartz; using Quartz.Impl; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Web; public class QuartzManager { private static QuartzManager instance; private IScheduler scheduler = null; private QuartzManager() { //初始化调度对象,使用单例模式避免多次初始化 //获取一个默认的调度对象 scheduler = StdSchedulerFactory.GetDefaultScheduler(); scheduler.Start(); } public static QuartzManager GetInstance() { if (instance == null) { instance = new QuartzManager(); } return instance; } /// <summary> /// 初始化或变更已定时生成报表的计划。 /// </summary> public void LoadReport() { string sqlstr = "SQL"; DataTable dt = db.getdataset(sqlstr).Tables[0]; foreach (DataRow dr in dt.Rows) { string id = dr["id"].ToString(); string type = dr["type"].ToString(); string cron = dr["cron"].ToString(); string date1 = dr["date1"].ToString(); string date2 = dr["date2"].ToString(); string identity = "reportTime" + id; //实例化一个作业Key对象,用于获取作业对象或判断是否存在作业时使用。 JobKey jobKey = new JobKey(identity); //通过作业Ke对象 获取已经添加过同一个作业,(如果没有为NULL) IJobDetail job = scheduler.GetJobDetail(jobKey); //检查调度中是否存在该作业,存在并且参数有变化就删除作业。 if (scheduler.CheckExists(jobKey) && job.JobDataMap["cron"].ToString() != cron) { scheduler.DeleteJob(jobKey); } //检查调度中是否存在该作业 if (scheduler.CheckExists(jobKey)==false) { //创建一个字典对象,存储作业执行时传递的必要参数 IDictionary<string, object> dicData = new Dictionary<string, object>(); //添加作业在运行时需要的一些参数 dicData.Add("id", id); dicData.Add("type", type); dicData.Add("cron", cron); dicData.Add("date1", date1); dicData.Add("date2", date2); //将存有作业参数的字典添加到JobDataMap中 JobDataMap jobData = new JobDataMap(dicData); //通过JobBuilder创建一个指定作业实例,通过泛型确定作业的类型 //这里要说明是JobBuilder对象使用链式调用的方式进行设置。 job = JobBuilder.Create<Scheduler.Jobs.Report>() //设置作业的维一ID .WithIdentity(identity) //将作业参数传入作业对象中 .SetJobData(jobData) //构建IJobDetail实例 .Build(); //通过TriggerBuilder创建一个指定触发实例 ITrigger trigger = TriggerBuilder.Create() //设置触发实例的ID,设置了ID后可以批量操作同一运行规则的作业。 .WithIdentity(identity, identity) //传入Cron表达式字符串,字符串具体内容在下面会有一个说明。 .WithCronSchedule(cron) //构建Itrigger实例 .Build(); //添加一个作业,并设置作业实例和触发作业执行规则的实例 scheduler.ScheduleJob(job, trigger); } } } }
最后,我们在网站启动时或程序启动时调用并启动调度对象就可以了
<%@ Application Language="C#" %> <script RunAt="server"> void Application_Start(object sender, EventArgs e) { QuartzManager.GetInstance().LoadReport(); } void Application_End(object sender, EventArgs e) { } void Application_Error(object sender, EventArgs e) { } void Session_Start(object sender, EventArgs e) { } void Session_End(object sender, EventArgs e) { } </script>
第四步:Cron表达式
Cron表达式其实是对作业触发规则的一种字符串,它按照一定的规则填写
字符串的具体格式为
秒 分钟 小时 日 月 星期 [年]
每项中间使用一个空格隔开,注意的是 年 参数不是必须填写的。
其中会用到一些符号来表示
* 表示任何
? 表示不指定
/ 表示周期 符号前和符号后填写数字
- 表示范围 符号前和符号后填写数字
, 表示多个值多个值可以用多个逗号分开
其它符号:如L W # 等,
更详细的Cron表达式就不在写了,博客园已经有很多很详细的说明文章了。
更有一些 Web小工具可以在线生成Cron表达式,可以通工小工具快方便的理解Cron表达式
2016.05.29