您的位置:首页 > 其它

开源作业调度框架 - Quartz.NET - 实战使用1

2020-02-07 08:09 253 查看

简介:

 

 

第一步:下载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

 

 

转载于:https://www.cnblogs.com/jgjgjg23/p/4071055.html

  • 点赞
  • 收藏
  • 分享
  • 文章举报
aiwenia0512 发布了0 篇原创文章 · 获赞 0 · 访问量 218 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: