第五課 SimpleTrigger併發
若是你須要在一個指定時間段內執行一次做業任務或是在指定的時間間隔內屢次執行做業任務,SimpleTrigger應該能知足你的調度需求。例如,你但願觸發器在2015年1月13日上午11:23:54準時觸發,或是但願在那個時間點觸發,而後再重複觸發5次,每隔10秒一次。有了這樣的描述,你就不會對SimpleTrigger包含的參數感到奇怪:開始執行時間,結束執行時間,重複次數和重複執行間隔時間。全部的參數都是你指望的那樣,只是關於結束執行時間參數有兩條特別的提示。ide
重複次數能夠爲0,正整數或是SimpleTrigger.REPEAT_INDEFINITELY常量值。重複執行間隔必須爲0或長整數(long類型),它表示毫秒數的值。注意若是重複執行間隔時間爲0會致使數量爲「重複次數」的觸發器併發執行(或是在調度器控制下接近併發執行)。ui
若是你還不熟悉Quartz的DateBuilder類,你嘗試建立日期對象時會發現它很是方便地根據startTimeUtc 或 endTimeUtc參數計算觸發器的觸發時間。this
EndTimeUtc參數(若是被指定)會覆蓋重複次數參數的效果。當你但願建立一個觸發器,每隔10秒被觸發一次直到給定的截止時間,而不是必須完成在給定的開始和結束時間段內的觸發次數,使用endTime參數會很是方便,你能夠僅僅指定一個end-time參數,而且將重複次數設置爲REPEAT_INDEFINITELY(你甚至能夠將重複次數指定爲很是大的值,確保比結束執行時間到達前實際要執行的次數大就行)。spa
下面是使用簡易調度器定義觸發器的幾個案例,請通讀一遍,每一個例子都至少展現了一個新的、不一樣的知識點:
建立觸發器時指定具體的時間,不重複執行:設計
1 // trigger builder creates simple trigger by default, actually an ITrigger is returned 2 ISimpleTrigger trigger = (ISimpleTrigger) TriggerBuilder.Create() 3 .WithIdentity("trigger1", "group1") 4 .StartAt(myStartTime) // some Date 5 .ForJob("job1", "group1") // identify job with name, group strings 6 .Build();
建立觸發器時指定具體的時間,而後每隔10秒觸發一次,共重複觸發10次:code
1 trigger = TriggerBuilder.Create() 2 .WithIdentity("trigger3", "group1") 3 .StartAt(myTimeToStartFiring) // if a start time is not given (if this line were omitted), "now" is implied 4 .WithSimpleSchedule(x => x 5 .WithIntervalInSeconds(10) 6 .WithRepeatCount(10)) // note that 10 repeats will give a total of 11 firings 7 .ForJob(myJob) // identify job with handle to its JobDetail itself 8 .Build();
建立觸發器,5分鐘後將會觸發一次:對象
trigger = (ISimpleTrigger) TriggerBuilder.Create() .WithIdentity("trigger5", "group1") .StartAt(DateBuilder.FutureDate(5, IntervalUnit.Minute)) // use DateBuilder to create a date in the future .ForJob(myJobKey) // identify job with its JobKey .Build();
建立觸發器時當即觸發,而後每隔5分鐘觸發一次,直到22:00:blog
trigger = TriggerBuilder.Create() .WithIdentity("trigger7", "group1") .WithSimpleSchedule(x => x .WithIntervalInMinutes(5) .RepeatForever()) .EndAt(DateBuilder.DateOf(22, 0, 0)) .Build();
建立觸發器時,在下一個整點小時觸發,而後每隔2小時觸發一次,永不停歇:ci
1 trigger = TriggerBuilder.Create() 2 .WithIdentity("trigger8") // because group is not specified, "trigger8" will be in the default group 3 .StartAt(DateBuilder.EvenHourDate(null)) // get the next even-hour (minutes and seconds zero ("00:00")) 4 .WithSimpleSchedule(x => x 5 .WithIntervalInHours(2) 6 .RepeatForever()) 7 // note that in this example, 'forJob(..)' is not called 8 // - which is valid if the trigger is passed to the scheduler along with the job 9 .Build(); 10 11 scheduler.scheduleJob(trigger, job);
花點時間查閱TriggerBuilder和SimpleScheduleBuilder類的全部可用方法,以便你能熟悉在上面演示代碼中可能沒有展現的有用操做。
注意TriggerBuilder(或是Quartz別的建立類)在你沒有明確設置參數值時通常會選擇合理的值。例如,若是你沒有調用withIdentity方法,TriggerBuilder會爲你的觸發器產生一個隨機的名字,若是你沒有調用startAt方法,它會假設是當即觸發。
SimpleTrigger的觸發失敗指令
SimpleTrigger有幾條指令,用來告知Quartz當觸發失敗時該如何操做。(在第四課更多關於觸發器已經介紹過觸發失敗的狀況)。這些指令在SimpleTrigger類中設計成常量(包含JavaDoc描述了它們的行爲)。指令有:
SimpleTrigger的觸發失敗指令常量:
•MisfireInstruction.IgnoreMisfirePolicy
•MisfirePolicy.SimpleTrigger.FireNow
•MisfirePolicy.SimpleTrigger.RescheduleNowWithExistingRepeatCount
•MisfirePolicy.SimpleTrigger.RescheduleNowWithRemainingRepeatCount
•MisfirePolicy.SimpleTrigger.RescheduleNextWithRemainingCount
•MisfirePolicy.SimpleTrigger.RescheduleNextWithExistingCount
回顧前面的課程能夠知道:全部的觸發器均可以使用Trigger.MISFIRE_INSTRUCTION_SMART_POLICY指令,而且這條指令也是全部觸發器的默認指令。
若是使用「智能策略」指令,SimpleTrigger會從多條觸發失敗指令集中根據配置和SimpleTrigger實例的狀態動態地選擇指令。文檔中SimpleTrigger的SimpleTrigger.UpdateAfterMisfire()方法解釋了動態選擇行爲更詳細的信息。
當你建立SimpleTrigger時,能夠經過SimpleSchedulerBuilder指定觸發失敗指令做爲調度器的一部分。
1 trigger = TriggerBuilder.Create() 2 .WithIdentity("trigger7", "group1") 3 .WithSimpleSchedule(x => x 4 .WithIntervalInMinutes(5) 5 .RepeatForever() 6 .WithMisfireHandlingInstructionNextWithExistingCount()) 7 .Build();