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