前言
前段時間工作比較閑暇,上網閑逛發現了一個作業調度框架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運用
源碼 猛擊此處
