第五節: Quartz.Net五大構件之Trigger的四大觸發類


一. WithSimpleSchedule(ISimpleTrigger)

1. 用途:時、分、秒上的輪詢(和timer類似),實際開發中,該場景占絕大多數.

2. 輪詢的種類:永遠輪詢和限定次數輪詢.

3. 參數中的幾個函數:

 A.執行間隔:

  ①.WithInterval(TimeSpan timeSpan):通用的間隔執行方法

  ②.WithIntervalInHours(int hours):以小時為間隔單位進行執行

  ③.WithIntervalInMinutes(int minutes):以分鍾為間隔單位進行執行

  ④.WithIntervalInSeconds(int seconds):以秒為間隔單位進行執行

 B.執行時間:

  ①.WithRepeatCount(int repeatCount):執行多少次以后結束

  ②.RepeatForever():永遠執行

  ③.repeatMinutelyForever():一分鍾執行一次(永遠執行)

      repeatMinutelyForever(int minutes):每隔幾分鍾執行一次(永遠執行)

   repeatMinutelyForTotalCount(int count, int minutes):每隔幾分鍾執行一次(執行次數為count)

  類似的還有秒、小時。

 代碼分享:

 1  public static void SimpleTriggrShow()
 2         {
 3             //1. 創建Schedule
 4             IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();      
 5             //2. 創建Job
 6             var job1 = JobBuilder.Create<HelloJob>().Build();
 7             //3. 創建Trigger
 8             //1s執行一次,永遠執行
 9             var trigger = TriggerBuilder.Create()
10                                         .WithSimpleSchedule(x => x.WithIntervalInSeconds(1).RepeatForever())
11                                         .Build();
12             //2s執行一次,執行10次
13             //var trigger = TriggerBuilder.Create()
14             //                            .WithSimpleSchedule(x => x.WithIntervalInSeconds(2).WithRepeatCount(10))
15             //                            .Build();
16             //注意這種用法:WithScheduler,表示1s執行一次,執行了5次
17             //var trigger = TriggerBuilder.Create()
18             //                            .WithSchedule(SimpleScheduleBuilder.RepeatSecondlyForTotalCount(5, 1))
19             //                            .Build();
20             //4. 開始調度
21             scheduler.ScheduleJob(job1, trigger);
22             scheduler.Start();
23         }

 

二. WithCalendarIntervalSchedule (ICalendarTrigger)

1.用途:與日歷相關

2.參數中的幾個函數:

  ①.WithInterval(TimeSpan timeSpan):通用的間隔執行方法

  ②.WithIntervalInHours(int hours):以小時為間隔單位進行執行

  ③.WithIntervalInMinutes(int minutes):以分鍾為間隔單位進行執行

  ④.WithIntervalInSeconds(int seconds):以秒為間隔單位進行執行

  ⑤.WithIntervalInDays(int days):以天為間隔單位進行執行

  ⑥.WithIntervalInMonths(int months):以月為間隔單位進行執行

代碼分享:

 1  public static void CalendarIntervalTriggerShow()
 2         {
 3             //1. 創建Schedule
 4             IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
 5             scheduler.Start();
 6             //2. 創建Job
 7             var job1 = JobBuilder.Create<HelloJob>().Build();
 8             //3. 創建Trigger
 9             //3s執行一次,60s后結束
10             var trigger = TriggerBuilder.Create()
11                                         .WithCalendarIntervalSchedule(x => x.WithIntervalInSeconds(3))
12                                         .EndAt(DateTimeOffset.Now.AddSeconds(60))    //60s后結束
13                                         .Build();
14             //4. 開始調度
15             scheduler.ScheduleJob(job1, trigger);
16         }

 

三. WithDailyTimeIntervalSchedule (IDailyTimeTrigger)

1. 用途:解決時間點的增、減、排除。

2. 核心函數:

  a. OnEveryDay:每天

  b. OnMondayThroughFriday:周一至周五,即工作日

  c. OnSaturdayAndSunday:周六至周天,即休息日

  d. OnDaysOfTheWeek:用數組的形式單獨來指定一周中的哪幾天

  e. StartingDailyAt:表示開始於幾點 (區別於前面的StartAt)

  f. EndingDailyAt:表示結束於幾點 (區別於前面的EndAt)

 代碼分享:

 1  public static void DailyTimeIntervalTriggerShow()
 2         {
 3             //1. 創建Schedule
 4             IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
 5             //2. 創建Job
 6             var job1 = JobBuilder.Create<HelloJob>().Build();
 7             //3. 創建Trigger
 8             //每天8-20點,每半個小時執行一次(即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點執行1次 (這里的設計是2點開始,2:01結束,每個一小時執行一次,說白了總共執行了一次)
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點執行1次  (這里的設計是2點開始,2:01結束,每個一小時執行一次,說白了總共執行了一次)
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. 開始調度
35             scheduler.ScheduleJob(job1, trigger1);
36             scheduler.Start();
37         }

 

