一. 簡介
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的觸發時間相同,優先級越大的越先執行。