第五节: Quartz.Net五大构件之Trigger的四大触发类
一.?WithSimpleSchedule(ISimpleTrigger)
1. 用途:時、分、秒上的輪詢(和timer類似),實際開發(fā)中,該場景占絕大多數(shù).
2. 輪詢的種類:永遠(yuǎn)輪詢和限定次數(shù)輪詢.
3. 參數(shù)中的幾個函數(shù):
?A.執(zhí)行間隔:
?、?WithInterval(TimeSpan timeSpan):通用的間隔執(zhí)行方法
?、?WithIntervalInHours(int hours):以小時為間隔單位進(jìn)行執(zhí)行
?、?WithIntervalInMinutes(int minutes):以分鐘為間隔單位進(jìn)行執(zhí)行
④.WithIntervalInSeconds(int seconds):以秒為間隔單位進(jìn)行執(zhí)行
?B.執(zhí)行時間:
?、?WithRepeatCount(int repeatCount):執(zhí)行多少次以后結(jié)束
?、?RepeatForever():永遠(yuǎn)執(zhí)行
?、?repeatMinutelyForever():一分鐘執(zhí)行一次(永遠(yuǎn)執(zhí)行)
? ?repeatMinutelyForever(int minutes):每隔幾分鐘執(zhí)行一次(永遠(yuǎn)執(zhí)行)
repeatMinutelyForTotalCount(int count, int minutes):每隔幾分鐘執(zhí)行一次(執(zhí)行次數(shù)為count)
類似的還有秒、小時。
?代碼分享:
1 public static void SimpleTriggrShow()2 {3 //1. 創(chuàng)建Schedule4 IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler(); 5 //2. 創(chuàng)建Job6 var job1 = JobBuilder.Create<HelloJob>().Build();7 //3. 創(chuàng)建Trigger8 //1s執(zhí)行一次,永遠(yuǎn)執(zhí)行9 var trigger = TriggerBuilder.Create() 10 .WithSimpleSchedule(x => x.WithIntervalInSeconds(1).RepeatForever()) 11 .Build(); 12 //2s執(zhí)行一次,執(zhí)行10次 13 //var trigger = TriggerBuilder.Create() 14 // .WithSimpleSchedule(x => x.WithIntervalInSeconds(2).WithRepeatCount(10)) 15 // .Build(); 16 //注意這種用法:WithScheduler,表示1s執(zhí)行一次,執(zhí)行了5次 17 //var trigger = TriggerBuilder.Create() 18 // .WithSchedule(SimpleScheduleBuilder.RepeatSecondlyForTotalCount(5, 1)) 19 // .Build(); 20 //4. 開始調(diào)度 21 scheduler.ScheduleJob(job1, trigger); 22 scheduler.Start(); 23 }?
二.?WithCalendarIntervalSchedule (ICalendarTrigger)
1.用途:與日歷相關(guān)
2.參數(shù)中的幾個函數(shù):
?、?WithInterval(TimeSpan timeSpan):通用的間隔執(zhí)行方法
?、?WithIntervalInHours(int hours):以小時為間隔單位進(jìn)行執(zhí)行
?、?WithIntervalInMinutes(int minutes):以分鐘為間隔單位進(jìn)行執(zhí)行
?、?WithIntervalInSeconds(int seconds):以秒為間隔單位進(jìn)行執(zhí)行
⑤.WithIntervalInDays(int days):以天為間隔單位進(jìn)行執(zhí)行
?、?WithIntervalInMonths(int months):以月為間隔單位進(jìn)行執(zhí)行
代碼分享:
1 public static void CalendarIntervalTriggerShow()2 {3 //1. 創(chuàng)建Schedule4 IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();5 scheduler.Start();6 //2. 創(chuàng)建Job7 var job1 = JobBuilder.Create<HelloJob>().Build();8 //3. 創(chuàng)建Trigger9 //3s執(zhí)行一次,60s后結(jié)束 10 var trigger = TriggerBuilder.Create() 11 .WithCalendarIntervalSchedule(x => x.WithIntervalInSeconds(3)) 12 .EndAt(DateTimeOffset.Now.AddSeconds(60)) //60s后結(jié)束 13 .Build(); 14 //4. 開始調(diào)度 15 scheduler.ScheduleJob(job1, trigger); 16 }?
三.?WithDailyTimeIntervalSchedule (IDailyTimeTrigger)
1. 用途:解決時間點的增、減、排除。
2. 核心函數(shù):
a. OnEveryDay:每天
b. OnMondayThroughFriday:周一至周五,即工作日
c. OnSaturdayAndSunday:周六至周天,即休息日
d. OnDaysOfTheWeek:用數(shù)組的形式單獨來指定一周中的哪幾天
e. StartingDailyAt:表示開始于幾點 (區(qū)別于前面的StartAt)
f. EndingDailyAt:表示結(jié)束于幾點 (區(qū)別于前面的EndAt)
?代碼分享:
1 public static void DailyTimeIntervalTriggerShow()2 {3 //1. 創(chuàng)建Schedule4 IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();5 //2. 創(chuàng)建Job6 var job1 = JobBuilder.Create<HelloJob>().Build();7 //3. 創(chuàng)建Trigger8 //每天8-20點,每半個小時執(zhí)行一次(即8:00、8:30 。。。。 19:30、20:30)9 var trigger1 = TriggerBuilder.Create().WithDailyTimeIntervalSchedule( 10 x => x.OnEveryDay() 11 .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(8, 00)) 12 .EndingDailyAt(TimeOfDay.HourAndMinuteOfDay(20, 00)) 13 .WithIntervalInMinutes(30)) 14 .Build(); 15 16 //每個工作日的凌晨2點執(zhí)行1次 (這里的設(shè)計是2點開始,2:01結(jié)束,每個一小時執(zhí)行一次,說白了總共執(zhí)行了一次) 17 //或者直接WithIntervalInHours替換成WithRepeatCount 18 var trigger2 = TriggerBuilder.Create().WithDailyTimeIntervalSchedule( 19 x => x.OnMondayThroughFriday() 20 .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(2, 00)) 21 .EndingDailyAt(TimeOfDay.HourAndMinuteOfDay(2, 01)) 22 .WithIntervalInHours(1)) 23 .Build(); 24 25 //每個周的周一和周四的2點執(zhí)行1次 (這里的設(shè)計是2點開始,2:01結(jié)束,每個一小時執(zhí)行一次,說白了總共執(zhí)行了一次) 26 //或者直接WithIntervalInHours替換成WithRepeatCount 27 var trigger3 = TriggerBuilder.Create().WithDailyTimeIntervalSchedule( 28 x => x.OnDaysOfTheWeek(new DayOfWeek[2] { 29 DayOfWeek.Monday, DayOfWeek.Thursday }) 30 .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(2, 00)) 31 .EndingDailyAt(TimeOfDay.HourAndMinuteOfDay(2, 01)) 32 .WithIntervalInHours(1)) 33 .Build(); 34 //4. 開始調(diào)度 35 scheduler.ScheduleJob(job1, trigger1); 36 scheduler.Start(); 37 }?
四.?WithCronSchedule (ICronTrigger)
1. 用途:使用cron表達(dá)式代替硬編碼,可以替代以上三種Trigger (詳見:www.cnblogs.com/knowledgesea/p/4705796.html)
2. 規(guī)則:
? a ?整體規(guī)則排列如下,且日和周必須有一個位數(shù)是 ?
* * * * * *
秒 分 時 日 月 周
b ??: 代表示模糊的意思,必須存在,且只能在日或周中的一個存在
c ?*: 最小單位輪詢,在分鐘的字段域里,表示每分鐘;在小時的字段域里,表示每小時
d ?/: 表示遞增: 如0/5在秒的字段域里,表示第0、5、15、20.... 秒 ? 可以省略0,即 /5
e ?-: 表示范圍, 如1-10在秒字段域里,表示1s、2s、3s到10s都執(zhí)行
f ?,: 表示并且, 如1,10,20在秒字段域里,表示1s,10s,20s都執(zhí)行
g #: 只能存在周這一個域,表示第幾周的星期幾,如果超出范圍,則忽略不記,如2#4,表示第四周的星期二
h ?L: 表示last的意思: 天: 10L 表示本月的倒數(shù)第十天執(zhí)行, 5L 表示本月的最后一個周四執(zhí)行(暫不研究)
3. 補(bǔ)充一下秒、分、時、日、月、周的字段域范圍
秒: 0-59
分: 0-59
時: 0-23
日: 1-31
月: 1-12 或 JAN-DEC
周: 1-7 或 SUN-SAT
年:選填,可以留空, 1970-2099
4. 補(bǔ)充幾個事例幫助理解:
實例1:0**1*? note:每月1號凌晨都會被執(zhí)行。
實例2:0**?** note:每分鐘的00秒被執(zhí)行。
實例3:0 10 18 ? 3 WEB note:每年3月的每個星期三,下午6點10分都會被觸發(fā)
實例4:0 10 18 15 3 ? note:每年三月的第15天,下午6點10分都會被觸發(fā)
實例5:0 10 18 1-5 * ? note:每月的1號到5號(包含每月1號和5號,每月共計5天都會被觸發(fā)),下午6點10分都會被觸發(fā)
實例6:0 10-15 * ? * * note:每小時的第10分鐘到第15分鐘(包含每小時的第10分鐘和第15分鐘,每小時共計5分鐘都會被觸發(fā)),都會被觸發(fā)
實例7:10,20 * * ? * * note:每分鐘的第10秒與第20秒都會被觸發(fā)
實例8:0 10,20 * 1,2 * ? note:每月的第1天與第2天的,每小時的第10分鐘與第20分鐘被觸發(fā)。
實例9:5/20 * * ? * * note:每分鐘的第5秒,第25秒,第45秒 都會被執(zhí)行。
實例10:0 * 2/2 ? * * note:每天的第2小時,第4小時,第6小時,第8小時 ... 第22小時的00分00秒都會被觸發(fā)。
實例11:* * * ? * 3#4 note:每月的第4個星期的周2,凌晨觸發(fā)。
實例12:* * * ? * 6#2 note:每月的第2個星期的周5,凌晨觸發(fā)
代碼分享:
1 public static void CronTriggerShow()2 {3 //1. 創(chuàng)建Schedule4 IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();5 scheduler.Start();6 7 //2. 創(chuàng)建Job8 var job1 = JobBuilder.Create<HelloJob>().Build();9 10 //3. 創(chuàng)建Trigger 11 12 //每天8-20點,每半個小時執(zhí)行一次(即8:00、8:30 。。。。 19:30、20:30) 13 var trigger1 = TriggerBuilder.Create().WithCronSchedule("0 0/30 8-20 * * ?") 14 .Build(); 15 //每個工作日的凌晨2點執(zhí)行1次 16 var trigger2 = TriggerBuilder.Create().WithCronSchedule("0 0 2 ? * Mon-Fri") 17 .Build(); 18 19 //每個周的周一和周四的2點執(zhí)行1次 20 var trigger3 = TriggerBuilder.Create().WithCronSchedule("0 0 2 ? * Mon,Wes") 21 .Build(); 22 23 24 //4. 開始調(diào)度 25 scheduler.ScheduleJob(job1, trigger2); 26 }?
?
總結(jié)
以上是生活随笔為你收集整理的第五节: Quartz.Net五大构件之Trigger的四大触发类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 71亿罚款裁决推翻 高通被冤枉4年后:终
- 下一篇: 可转债中签一般能中多少股?提高中签率的3