在之前的文章《推薦一個簡單、輕量、功能非常強大的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組件,如下:
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方法中來執行:
using System.Web.Mvc; using System.Web.Optimization; using System.Web.Routing; namespace QuartzNetMvcDemo { public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); //啟動定時任務 ReportJobScheduler.Start(); } } }
好了,現在所有的操作都已完成,按下F5運行我們的ASP.NET MVC定時任務調度執行示例程序。過一分鍾去打開我們的日志文件,如果程序正常運行,那么你將看到如下的日志:
怎么樣,Quartz.Net實現的定時執行任務調度是不是也比較簡單呢?當然,這只是Quartz.Net的簡單示例,Quartz.Net還有許多更高級的功能,如支持配置文件的作業調度,支持cron的作業周期等。
如果你覺得本文對你有用的話,請點一下“推薦”吧,這樣可以更有效地幫助到他人噢!!!