定時任務框架 Quartz.NET 的簡單應用

定時任務框架 Quartz.NET 的簡單應用


博客園文章Id: 12659890


Quartz .NET

概述:

Quartz .NET 是一個開源的作業調度框架,非常適合在平時的工作中,定時輪詢數據庫同步,定時郵件通知,定時處理數據等。

  • 定時數據庫同步。
  • 定時通知。
  • 定時處理數據。

Quartz .NET允許開發人員根據時間間隔(或天)來調度作業。它實現了作業和觸發器的多對多關係,還能把多個作業與不同的觸發器關聯。整合了 Quartz .NET的應用程序可以重用來自不同事件的作業,還可以爲一個事件組合多個作業。

接下來我們就來創建一個簡單的例子來說明Quartz .NET 在定時任務方面的應用,大概步驟分爲以下幾步:

  1. 我們需要編寫一個類用來實現某個需要進行定時執行的任務.
  2. 創建用於進行調度定時任務調度器.
  3. 通過JobBuilder生成一個任務Job.
  4. 通過TriggerBuilder創建一個觸發器Trigger.
  5. 將創建的Job實例和Trigger實例加入到調度器Scheduler中.

在編寫Demo之前,我們需要先進行一些準備工作:

在Visual Studio中,我們通過NuGet包管理器,需要先安裝Quartz包,此處我們安裝2.5.0版本,命令如下:

Install-Package Quartz -Version 2.5.0

在下面的示例中,主要需要用到下列三個dll程序集.

  • Common.Logging.dll
  • Common.Logging.Core.dll
  • Quartz.dll

上面的NuGet命令,已經將我們所需要的三個程序集下載到當前項目中.

使用代碼方式:

下面是代碼示例:

創建某個具體任務實現的作業:

using Quartz;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace QuartzTest
{
    /// <summary>
    /// 用於演示需要定時執行的任務
    /// </summary>
    class DemoJob : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            Console.WriteLine(string.Format("Exceute Job : 執行時間:{0}", DateTime.Now.ToString()));
        }
    }
}

創建某個具體實現的觸發器:

using Quartz;
using Quartz.Impl;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace QuartzTest
{
    /// <summary>
    /// 調度器
    /// </summary>
    class DemoScheule
    {
        public static void Start()
        {
            /*------Demo1 無參數 簡單調用的方法 -----------*/

            //實例化調度器工廠
            ISchedulerFactory schedulefactory = new StdSchedulerFactory();

            //通過調度工廠獲取一個調度器對象
            IScheduler scheduler = schedulefactory.GetScheduler();

            //啓動調度器
            scheduler.Start();

            //創建一個定時任務作業
            IJobDetail job1 = JobBuilder.Create<DemoJob>().WithIdentity("DemoJob","groupa").Build();

            //創建一個觸發器
            ITrigger trigger1 = TriggerBuilder
                .Create()
                .WithIdentity("DemoTrigger","groupa")
                .StartNow()                                 //設置每五秒執行一次,無限循環執行
                .WithSimpleSchedule(u=>u.WithIntervalInSeconds(5).RepeatForever()).Build();

            //把定時任務作業,和觸發器加入調度器
            scheduler.ScheduleJob(job1, trigger1);
        }
    }
}

調用觸發器進行定時任務的執行:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace QuartzTest
{
    class Program
    {
        static void Main(string[] args)
        {
            //調用調度器
            Console.WriteLine("Job Start");

            DemoScheule.Start();

            Console.ReadKey();

        }
    }
}

某個具體任務實現的作業(帶參數)

using Quartz;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace QuartzTest
{
    /// <summary>
    /// 用於演示需要定時執行的任務(帶參數)
    /// </summary>
    class DemoJob : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            JobDataMap dataMap = context.JobDetail.JobDataMap;

            string str = dataMap.GetString("id");  //調用數據

            Console.WriteLine(string.Format("Exceute Job :{0} 執行時間:{1}",str, DateTime.Now.ToString()));
        }
    }
}

創建某個具體實現的觸發器(帶參數):

using Quartz;
using Quartz.Impl;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace QuartzTest
{
    /// <summary>
    /// 調度器
    /// </summary>
    class DemoScheule
    {
        public static void Start()
        {
            /*------Demo1 無參數 簡單調用的方法 -----------*/

            //實例化調度器工廠
            ISchedulerFactory schedulefactory = new StdSchedulerFactory();

            //通過調度工廠獲取一個調度器對象
            IScheduler scheduler = schedulefactory.GetScheduler();

            //啓動調度器
            scheduler.Start();

            //創建一個定時任務作業
            IJobDetail job1 = JobBuilder
                .Create<DemoJob>()
                .WithIdentity("DemoJob", "groupa")
                .UsingJobData("id","1")  //裝載數據
                .Build();

            //創建一個觸發器
            ITrigger trigger1 = TriggerBuilder
                .Create()
                .WithIdentity("DemoTrigger","groupa")
                .StartNow()
                //.WithSimpleSchedule(u=>u.WithIntervalInSeconds(5).RepeatForever()) //設置每五秒執行一次,無限循環執行
                .WithSimpleSchedule(u=>u.WithIntervalInSeconds(3).WithRepeatCount(2)) //3秒執行一次執行兩次後停止, 開始運行會執行一次
                .Build();

            //把定時任務作業,和觸發器加入調度器
            scheduler.ScheduleJob(job1, trigger1);
        }
    }
}

調用觸發器進行定時任務的執行,的過程和上面是一樣的.

使用配置方式

上面我們進行任務調度都是通過代碼來實現的,當我們要修改歹毒規則的時候,就要重新編譯代碼這是很不方便的,Quartz .Net 提供了通過配置文件的方式來進行操作.

首先我們在Web.Config或app.Config裏面進行配置<Quartz></Quartz>節點的數據.

Quartz在Web.Config或App.Config中塊描述.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <!--我們需要將Quartz的塊配置聲明放到startup塊的最前面,否則會報錯.-->
  
  <configSections>
    <!--聲明Quzrtz塊-->
    <section name="Quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
  </configSections>
  
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
    </startup>

  <!--對Quartz塊的描述-->
  <Quartz>
    <add key="quartz.scheduler.instanceName" value="ServerScheduler" />

    <add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" />
    <add key="quartz.threadPool.threadCount" value="10" />
    <add key="quartz.threadPool.threadPriority" value="Normal" />

    <add key="quartz.plugin.xml.type" value = "Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz" />
    <add key="quartz.plugin.xml.fileNames" value = "quartz_jobs.xml" />

    <add key="quartz.jobStore.misfireThreshold" value="60000" />
    <add key="quartz.jobStore.type" value="Quartz.Simpl.RAMJobStore, Quartz" />
    
  </Quartz>
  
</configuration>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章