定时调度框架:Quartz.net
生活随笔
收集整理的這篇文章主要介紹了
定时调度框架:Quartz.net
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Quartz.net相關概念
經常出現場景:定時輪詢數據庫同步,定時郵件通知,定時處理數據等
- Scheduler (計劃者或調度器)
- Job (工作對象):將要定時執行的任務代碼寫到實現Ijob接口的Execute方法中即可
- Trigger(觸發器):什么條件情況下觸發
其中常用的觸發器有:
基于代碼形式實現
一、實現IJob,在Execute方法里編寫要處理的業務邏輯,系統就會按照Quartz的配置,定時處理。
using Quartz; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace QuarztDemo1 {public class TestJob:IJob{public void Execute(IJobExecutionContext context){Console.WriteLine(DateTime.Now.ToString());}} }二、調度任務
1、創建調度工廠(); ? ?//工廠模式 2、根據工廠取得調度器實例(); ?//工廠模式 3、Builder模式構建子組件<Job,Trigger> ?//?builder模式, 如JobBuilder、TriggerBuilder、DateBuilder 4、通過調度器組裝子組件 ? 調度器.組裝<子組件1,子組件2...> ?//工廠模式 5、調度器.start();?//工廠模式 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Quartz; using Quartz.Impl;namespace QuarztDemo1 {class Program{static void Main(string[] args){//1.首先創建一個作業調度池ISchedulerFactory schedf = new StdSchedulerFactory();IScheduler sched = schedf.GetScheduler();//2.創建出來一個具體的作業IJobDetail job = JobBuilder.Create<TestJob>().Build();//3.創建并配置一個觸發器#region(使用ISimpleTrigger觸發器,每次3秒執行一次,無上限)//ISimpleTrigger trigger = (ISimpleTrigger)TriggerBuilder.Create().WithSimpleSchedule(x => x.WithIntervalInSeconds(3).WithRepeatCount(int.MaxValue)).Build();#endregion#region 每3秒執行一次 總共5次 ,開始執行時間設定在當前時間,結束時間我設定在2小時后,不過5次執行完沒2小時候都不再執行。//-------NextGivenSecondDate:如果第一個參數為null則表名當前時間往后推遲2秒的時間點。//DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddSeconds(5), 2);//DateTimeOffset endTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddHours(2), 3);//ISimpleTrigger trigger = (ISimpleTrigger)TriggerBuilder.Create().StartAt(startTime).EndAt(endTime)// .WithSimpleSchedule(x => x.WithIntervalInSeconds(3).WithRepeatCount(5))// .Build();#endregion#region (使用CronTrigger 觸發器)在每小時的第10,20,25,26,33,54分鐘,每分鐘的第1,10,14秒執行一次DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddSeconds(1), 2);DateTimeOffset endTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddYears(2), 3);ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create().StartAt(startTime).EndAt(endTime).WithCronSchedule("1,10,59 10,20,21,26,33,54 * * * ? ").Build();#endregion//4.加入作業調度池中 sched.ScheduleJob(job, trigger);//5.開始運行 sched.Start();Console.ReadKey();}} }?基于配置文件形式
配置app.config或web.config 文件
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections><section name="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"/><sectionGroup name="common"><section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging"/></sectionGroup></configSections><startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /></startup> <quartz><add key="quartz.scheduler.instanceName" value="ExampleDefaultQuartzScheduler"/><add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz"/><add key="quartz.threadPool.threadCount" value="10"/><add key="quartz.threadPool.threadPriority" value="2"/><add key="quartz.jobStore.misfireThreshold" value="60000"/><add key="quartz.jobStore.type" value="Quartz.Simpl.RAMJobStore, Quartz"/><!--******************************Plugin配置********************************************* --><add key="quartz.plugin.xml.type" value="Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz" /><add key="quartz.plugin.xml.fileNames" value="~/quartz_jobs.xml"/> <!--指向指定的jobs.xml --> </quartz></configuration>
?quartz_jobs.xml文件
<?xml version="1.0" encoding="UTF-8"?><job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"version="2.0"><processing-directives><overwrite-existing-data>true</overwrite-existing-data></processing-directives><schedule> <job><name>jobName1</name><group>jobGroup1</group><description>jobDesciption1</description><job-type>QuarztDemo1.TestJob, QuarztDemo1</job-type><durable>true</durable><recover>false</recover></job><trigger><simple> <!--SimpleTrigger觸發器-->?<name>simpleName</name><group>simpleGroup</group><description>SimpleTriggerDescription</description><job-name>jobName1</job-name><job-group>jobGroup1</job-group><start-time>1982-06-28T18:15:00.0Z</start-time><end-time>2020-05-04T18:13:51.0Z</end-time><repeat-count>10</repeat-count><repeat-interval>3000</repeat-interval></simple></trigger></schedule></job-scheduling-data>
其中觸發器也可以是Cron復雜任務觸發器,代碼如下
<trigger><cron><name>TestJobTrigger</name><group>Test</group><job-name>TestJob</job-name><job-group>Test</job-group><start-time>2015-01-22T00:00:00+08:00</start-time><cron-expression>0/3 * * * * ?</cron-expression></cron></trigger>Main方法代碼修改為:
ISchedulerFactory sf = new StdSchedulerFactory(); IScheduler scheduler = sf.GetScheduler(); scheduler.Start();?
節點釋義:
job 任務
- name(必填) 任務名稱,同一個group中多個job的name不能相同,若未設置group則所有未設置group的job為同一個分組,如:<name>sampleJob</name>
- group(選填) 任務所屬分組,用于標識任務所屬分組,如:<group>sampleGroup</group>
- description(選填) 任務描述,用于描述任務具體內容,如:<description>Sample job for Quartz Server</description>
- job-type(必填) 任務類型,任務的具體類型及所屬程序集,格式:實現了IJob接口的包含完整命名空間的類名,程序集名稱,如:<job-type>Quartz.Server.SampleJob, Quartz.Server</job-type>
- durable(選填) 具體作用不知,官方示例中默認為true,如:<durable>true</durable>
- recover(選填) 具體作用不知,官方示例中默認為false,如:<recover>false</recover>
trigger 任務觸發器
用于定義使用何種方式出發任務(job),同一個job可以定義多個trigger ,多個trigger 各自獨立的執行調度,每個trigger 中必須且只能定義一種觸發器類型(calendar-interval、simple、cron)
simple 簡單任務的觸發器,可以調度用于重復執行的任務
- name(必填) 觸發器名稱,同一個分組中的名稱必須不同
- group(選填) 觸發器組
- description(選填) 觸發器描述
- job-name(必填) 要調度的任務名稱,該job-name必須和對應job節點中的name完全相同
- job-group(選填) 調度任務(job)所屬分組,該值必須和job中的group完全相同
- start-time(選填) 任務開始執行時間utc時間,北京時間需要+08:00,如:<start-time>2012-04-01T08:00:00+08:00</start-time>表示北京時間2012年4月1日上午8:00開始執行,注意服務啟動或重啟時都會檢測此屬性,若沒有設置此屬性或者start-time設置的時間比當前時間較早,則服務啟動后會立即執行一次調度,若設置的時間比當前時間晚,服務會等到設置時間相同后才會第一次執行任務,一般若無特殊需要請不要設置此屬性
- repeat-count(必填)? 任務執行次數,如:<repeat-count>-1</repeat-count>表示無限次執行,<repeat-count>10</repeat-count>表示執行10次
- repeat-interval(必填) 任務觸發間隔(毫秒),如:<repeat-interval>10000</repeat-interval> 每10秒執行一次
cron復雜任務觸發器--使用cron表達式定制任務調度(強烈推薦)
- name(必填) 觸發器名稱,同一個分組中的名稱必須不同
- group(選填) 觸發器組d
- escription(選填) 觸發器描述
- job-name(必填) 要調度的任務名稱,該job-name必須和對應job節點中的name完全相同
- job-group(選填) 調度任務(job)所屬分組,該值必須和job中的group完全相同
- start-time(選填) 任務開始執行時間utc時間,北京時間需要+08:00,如:<start-time>2012-04-01T08:00:00+08:00</start-time>表示北京時間2012年4月1日上午8:00開始執行,注意服務啟動或重啟時都會檢測此屬性,若沒有設置此屬性,服務會根據cron-expression的設置執行任務調度;若start-time設置的時間比當前時間較早,則服務啟動后會忽略掉cron-expression設置,立即執行一次調度,之后再根據cron-expression執行任務調度;若設置的時間比當前時間晚,則服務會在到達設置時間相同后才會應用cron-expression,根據規則執行任務調度,一般若無特殊需要請不要設置此屬性
- cron-expression(必填) cron表達式,如:<cron-expression>0/10 * * * * ?</cron-expression>每10秒執行一次
轉載于:https://www.cnblogs.com/qiuguochao/p/7129044.html
總結
以上是生活随笔為你收集整理的定时调度框架:Quartz.net的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL缓存之Qcache与buffe
- 下一篇: UE4 Run On Server与Ru