第四節: Quartz.Net五大構件之Trigger通用用法(常用方法、優先級、與job關聯等)


一. 簡介

1. 幾個類型:

  ①:TriggerBuilder:用來創建ITrigger實例

  ②:ITrigger:觸發器實例

2.常用的幾個方法

  ①.StartNow:Trigger馬上觸發.

  ②.StartAt和EndAt:設置Trigger觸發的開始時間和結束時間 (省略設置開始時間的話,默認從當前時間開始執行)

  ③.UsingJobData:給Trigger添加一些附加值(通過context.Trigger.JobDataMap獲取)

  ④.WithDescription:用來描述該觸發器,並沒有什么實際左右

  ⑤.WithPriority:設置Trigger的優先級,默認為5,數字越大,優先級越高.(該優先級用於一個job對應多個Trigger,且Trigger的觸發時間相同,優先級越大的越先執行)

  ⑥.ForJob:將job和trigger進行關聯,該方法有多個重載,關聯后ScheduleJob方法進行調度時,只需將trigger傳入進去即可

 

二.  Job和Trigger關聯問題

(1). 1個job對應1個trigger:調用ScheduleJob(IJobDetail jobDetail, ITrigger trigger),直接關聯即可,無須做特別處理

(2). 1個job對應多個trigger:有兩種方案解決

  方案A: 將job持久化(StoreDurably(true)),然后通過AddJob方法加入調度池中,Trigger上通過ForJob方法和指定job進行關聯,然后調用ScheduleJob(ITrigger trigger)方法,將trigger全部加入調度池中,最后Start開啟即可

  方案B: 創建job和trigger都不需要關聯,也不需要特殊設置,最后將trigger加入一個HashSet<ITrigger>池中,通過一次性通過 ScheduleJob(IJobDetail jobDetail, Collection.ISet<ITrigger> triggersForJob, bool replace)進行關聯

(3). 2個job對應1個trigger (不常用)

  利用JobChainingJobListener實現

 代碼分享:

 1             //1. 創建Schedule
 2             IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
 3             //2. 創建Job
 4             var job1 = JobBuilder.Create<HelloJob3>()
 5                     .WithIdentity("job1", "jobGroup1")
 6                     .StoreDurably(true)
 7                     .Build();
 8             var job2 = JobBuilder.Create<HelloJob>()
 9                     .WithIdentity("job2", "jobGroup2")
10                     .StoreDurably(true)
11                     .Build();
12             /********************************* 下面測試job和 Trigger的關聯問題  (與下面Trigger優先級的測試互不影響)**************************************/
13 
14             #region 情況1:1個job對應1個trigger
15             {
16                 var trigger = TriggerBuilder.Create()
17                                   .UsingJobData("name", "ypf1")   //附加信息
18                                   .UsingJobData("age", "age1")
19                                   .StartAt(DateBuilder.EvenSecondDateAfterNow()) //表示下一個秒整點開啟,比如現在9點19分20秒,那么9點20分21s整開啟 
20                                   .WithSimpleSchedule(x => x.WithIntervalInSeconds(2).RepeatForever())
21                                   .EndAt(DateTimeOffset.Now.AddSeconds(60))    //60s后結束
22                                   .Build();
23                 scheduler.ScheduleJob(job1, trigger);
24                 scheduler.Start();
25             }
26             #endregion
27 
28             #region 情況2:1個job對應多個Trigger
29             //方案1
30             {
31                 var trigger1 = TriggerBuilder.Create()
32                                  .UsingJobData("name", "ypf1")   //附加信息
33                                  .UsingJobData("age", "age1")
34                                  .StartNow()     //馬上開啟
35                                  .WithSimpleSchedule(x => x.WithIntervalInSeconds(2).RepeatForever())    //每隔兩秒執行一次
36                                  .EndAt(DateTimeOffset.Now.AddSeconds(60))    //60s后結束
37                                  .ForJob("job1", "jobGroup1")    //通過表名和組名進行關聯
38                                  .Build();
39                 var trigger2 = TriggerBuilder.Create()
40                                .UsingJobData("name", "ypf2")   //附加信息
41                                .UsingJobData("age", "age2")
42                                .StartNow()     //馬上開啟
43                                .WithSimpleSchedule(x => x.WithIntervalInSeconds(5).RepeatForever())      //每隔5秒執行一次
44                                .EndAt(DateTimeOffset.Now.AddSeconds(60))    //60s后結束
45                                .ForJob(job1)    //直接IJobDetail關聯
46                                .Build();
47 
48                 scheduler.AddJob(job1, true);
49                 scheduler.ScheduleJob(trigger1);
50                 scheduler.ScheduleJob(trigger2);
51                 scheduler.Start();
52             }
53             //方案2
54             {
55                 var trigger1 = TriggerBuilder.Create()
56                                  .UsingJobData("name", "ypf1")   //附加信息
57                                  .UsingJobData("age", "age1")
58                                  .StartNow()     //馬上開啟
59                                  .WithSimpleSchedule(x => x.WithIntervalInSeconds(2).RepeatForever())    //每隔兩秒執行一次
60                                  .EndAt(DateTimeOffset.Now.AddSeconds(60))    //60s后結束
61                                  .Build();
62                 var trigger2 = TriggerBuilder.Create()
63                                .UsingJobData("name", "ypf2")   //附加信息
64                                .UsingJobData("age", "age2")
65                                .StartNow()     //馬上開啟
66                                .WithSimpleSchedule(x => x.WithIntervalInSeconds(5).RepeatForever())      //每隔5秒執行一次
67                                .EndAt(DateTimeOffset.Now.AddSeconds(60))    //60s后結束
68                                .Build();
69 
70                 Quartz.Collection.HashSet<ITrigger> triggerHash = new Quartz.Collection.HashSet<ITrigger>();
71                 triggerHash.Add(trigger1);
72                 triggerHash.Add(trigger2);
73                 scheduler.ScheduleJob(job1, triggerHash, true);
74                 scheduler.Start();
75             }
76             #endregion
77 
78             #region 情況3:2個job對應1個trigger 
79             {
80                 //每s執行一次
81                 var trigger = TriggerBuilder.Create().WithCronSchedule("/1 * * * * ?").Build();
82 
83                 JobChainingJobListener listener = new JobChainingJobListener("mytest");
84                 listener.AddJobChainLink(job1.Key, job2.Key);
85                 scheduler.ListenerManager.AddJobListener(listener);
86 
87                 scheduler.AddJob(job2, true);
88                 scheduler.ScheduleJob(job1, trigger);
89                 scheduler.Start();
90             }
91             #endregion

 

三. Trigger的優先級(未完)

   利用WithPriority方法,該優先級用於一個job對應多個Trigger,且Trigger的觸發時間相同,優先級越大的越先執行。

 

 

 

 


免責聲明!

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



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