基於ASP.NET MVC(C#)和Quartz.Net組件實現的定時執行任務調度


在之前的文章《推薦一個簡單、輕量、功能非常強大的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的作業周期等。

如果你覺得本文對你有用的話,請點一下“推薦”吧,這樣可以更有效地幫助到他人噢!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM