C#小技巧--Quartz實現定時任務


Quartz.net 簡介

Quartz.NET是一個開源的作業調度框架,非常適合在平時的工作中,定時輪詢數據庫同步,定時郵件通知,定時處理數據等。 Quartz.NET允許開發人員根據時間間隔(或天)來調度作業。它實現了作業和觸發器的多對多關系,還能把多個作業與不同的觸發器關聯。整合了 Quartz.NET的應用程序可以重用來自不同事件的作業,還可以為一個事件組合多個作業。

Quartz的基本組成部分

調度器:Scheduler
任務:JobDetail
觸發器:Trigger,包括SimpleTrigger和CronTrigger
給計划者一個工作,讓它在什么時間下執行這個工作。

任務的實現

將要定時執行的任務代碼寫到Ijob接口實現的Excute方法中,時間到后會自動執行這個任務。

參考

官方學習文檔:http://www.quartz-scheduler.net/documentation/index.html

使用實例介紹:http://www.quartz-scheduler.net/documentation/quartz-2.x/quick-start.html

官方的源代碼下載:http://sourceforge.net/projects/quartznet/files/quartznet/

Demo搭建

1.新建控制台程序,nuget添加Quartz.net 的引用

2.新建job類,實現IJob接口

using Quartz;
using System;
using System.Threading.Tasks;

namespace RuanMou.AwaitAsync.ConsoleProject
{
    public class TestJob : IJob
    {
        public async Task Execute(IJobExecutionContext context)
        {
            await Task.Run(()=> 
            {
                Console.WriteLine($"當前時間:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
                Console.WriteLine("Hello!");
            });
        }
    }
}

3.創建Schedule,執行任務

using System;
using System.Threading.Tasks;
using Quartz;
using Quartz.Impl;

namespace RuanMou.AwaitAsync.ConsoleProject
{
    class Program
    {
        static void Main(string[] args)
        {
            //1.創建調度單元
            Task<IScheduler> tsk = StdSchedulerFactory.GetDefaultScheduler();
            IScheduler scheduler = tsk.Result;
            //2.創建一個具體的作業即job(具體的job需要單獨在一個文件中執行)
            IJobDetail job = JobBuilder.Create<TestJob>().WithIdentity("完成").Build();
            //3.創建並配置一個觸發器trigger,
            ITrigger _CtroTrigger = TriggerBuilder.Create()
                .WithIdentity("定時確認")
                .WithCronSchedule("0 51 16 ? * * ")
                .Build()
                as ITrigger;
            //4.將job和trigger加入到作業調度池中
            scheduler.ScheduleJob(job, _CtroTrigger);
            //5.開啟調度
            scheduler.Start();
            Console.ReadLine();
        }
    }
}

4.執行結果

 

job 任務

其實就是1.x版本中的<job-detail>,這個節點是用來定義每個具體的任務的,多個任務請創建多個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)

calendar-interval 一種觸發器類型,使用較少,此處略過

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秒執行一次

Quartz的cron表達式

 官方英文介紹地址:http://www.quartz-scheduler.net/documentation/quartz-2.x/tutorial/crontrigger.html

cron expressions 整體上還是非常容易理解的,只有一點需要注意:"?"號的用法,看下文可以知道“?”可以用在 day of month 和 day of week中,他主要是為了解決如下場景,如:每月的1號的每小時的31分鍾,正確的表達式是:* 31 * 1 * ?,而不能是:* 31 * 1 * *,因為這樣代表每周的任意一天。


由7段構成:秒 分 時 日 月 星期 年(可選)
"-" :表示范圍  MON-WED表示星期一到星期三
"," :表示列舉 MON,WEB表示星期一和星期三
"*" :表是“每”,每月,每天,每周,每年等
"/" :表示增量:0/15(處於分鍾段里面) 每15分鍾,在0分以后開始,3/20 每20分鍾,從3分鍾以后開始
"?" :只能出現在日,星期段里面,表示不指定具體的值
"L" :只能出現在日,星期段里面,是Last的縮寫,一個月的最后一天,一個星期的最后一天(星期六)
"W" :表示工作日,距離給定值最近的工作日
"#" :表示一個月的第幾個星期幾,例如:"6#3"表示每個月的第三個星期五(1=SUN...6=FRI,7=SAT)

官方實例

Expression Meaning
0 0 12 * * ? 每天中午12點觸發
0 15 10 ? * * 每天上午10:15觸發
0 15 10 * * ? 每天上午10:15觸發
0 15 10 * * ? * 每天上午10:15觸發
0 15 10 * * ? 2005 2005年的每天上午10:15觸發
0 * 14 * * ? 在每天下午2點到下午2:59期間的每1分鍾觸發
0 0/5 14 * * ? 在每天下午2點到下午2:55期間的每5分鍾觸發
0 0/5 14,18 * * ? 在每天下午2點到2:55期間和下午6點到6:55期間的每5分鍾觸發
0 0-5 14 * * ? 在每天下午2點到下午2:05期間的每1分鍾觸發
0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44觸發
0 15 10 ? * MON-FRI 周一至周五的上午10:15觸發
0 15 10 15 * ? 每月15日上午10:15觸發
0 15 10 L * ? 每月最后一日的上午10:15觸發
0 15 10 L-2 * ? Fire at 10:15am on the 2nd-to-last last day of every month
0 15 10 ? * 6L 每月的最后一個星期五上午10:15觸發
0 15 10 ? * 6L Fire at 10:15am on the last Friday of every month
0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一個星期五上午10:15觸發
0 15 10 ? * 6#3 每月的第三個星期五上午10:15觸發
0 0 12 1/5 * ? Fire at 12pm (noon) every 5 days every month, starting on the first day of the month.
0 11 11 11 11 ? Fire every November 11th at 11:11am.
 
 

源碼下載及可能需要了解的資料

源碼下載:http://download.csdn.net/download/jys1216/8882315

Topself介紹:http://www.cnblogs.com/jys509/p/4614975.html

Log4Net介紹:http://www.cnblogs.com/jys509/p/4569874.html

 

參考:https://www.cnblogs.com/jys509/p/4628926.html

      https://blog.csdn.net/gods_boy/article/details/106797468?utm_medium=distribute.wap_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0.wap_blog_relevant_default&spm=1001.2101.3001.4242.1


免責聲明!

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



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