C#小技巧–使用Quartz實現(xiàn)定時任務(wù)
Quartz.net 簡介
Quartz.NET是一個開源的作業(yè)調(diào)度框架,非常適合在平時的工作中,定時輪詢數(shù)據(jù)庫同步,定時郵件通知,定時處理數(shù)據(jù)等。
Quartz.NET允許開發(fā)人員根據(jù)時間間隔(或天)來調(diào)度作業(yè)。它實現(xiàn)了作業(yè)和觸發(fā)器的多對多關(guān)系,還能把多個作業(yè)與不同的觸發(fā)器關(guān)聯(lián)。整合了Quartz.NET的應(yīng)用程序可以重用來自不同事件的作業(yè),還可以為一個事件組合多個作業(yè)。
Quartz的基本組成部分
調(diào)度器:Scheduler 任務(wù):JobDetail 觸發(fā)器:Trigger,包括SimpleTrigger和CronTrigger
給計劃者一個工作,讓它在什么時間下執(zhí)行這個工作。
任務(wù)的實現(xiàn)
將要定時執(zhí)行的任務(wù)代碼寫到Ijob接口實現(xiàn)的Excute方法中,時間到后會自動執(zhí)行這個任務(wù)。
參考
官方學(xué)習(xí)文檔: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類,實現(xiàn)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.創(chuàng)建Schedule,執(zhí)行任務(wù)
using System;
using System.Threading.Tasks;
using Quartz;
using Quartz.Impl;
namespace RuanMou.AwaitAsync.ConsoleProject
{
class Program
{
static void Main(string[] args)
{
//1.創(chuàng)建調(diào)度單元
Task<IScheduler> tsk = StdSchedulerFactory.GetDefaultScheduler();
IScheduler scheduler = tsk.Result;
//2.創(chuàng)建一個具體的作業(yè)即job(具體的job需要單獨在一個文件中執(zhí)行)
IJobDetail job = JobBuilder.Create<TestJob>().WithIdentity("完成").Build();
//3.創(chuàng)建并配置一個觸發(fā)器trigger,
ITrigger _CtroTrigger = TriggerBuilder.Create()
.WithIdentity("定時確認")
.WithCronSchedule("0 51 16 ? * * ")
.Build()
as ITrigger;
//4.將job和trigger加入到作業(yè)調(diào)度池中
scheduler.ScheduleJob(job, _CtroTrigger);
//5.開啟調(diào)度
scheduler.Start();
Console.ReadLine();
}
}
}
4.執(zhí)行結(jié)果
job 任務(wù)介紹
其實就是1.x版本中的,這個節(jié)點是用來定義每個具體的任務(wù)的,多個任務(wù)請創(chuàng)建多個job節(jié)點即可
- name(必填) 任務(wù)名稱,同一個group中多個job的name不能相同,若未設(shè)置group則所有未設(shè)置group的job為同一個分組,如:sampleJob
- group(選填) 任務(wù)所屬分組,用于標識任務(wù)所屬分組,如:sampleGroup
- description(選填) 任務(wù)描述,用于描述任務(wù)具體內(nèi)容,如:Sample job for Quartz Server
- job-type(必填) 任務(wù)類型,任務(wù)的具體類型及所屬程序集,格式:實現(xiàn)了IJob接口的包含完整命名空間的類名,程序集名稱,如:Quartz.Server.SampleJob,
Quartz.Server- durable(選填) 具體作用不知,官方示例中默認為true,如:true
- recover(選填) 具體作用不知,官方示例中默認為false,如:false
trigger 任務(wù)觸發(fā)器介紹
用于定義使用何種方式出發(fā)任務(wù)(job),同一個job可以定義多個trigger ,多個trigger 各自獨立的執(zhí)行調(diào)度,每個trigger 中必須且只能定義一種觸發(fā)器類型(calendar-interval、simple、cron)
calendar-interval 一種觸發(fā)器類型,使用較少,此處略過
simple 簡單任務(wù)的觸發(fā)器,可以調(diào)度用于重復(fù)執(zhí)行的任務(wù)
- name(必填) 觸發(fā)器名稱,同一個分組中的名稱必須不同
- group(選填) 觸發(fā)器組
- description(選填) 觸發(fā)器描述
- job-name(必填) 要調(diào)度的任務(wù)名稱,該job-name必須和對應(yīng)job節(jié)點中的name完全相同
- job-group(選填) 調(diào)度任務(wù)(job)所屬分組,該值必須和job中的group完全相同
- start-time(選填)
任務(wù)開始執(zhí)行時間utc時間,北京時間需要+08:00,如:2012-04-01T08:00:00+08:00表示北京時間2012年4月1日上午8:00開始執(zhí)行,注意服務(wù)啟動或重啟時都會檢測此屬性,若沒有設(shè)置此屬性或者start-time設(shè)置的時間比當前時間較早,則服務(wù)啟動后會立即執(zhí)行一次調(diào)度,若設(shè)置的時間比當前時間晚,服務(wù)會等到設(shè)置時間相同后才會第一次執(zhí)行任務(wù),一般若無特殊需要請不要設(shè)置此屬性 - repeat-count(必填)
任務(wù)執(zhí)行次數(shù),如:-1表示無限次執(zhí)行,10表示執(zhí)行10次 - repeat-interval(必填)
任務(wù)觸發(fā)間隔(毫秒),如:10000 每10秒執(zhí)行一次
cron復(fù)雜任務(wù)觸發(fā)器–使用cron表達式定制任務(wù)調(diào)度(強烈推薦)
- name(必填) 觸發(fā)器名稱,同一個分組中的名稱必須不同
- group(選填) 觸發(fā)器組d
- escription(選填) 觸發(fā)器描述
- job-name(必填) 要調(diào)度的任務(wù)名稱,該job-name必須和對應(yīng)job節(jié)點中的name完全相同
- job-group(選填) 調(diào)度任務(wù)(job)所屬分組,該值必須和job中的group完全相同
- start-time(選填) 任務(wù)開始執(zhí)行時間utc時間,北京時間需要+08:00,如:2012-04-01T08:00:00+08:00表示北京時間2012年4月1日上午8:00開始執(zhí)行,注意服務(wù)啟動或重啟時都會檢測此屬性,若沒有設(shè)置此屬性,服務(wù)會根據(jù)cron-expression的設(shè)置執(zhí)行任務(wù)調(diào)度;若start-time設(shè)置的時間比當前時間較早,則服務(wù)啟動后會忽略掉cron-expression設(shè)置,立即執(zhí)行一次調(diào)度,之后再根據(jù)cron-expression執(zhí)行任務(wù)調(diào)度;若設(shè)置的時間比當前時間晚,則服務(wù)會在到達設(shè)置時間相同后才會應(yīng)用cron-expression,根據(jù)規(guī)則執(zhí)行任務(wù)調(diào)度,一般若無特殊需要請不要設(shè)置此屬性
- cron-expression(必填) cron表達式,如:0/10 * * * * ?每10秒執(zhí)行一次
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段構(gòu)成:秒 分 時 日 月 星期 年(可選)
"-" :表示范圍 MON-WED表示星期一到星期三
"," :表示列舉 MON,WEB表示星期一和星期三
"*" :表是“每”,每月,每天,每周,每年等
"/" :表示增量:0/15(處于分鐘段里面) 每15分鐘,在0分以后開始,3/20 每20分鐘,從3分鐘以后開始
"?" :只能出現(xiàn)在日,星期段里面,表示不指定具體的值
"L" :只能出現(xiàn)在日,星期段里面,是Last的縮寫,一個月的最后一天,一個星期的最后一天(星期六)
"W" :表示工作日,距離給定值最近的工作日
"#" :表示一個月的第幾個星期幾,例如:"6#3"表示每個月的第三個星期五(1=SUN...6=FRI,7=SAT
)文章來源:http://www.zghlxwxcb.cn/news/detail-716366.html
官方實例文章來源地址http://www.zghlxwxcb.cn/news/detail-716366.html
Expression | Meaning |
---|---|
0 0 12 * * ? | 每天中午12點觸發(fā) |
0 15 10 ? * * | 每天上午10:15觸發(fā) |
0 15 10 * * ? | 每天上午10:15觸發(fā) |
0 15 10 * * ? * | 每天上午10:15觸發(fā) |
0 15 10 * * ? 2005 | 2005年的每天上午10:15觸發(fā) |
0 * 14 * * ? | 在每天下午2點到下午2:59期間的每1分鐘觸發(fā) |
0 0/5 14 * * ? | 在每天下午2點到下午2:55期間的每5分鐘觸發(fā) |
0 0/5 14,18 * * ? | 在每天下午2點到2:55期間和下午6點到6:55期間的每5分鐘觸發(fā) |
0 0-5 14 * * ? | 在每天下午2點到下午2:05期間的每1分鐘觸發(fā) |
0 10,44 14 ? 3 WED | 每年三月的星期三的下午2:10和2:44觸發(fā) |
0 15 10 ? * MON-FRI | 周一至周五的上午10:15觸發(fā) |
0 15 10 15 * ? | 每月15日上午10:15觸發(fā) |
0 15 10 L * ? | 每月最后一日的上午10:15觸發(fā) |
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觸發(fā) |
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觸發(fā) |
0 15 10 ? * 6#3 | 每月的第三個星期五上午10:15觸發(fā) |
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. |
到了這里,關(guān)于C#--使用Quartz實現(xiàn)定時任務(wù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!