初步使用Quartz.NET

前言
  前段时间工作比较闲暇,上网闲逛发现了一个作业调度框架Quartz.NET,挺新奇的。正好没事干拿来练练手!
  Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中。
它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。它有很多特征,如:数据库支持,集群,插件,支持cron-like表达式等等。(抄的)
  用这个东西无非就是有这么一种需求,需要在特定的时间做某些事情。比如我们想在凌晨2点做一次静态页面更新。或者在一个特别的日子发一封邮件==。花了两天弄懂简单的定时任务,做了一个东西

先上图:

 

      上图中的操作将会在2012-3-24开始每天晚上11点40分 发送一封邮件。当然这只是一个简单的实例测试用的。邮件的内容和发送的邮件我都定死了。 

要实现这些功能我们  首先要  获取一个任务调度器   然后再 创建一个工作  (就是要做什么)  创建一个触发器 (就是什么时候做) 最后启动这个调度器。

                                                                   

      在11点40分的时候 我如期收到了邮件。

 

上图是我的工程截图 SchedulerManager是调度器 它用来获取调度器 

 public static class SchedulerManager
{
private static IScheduler scheduler;
private static readonly object lockObj = new object();
private static readonly object lockObj1 = new object();
private static ISchedulerFactory sf;

public static ISchedulerFactory GetSchedulerFactory()
{
if (sf == null)
{
lock (lockObj1)
{
if (sf == null)
{
sf = new StdSchedulerFactory();
}
}
}
return sf;
}
public static IScheduler GetScheduler()
{
if (scheduler == null)
{
lock (lockObj)
{
if (scheduler == null)
{
//获取默认调度器
scheduler = GetSchedulerFactory().GetScheduler();
}
}
}
return scheduler;
}
}


JobManager是工作管理 他用来添加工作并启动

        /// <summary>
/// 添加一个工作并启动
/// </summary>
/// <param name="JobClassName">工作的类名</param>
/// <param name="JobName">工作名</param>
/// <param name="Cron">Cron表达式</param>
/// <returns></returns>
public static bool AddJob(HttpRequestBase Request)
{
string JobClassName = GetRequestInfo.getJobClass(Request);
string JobName = GetRequestInfo.getJobName(Request);
string Cron = GetRequestInfo.getCron(Request);
DateTime beginTime = GetRequestInfo.beginDateTime(Request);
DateTime? endTime = GetRequestInfo.endDateTime(Request);
Dictionary<string,object> jobInfos = GetRequestInfo.jobInfos(Request);
TimeSpan triggertime = GetRequestInfo.getTriggerTime(Request);

// 获取一个任务调度器
//ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
// 获取一个任务调度器
//IScheduler scheduler = schedulerFactory.GetScheduler();
IScheduler scheduler = SchedulerManager.GetScheduler();
// 创建一个工作
Type type = JobClassReturn.jobClassReturn(JobClassName);
JobDetail job = new JobDetail(JobName, JobClassReturn.DEFAULT_GROUP, type);

// 创建一个触发器
try
{
CronTrigger trigger = new CronTrigger();
trigger.Name = Guid.NewGuid().ToString();
trigger.JobName = JobName;
trigger.JobGroup = JobClassReturn.DEFAULT_GROUP;
trigger.Group = JobClassReturn.DEFAULT_Trigger_GROUP;
trigger.CronExpression = new CronExpression(Cron);
trigger.StartTimeUtc = beginTime;
trigger.EndTimeUtc = endTime;
scheduler.AddJob(job, true);

if (endTime != null)
{
doDelete(scheduler, (DateTime)endTime);
}
DateTime ft = scheduler.ScheduleJob(trigger);
}
catch
{
return false;
}

if (!scheduler.IsStarted)
{
scheduler.Start();
}
return true;
}


其中 GetRequestInfo类是我封装的生产cron表达式的类,具体触发的规则可以自己定义,这里有cron表达式比较详细的讲解

我们要添加一个Job必须实现IJob的接口如:

 class IJobDeleteExpired:IJob
{
public void Execute(Quartz.JobExecutionContext context)
{
try
{
string sql = "delete from [T_RunJob] where endDateTime<='" + DateTime.Now.ToLocalTime() + "'";
SqlServerClass ssc = new SqlServerClass();
ssc.MySqlExcute(sql);
}
catch (Exception ex)
{
throw;
}
}
}

当然我们如果要停止这个工作也是可以的

 public ActionResult EndScheduler(string jobName)
{
try
{
IScheduler scheduler = SchedulerManager.GetScheduler();
if (scheduler.IsStarted)
{
//要停止工作的 工作名,工作组名
scheduler.DeleteJob(jobName,JobClassReturn.DEFAULT_GROUP);

}
return this.Json(1);
}
catch (Exception ee)
{
return this.Json(ee.Message);
}
}

好了   到这里就是初步的Quartz.NET运用

源码  猛击此处

 

posted @ 2012-03-25 00:25  wuwenhai  阅读(3930)  评论(38编辑  收藏  举报