寫博客寫上癮了,怎么辦?
本來沒打算寫這篇隨筆,但是今天突然解決了Quartz.NET的一個問題,實在想分享一下。網(wǎng)上搜索到的一堆Quartz.NET文章,都是談如何通過配置文件來使用Quartz.NET。
我們只是想簡單使用一下,取代原來在Windows中使用的任務計劃,每天定時發(fā)兩封提醒郵件,實在不想在一堆配置中掙扎。
先簡單介紹一下Quartz.NET:
Quartz.NET是一個開源的作業(yè)調度框架,是 OpenSymphony 的 Quartz API 的.NET移植,它用C#寫成,可用于winform和asp.net應用中。它提供了巨大的靈活性而不犧牲簡單性。你能夠用它來為執(zhí)行一個作業(yè)而創(chuàng)建簡單的或復雜的調度。它有很多特征,如:數(shù)據(jù)庫支持,集群,插件,支持cron-like表達式等等。
以上簡介內容引用自leeolevis寫的“Quartz.NET作業(yè)調度框架詳解”。
下面我們用幾行代碼搞定它。
1. 定義要執(zhí)行的任務(實現(xiàn)Quartz.IJob接口),代碼如下:
public class ShiftNotify : IJob
{
public void Execute(JobExecutionContext context)
{
//在此執(zhí)行計劃任務
//比如:“時間不早了,該起床啦!”
}
}
2. 將要計劃執(zhí)行的任務加入到調度器中。
完成這一步,需要三樣東西:調度器(IScheduler)、任務(JobDetail)、觸發(fā)器(Trigger)。
由于是在Web應用程序中進行調度,代碼需要寫在Global.asax.cs的Application_Start()方法中。
a) 創(chuàng)建一個調度器(職責:如果觸發(fā)器設定的條件滿足,就讓預先定義好的任務干活):
ISchedulerFactory factory = new StdSchedulerFactory();
IScheduler scheduler = factory.GetScheduler();
scheduler.Start();
b) 創(chuàng)建一個任務(第1步已經(jīng)定義好的任務,真正干活的):
JobDetail job = new JobDetail("MyJob", typeof(ShiftNotify));
c) 創(chuàng)建一個觸發(fā)器(從什么時間開始,多長時間觸發(fā)一次):
Trigger trigger = TriggerUtils.MakeMinutelyTrigger(1);
trigger.StartTimeUtc = TriggerUtils.GetEvenMinuteDate(DateTime.UtcNow);
trigger.Name = "ShiftNotify";
第一行代碼設置的是1分鐘觸發(fā)一次。
第二行代碼設置的是開始時間。之前遇到的問題就出現(xiàn)在這里。將DateTime.UtcNow寫成了DateTime.Now,怎么也觸發(fā)不了。
d) 將任務與觸發(fā)器添加到調度器中:
scheduler.ScheduleJob(job, trigger);
好了,完工!
不需要任何配置文件,Quartz.NET就按你的指令,定時為你服務了。