- 我們這邊使用的定時任務框架是Quartz.Net,可以實現異常靈活的定時任務,開發人員只要編寫少量的代碼就可以實現“每隔一小時執行”、每天22點執行,每月18日下午執行等等各種定時任務。
- Quartz.Net中的概念:計划者(IScheduler)、工作(IJob)、觸發器(Trigger).給計划者一個工作,讓他在Trigger(什么條件下做這件事情)觸發的條件下執行這個工作。
- 將要執行的任務的代碼寫到實現IJob接口的Execute方法中即可,時間到來的時候Execute方法會被調用。
- CrondTrigger是通過Crond表達式設置的觸發器,還有SimpleTrigger等簡單的觸發器。可以通過TriggerUtils的MakeDailyTrigger、MakeHourlyTRigge等方法調用,調用代碼如下:
第一個用戶訪問我們的WebApplication的時候,Application_Start才運行。 //0 15 10 ? * *" :Fire at 10:15am every day CronTrigger trigger = new CronTrigger("trigger1", "group1", "job1", "group1"); trigger.CronExpressionString = “0 15 10 ? * *”; //上面的代碼是用表達式靈活配置任務執行時間的,很復雜也沒去了解,下面的是簡單的 //每隔一段時間執行任務 IScheduler sched; ISchedulerFactory sf = new StdSchedulerFactory(); sched = sf.GetScheduler(); JobDetail job = new JobDetail("job1", "group1", typeof(IndexJob));//IndexJob為實現了IJob接口的類 DateTime ts = TriggerUtils.GetNextGivenSecondDate(null, 5);//5秒后開始第一次運行 TimeSpan interval = TimeSpan.FromHours(1);//每隔1小時執行一次 Trigger trigger = new SimpleTrigger("trigger1", "group1", "job1", "group1", ts, null, SimpleTrigger.RepeatIndefinitely, interval);//每若干小時運行一次,小時間隔由appsettings中的IndexIntervalHour參數指定 sched.AddJob(job, true); sched.ScheduleJob(trigger); sched.Start(); 要關閉任務定時則需要sched.Shutdown(true) 在application_end中執行
實現步驟:
①引用quart.Net的DLL庫可以在這里下載:http://pan.baidu.com/s/1i5e7U5Z
②寫一個實現IJob接口的類並實現接口的方法,在此方法里面寫代碼就可以了。
③關於quartz在asp.net中的代碼如下:

namespace EazyBPMS.Web { public class Global : System.Web.HttpApplication { IScheduler sched; protected void Application_Start(object sender, EventArgs e) { //每隔一段時間執行任務 ISchedulerFactory sf = new StdSchedulerFactory(); sched = sf.GetScheduler(); JobDetail job = new JobDetail("job1", "group1", typeof(IndexJob));//IndexJob為實現了IJob接口的類 DateTime ts = TriggerUtils.GetNextGivenSecondDate(null, 5);//5秒后開始第一次運行 //第一個版本示例代碼每隔幾小時 幾分鍾 幾秒鍾執行 //TimeSpan interval = TimeSpan.FromHours(1);//每隔1小時執行一次 //Trigger trigger = new SimpleTrigger("trigger1", "group1", "job1", "group1", ts, null, // SimpleTrigger.RepeatIndefinitely, interval);//每若干小時運行一次,小時間隔由appsettings中的IndexIntervalHour參數指定 //第二個版本每天哪個時間段執行 Trigger trigger = TriggerUtils.MakeDailyTrigger("trigger1", 9, 40); trigger.JobName = "mujob"; trigger.Group = "group1"; trigger.JobGroup = "jobgroup"; //第二個版本結束 sched.AddJob(job, true); sched.ScheduleJob(trigger); sched.Start(); } protected void Session_Start(object sender, EventArgs e) { } protected void Application_BeginRequest(object sender, EventArgs e) { } protected void Application_AuthenticateRequest(object sender, EventArgs e) { } protected void Application_Error(object sender, EventArgs e) { } protected void Session_End(object sender, EventArgs e) { } protected void Application_End(object sender, EventArgs e) { sched.Shutdown(true); } } }
需要注意的是,在excute中出現異常不會在界面上拋出來會直接弄死quartz,所以要在excute里面try...catch所有異常