1. 程式人生 > >基於MVC 的Quartz.Net組件實現的定時執行任務調度

基於MVC 的Quartz.Net組件實現的定時執行任務調度

創建 .get 關系 成了 star +++ rep 清除 pub

新建mvc項目之後,首先引用Quartz組件。工具-->NuGet包管理器-->管理解決方案的 NuGet包管理器

技術分享圖片

組件安裝完成。

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接口TestJob類:

 public class TestJob : IJob
    {
        public static int Num = 0;
        public Task Execute(IJobExecutionContext context)
        {

            JobDataMap dataMap = context.JobDetail.JobDataMap;
            string k = dataMap.GetString("key");//獲取參數(可根據傳遞的類型使用GetInt、GetFloat、GetString.....)
            
// 在這裏處理你的任務 Task task = null; LogHelper.Info("執行了第"+ Num+++"次了"); return task; } }

接下來,我們需要實現一個trigge(觸發器),示例代碼如下:

 
public class JobScheduler {
   private static async void Start()
        {
            //從工廠中獲取一個調度器實例化
            scheduler = await
StdSchedulerFactory.GetDefaultScheduler(); await scheduler.Start(); //創建一個作業 IJobDetail job1 = JobBuilder.Create<TestJob>() .WithIdentity(jobName, gropName) .UsingJobData("key", "value")// 傳遞參數 在Execute方法中獲取(以什麽類型值傳入,取值就用相應的類型方法取值) .Build(); // 創建觸發器 ITrigger trigger1 = TriggerBuilder.Create() .WithIdentity(tiggerName, gropName) .StartNow() //現在開始 .WithSimpleSchedule(x => x //觸發時間,10秒一次。 .WithIntervalInSeconds(1) .RepeatForever()) //不間斷重復執行 .Build(); await scheduler.ScheduleJob(job1, trigger1); //把作業,觸發器加入調度器。 Console.ReadKey(); // 清除任務和觸發器 ClearJobTrigger(); } /// <summary> /// 清除任務和觸發器 /// </summary> public static void ClearJobTrigger() { TriggerKey triggerKey = new TriggerKey(tiggerName, gropName); JobKey jobKey = new JobKey(jobName, gropName); if (scheduler != null) { scheduler.PauseTrigger(triggerKey); scheduler.UnscheduleJob(triggerKey); scheduler.DeleteJob(jobKey); scheduler.Shutdown();// 關閉 } }
}

這個代碼片段你可以放在你項目程序的任何可以被調用的地方,類名你也可以隨意取,這沒有什麽關系的。只要在使用這個類時正確引用即可。

在代碼中,我們使用StdSchedulerFactory.GetDefaultScheduler()創建了一個scheduler(調度器) 並隨之 啟動了這個調度器,然後創建了一個簡單的Quartz.Net觸發器並對這個觸發器進行了一些配置:指定了觸發器的名稱為triggerName,觸發器 的分組為groupName,指定每5秒觸發一次並一直循環觸發。最後通過scheduler.ScheduleJob()方法把job(作業)和 trigger(觸發器)註冊到了調度器中,這樣一個完整的定時任務就定制完成了。

最後,我們還要做的一件事情就是啟動我們定制好的定時任務,我們把這個任務放到項目程序的全局cs文件(Global.asax)的Application_Start方法中來執行:

 public class MvcApplication : System.Web.HttpApplication
  {
    protected void Application_Start()
    {
      AreaRegistration.RegisterAllAreas();
      FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
      RouteConfig.RegisterRoutes(RouteTable.Routes);
      BundleConfig.RegisterBundles(BundleTable.Bundles);
       
      //啟動定時任務
      JobScheduler.Start();
    }
  }

技術分享圖片

基於MVC 的Quartz.Net組件實現的定時執行任務調度