开源作业调度框架 - 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[]; 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
开源作业调度框架 - Quartz.NET - 实战使用1的更多相关文章
- 开源作业调度框架 - Quartz.NET - 实战使用2
纠正第一篇文章的一个错误代码. 下面是错误代码,这样并不能得知系统中是否已经存在该JobId //实例化一个作业Key对象,用于获取作业对象或判断是否存在作业时使用. JobKey jobKey = ...
- .NET开源作业调度框架(Quartz.NET和FluentScheduler)实战项目演练
一.课程介绍 明人不说暗话,跟着阿笨一起玩NET .本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享 ...
- .Net平台开源作业调度框架Quartz.Net
Quartz.NET介绍: Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中. ...
- (转).Net平台开源作业调度框架Quartz.Net
Quartz.NET介绍: Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中. ...
- 开源作业调度框架 - Quartz.NET - ASP.NET部署
经过这次使用实践,感觉Quartz.NET使用起来方便快捷 但是在发布部署时我们会遇到一个问题 那就是当Web应用程序经常没有按照预计的时间去执行. 那问题出在哪里了呢? 根据以往的经验很容易就可以找 ...
- 开源作业调度框架 - Quartz.NET - Cron表达式测试
昨天简单写了一下如何使用Quzrtz.NET. 那么问题来了,我设置了Cron表达式之后如何知道是表达式是否按照预期的时间执行了呢? 我找到了些Cron表达式工具生成了表达式,确发现它们基本上没有进行 ...
- Quartz.NET开源作业调度框架系列
Quartz.NET是一个被广泛使用的开源作业调度框架 , 由于是用C#语言创建,可方便的用于winform和asp.net应用程序中.Quartz.NET提供了巨大的灵活性但又兼具简单性.开发人员可 ...
- Quartz.NET开源作业调度框架系列(三):IJobExecutionContext 参数传递
前面写了关于Quartz.NET开源作业调度框架的入门和Cron Trigger , 这次继续这个系列, 这次想讨论一下Quartz.NET中的Job如何通过执行上下文(Execution Conte ...
- Quartz.NET开源作业调度框架系列(一):快速入门step by step
Quartz.NET是一个被广泛使用的开源作业调度框架 , 由于是用C#语言创建,可方便的用于winform和asp.net应用程序中.Quartz.NET提供了巨大的灵活性但又兼具简单性.开发人员可 ...
随机推荐
- golang基础--map字典
map 类似python语言中的dict(字典类型),以key-value形式存储数据 Key必须是支持==或!=比较运算的类型,不可以是函数,map或slice map查找比线性搜素快很多,但比使用 ...
- Spring缓存注解@Cache,@CachePut , @CacheEvict,@CacheConfig使用
@Cacheable.@CachePut.@CacheEvict 注释介绍 表 1. @Cacheable 作用和配置方法 @Cacheable 的作用 主要针对方法配置,能够根据方法的请求参数对其结 ...
- python队列、线程、进程、协程
目录: 一.queue 二.线程 基本使用 线程锁 自定义线程池 生产者消费者模型(队列) 三.进程 基本使用 进程锁 进程数据共享 默认数据不共享 queues array Manager.dict ...
- 脚手架(create-react-app)没有eject情况下,使用react-scripts的时候,动态设置环境变量
在实际开发中,例如:有时候打包发布时,需要手动更新版本,比如修改package.json中的version,但是如果有时候忘了修改,那么又得build一次: 如果能动态设置多好,webpack下可以在 ...
- js中的深浅拷贝
js中的深浅拷贝 js中有深拷贝.浅拷贝一说,所谓的深浅拷贝是针对value类型为引用类型(函数.对象.数组)而言的,大概理解的就是: 浅拷贝: 拷贝出的对象c和原始对象o,c和o在key对应的val ...
- [日常] go语言圣经-获取URL练习题
1.主要使用net/http和io/ioutil包 2.http.Get函数是创建HTTP请求的函数,resp这个结构体中,Body字段包括一个可读的服务器响应流 3.ioutil.ReadAll函数 ...
- 【转】类找不到总结java.lang.ClassNotFoundException
(1)org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot load JDBC driver class 'com.microsoft.sqls ...
- future3.2 Tomcat启动时错误:Cannot rename original file to ...
其日志中第一个警告如下: 警告: Unexpected exception resolving reference java.io.IOException: Cannot rename origina ...
- Linux : task work 机制
task work机制可以在内核中向指定的进程添加一些任务函数,这些任务函数会在进程返回用户态时执行,使用的是该进程的上下文.包括下面的这些API: task_work_add task_work_c ...
- Android 使用全局变量的问题
现在每天都在忙,而且一忙起来,就把写笔记的事情放在了后面,最近在写程序的时候,突然要使用全局变量,就按照以前的方式,写了一个类,然后把变量都声明为静态变量,然后做为全局变量使用,但是在进行Activi ...