quartz.net的使用
Quartz.NET簡介
Quartz.NET作業調度框架是偉大組織OpenSymphony開發的quartz scheduler項目的.net延伸移植版本。
Quartz.NET是一個開源的作業調度框架,非常適合在平時的工作中,定時輪詢數據庫同步,定時郵件通知,定時處理數據等。 Quartz.NET允許開發人員根據時間間隔(或天)來調度作業。它實現了作業和觸發器的多對多關系,還能把多個作業與不同的觸發器關聯。整合了 Quartz.NET的應用程序可以重用來自不同事件的作業,還可以為一個事件組合多個作業。支持 cron-like表達式,集群,數據庫。
下載項目官網 https://www.quartz-scheduler.net/
Quartz.NET使用入門
我的demo下載: https://github.com/yx09041/MyQuartz.git
現介紹一個簡單的示例,做一個定時任務每隔三秒輸出“我的定時任務測試”,如下:
運行結果:
創建控制臺程序,並安裝相關包
通過包管理器安裝如下包
Quartz
Common.Logging.Log4Net1211
log4net
Topshelf
Topshelf.Log4Net
項目整體結構
定義任務
定義任務實現IJob來執行對應的任務邏輯,在Execute方法裏編寫要處理的業務邏輯,系統就會按照Quartz的配置,定時處理。
如這裏任務執行的是輸出日誌“我的定時任務測試”,如有多個任務可再這裏添加多個任務類(註意要實現IJob)
using log4net; using Quartz; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MyQuartzJobs.QuartzJobs { public sealed class TestJob : IJob {private readonly ILog _logger = LogManager.GetLogger(typeof(TestJob)); public void Execute(IJobExecutionContext context) { _logger.InfoFormat("我的定時任務測試"); } } }
使用Topshelf調度任務
using Quartz; using Quartz.Impl; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Topshelf; namespace MyQuartzJobs { public sealed class ServiceRunner : ServiceControl, ServiceSuspend { private readonly IScheduler scheduler; public ServiceRunner() { scheduler = StdSchedulerFactory.GetDefaultScheduler(); } public bool Start(HostControl hostControl) { scheduler.Start(); return true; } public bool Stop(HostControl hostControl) { scheduler.Shutdown(false); return true; } public bool Continue(HostControl hostControl) { scheduler.ResumeAll(); return true; } public bool Pause(HostControl hostControl) { scheduler.PauseAll(); return true; } } }View Code
程序入口
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using Topshelf; namespace MyQuartzJobs { class Program { static void Main(string[] args) { log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config")); HostFactory.Run(x => { x.UseLog4Net(); x.Service<ServiceRunner>(); x.SetDescription("我的通用定時服務"); x.SetDisplayName("MyService"); x.SetServiceName("我的通用定時服務"); x.EnablePauseAndContinue(); }); } } }
配置配置文件
quartz.config、quartz_jobs.xml、log4net.config
設置三個文件的屬性為始終復制
quartz.config配置
quartz_jobs.xml配置 如下設置為每隔3秒執行一次
具體配置參數說明參考 quartz_jobs.xml配置
log4net.config是常用的日誌組件,配置這裏就不再介紹了
服務運行查看效果
運行exe程序可看到運行效果
安裝為windows服務
用管理員模式運行cmd命令行切換到對應的程序的目錄下運行如下命令可進行服務的安裝/啟動和卸載/;
安裝:MyQuartzJobs.exe install 啟動:MyQuartzJobs.exe start 卸載:MyQuartzJobs.exe uninstall打開windows服務查看如下,啟用即可運行
其它
quartz_jobs.xml配置
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. |
參考文章:
Quartz.net開源作業調度框架使用詳解
使用Topshelf創建Windows服務
Quartz.NET 入門
quartz.net的使用