標籤:作業調度 包管理器 identity directory reg datetime detail highlight ==
在之前的文章《推薦一個簡單、輕量、功能非常強大的C#/ASP.NET定時任務執行管理器組件–FluentScheduler》和《簡單、輕量、功能非常強大的C#/ASP.NET定時調度任務執行管理組件–FluentScheduler之執行個體篇》中,我們認識和瞭解了FluentScheduler這款輕量的定時任務調度動作項目。今天再給大家介紹一款關於定時任務調度執行的組件–Quartz.NET,Quartz.Net是Java版Quartz的.NET實現。
相對FluentScheduler實現定時調度任務的使用簡單,配置少的特點,Quartz.Net則配置稍微複雜一些。下面我們就接合一個 ASP.NET MVC網站應用程式程式的定時執行任務調試的小執行個體來瞭解Quartz.Net的簡單用法,當然Webform的Web應用也是可以使用Quartz.Net 來作定時任務的。
首先,我們開啟Visual Studio 2015,建立一個ASP.NET MVC的Web應用程式項目,命名為QuartzNetMvcDemo:
然後通過封裝管理員控制台來安裝Quartz.Net組件:Install-Package Quartz
Quartz.Net一個最簡單任務至少包括三部分實現:job(作業),trigger(觸發器)以及scheduler(調度器)。其中job 是你需要在一個定時任務中具體執行的商務邏輯,trigger則規定job何時並按照何種規則執行,最終job和trigger會被註冊到 scheduler(調度器)中,scheduler負責協調job和trigger的運行。
在Quartz.Net中,一個job(作業)即為一個類,為了讓job能在Quartz.Net的體系中執行,我們必須實現Quartz.Net提供的IJob介面的Execute方法,如本例所實現的IJob介面ReportJob類:
using System;using Quartz;using System.IO; namespace QuartzNetMvcDemo{ public class ReportJob : IJob { public void Execute(IJobExecutionContext context) { var reportDirectory = string.Format("~/reports/{0}/", DateTime.Now.ToString("yyyy-MM")); reportDirectory = System.Web.Hosting.HostingEnvironment.MapPath(reportDirectory); if (!Directory.Exists(reportDirectory)) { Directory.CreateDirectory(reportDirectory); } var dailyReportFullPath = string.Format("{0}report_{1}.log", reportDirectory, DateTime.Now.Day); var logContent = string.Format("{0}==>>{1}{2}", DateTime.Now, "create new log.", Environment.NewLine); File.AppendAllText(dailyReportFullPath, logContent); } }}
Execute方法有一個IJobExecutionContext的介面對象作為參數,這個參數包含了定義這個類的job(作業)的配置資訊。當然,作為樣本,在本例中,我們沒有使用到這個參數。
接下來,我們需要實現一個trigge(觸發器),範例程式碼如下:
using Quartz;using Quartz.Impl; namespace QuartzNetMvcDemo{ public class ReportJobScheduler { public static void Start() { IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler(); scheduler.Start(); IJobDetail job = JobBuilder.Create<ReportJob>().Build(); ITrigger trigger = TriggerBuilder.Create() .WithIdentity("triggerName", "groupName") .WithSimpleSchedule(t => t.WithIntervalInSeconds(5) .RepeatForever()) .Build(); scheduler.ScheduleJob(job, trigger); } }}
這個程式碼片段你可以放在你項目程式的任何可以被調用的地方,類名你也可以隨意取,這沒有什麼關係的。只要在使用這個類時正確引用即可。
在代碼中,我們使用StdSchedulerFactory.GetDefaultScheduler()建立了一個scheduler(調度器) 並隨之 啟動了這個調度器,然後建立了一個簡單的Quartz.Net觸發器並對這個觸發器進行了一些配置:指定了觸發器的名稱為triggerName,觸發器 的分組為groupName,指定每5秒觸發一次並一直迴圈觸發。最後通過scheduler.ScheduleJob()方法把job(作業)和 trigger(觸發器)註冊到了調度器中,這樣一個完整的定時任務就定製完成了。
最後,我們還要做的一件事情就是啟動我們定製好的定時任務,我們把這個任務放到項目程式的全域cs檔案(Global.asax)的Application_Start方法中來執行:
1 using System.Web.Mvc; 2 using System.Web.Optimization; 3 using System.Web.Routing; 4 5 namespace QuartzNetMvcDemo 6 { 7 public class MvcApplication : System.Web.HttpApplication 8 { 9 protected void Application_Start()10 {11 AreaRegistration.RegisterAllAreas();12 FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);13 RouteConfig.RegisterRoutes(RouteTable.Routes);14 BundleConfig.RegisterBundles(BundleTable.Bundles);15 16 //啟動定時任務17 ReportJobScheduler.Start();18 }19 }20 }
好了,現在所有的操作都已完成,按下F5運行我們的ASP.NET MVC定時任務調度執行樣本程式。過一分鐘去開啟我們的記錄檔,如果程式正常運行,那麼你將看到如下的日誌
怎麼樣,Quartz.Net實現的定時執行任務調度是不是也比較簡單呢?當然,這隻是Quartz.Net的簡單樣本,Quartz.Net還有許多更進階的功能,如支援設定檔的作業調度,支援cron的作業周期等
基於ASP.NET MVC(C#)和Quartz.Net組件實現的定時執行任務調度