四. WithCronSchedule (ICronTrigger)

1. 用途:使用cron表達式代替硬編碼,可以替代以上三種Trigger (詳見:www.cnblogs.com/knowledgesea/p/4705796.html)

2. 規則:

   a  整體規則排列如下,且日和周必須有一個位數是 ?

    * * * * * *

    秒 分 時 日 月 周

  b  ?: 代表示模糊的意思,必須存在,且只能在日或周中的一個存在

  c  *: 最小單位輪詢,在分鍾的字段域里,表示每分鍾;在小時的字段域里,表示每小時

  d  /: 表示遞增: 如0/5在秒的字段域里,表示第0、5、15、20.... 秒   可以省略0,即 /5

  e  -: 表示范圍, 如1-10在秒字段域里,表示1s、2s、3s到10s都執行

  f  ,: 表示並且, 如1,10,20在秒字段域里,表示1s,10s,20s都執行

  g #: 只能存在周這一個域,表示第幾周的星期幾,如果超出范圍,則忽略不記,如2#4,表示第四周的星期二

  h  L: 表示last的意思: 天: 10L 表示本月的倒數第十天執行, 5L 表示本月的最后一個周四執行(暫不研究)

3. 補充一下秒、分、時、日、月、周的字段域范圍

  秒: 0-59

  分: 0-59

  時: 0-23

  日: 1-31

  月: 1-12 或 JAN-DEC

  周: 1-7 或 SUN-SAT

  年:選填,可以留空, 1970-2099

4. 補充幾個事例幫助理解:

  實例1:0**1*? note:每月1號凌晨都會被執行。

  實例2:0**?** note:每分鍾的00秒被執行。

  實例3:0 10 18 ? 3 WEB note:每年3月的每個星期三,下午6點10分都會被觸發

  實例4:0 10 18 15 3 ? note:每年三月的第15天,下午6點10分都會被觸發

  實例5:0 10 18 1-5 * ? note:每月的1號到5號(包含每月1號和5號,每月共計5天都會被觸發),下午6點10分都會被觸發

  實例6:0 10-15 * ? * * note:每小時的第10分鍾到第15分鍾(包含每小時的第10分鍾和第15分鍾,每小時共計5分鍾都會被觸發),都會被觸發

  實例7:10,20 * * ? * * note:每分鍾的第10秒與第20秒都會被觸發

  實例8:0 10,20 * 1,2 * ? note:每月的第1天與第2天的,每小時的第10分鍾與第20分鍾被觸發。

  實例9:5/20 * * ? * * note:每分鍾的第5秒,第25秒,第45秒 都會被執行。

  實例10:0 * 2/2 ? * * note:每天的第2小時,第4小時,第6小時,第8小時 ... 第22小時的00分00秒都會被觸發。

  實例11:* * * ? * 3#4 note:每月的第4個星期的周2,凌晨觸發。

  實例12:* * * ? * 6#2 note:每月的第2個星期的周5,凌晨觸發

代碼分享:

 1   public static void CronTriggerShow()
 2         {
 3             //1. 創建Schedule
 4             IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
 5             scheduler.Start();
 6 
 7             //2. 創建Job
 8             var job1 = JobBuilder.Create<HelloJob>().Build();
 9 
10             //3. 創建Trigger
11 
12             //每天8-20點,每半個小時執行一次(即8:00、8:30  。。。。   19:30、20:30)
13             var trigger1 = TriggerBuilder.Create().WithCronSchedule("0 0/30 8-20 * * ?")
14                                                   .Build();
15             //每個工作日的凌晨2點執行1次     
16             var trigger2 = TriggerBuilder.Create().WithCronSchedule("0 0 2 ? * Mon-Fri")
17                                                   .Build();
18 
19             //每個周的周一和周四的2點執行1次
20             var trigger3 = TriggerBuilder.Create().WithCronSchedule("0 0 2 ? * Mon,Wes")
21                                                   .Build();
22 
23 
24             //4. 開始調度
25             scheduler.ScheduleJob(job1, trigger2);
26         }

 

 

 

 

 

 

 

 


免責聲明!

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



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