定時任務框架 Quartz.NET 的簡單應用
博客園文章Id: 12659890
Quartz .NET
概述:
Quartz .NET 是一個開源的作業調度框架,非常適合在平時的工作中,定時輪詢數據庫同步,定時郵件通知,定時處理數據等。
- 定時數據庫同步。
- 定時通知。
- 定時處理數據。
Quartz .NET允許開發人員根據時間間隔(或天)來調度作業。它實現了作業和觸發器的多對多關係,還能把多個作業與不同的觸發器關聯。整合了 Quartz .NET的應用程序可以重用來自不同事件的作業,還可以爲一個事件組合多個作業。
接下來我們就來創建一個簡單的例子來說明Quartz .NET 在定時任務方面的應用,大概步驟分爲以下幾步:
- 我們需要編寫一個類用來實現某個需要進行定時執行的任務.
- 創建用於進行調度定時任務調度器.
- 通過
JobBuilder
生成一個任務Job. - 通過
TriggerBuilder
創建一個觸發器Trigger. - 將創建的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>