Quartz.NET 2.x 文件翻譯 - Lesson 5:SimpleTrigger觸發模式

龐順龍發表於2019-05-11

Quartz.NET 2.x 文件翻譯 - Lesson 5:SimpleTrigger觸發模式 檢視官網英文原文

返回目錄

SimpleTrigger觸發模式能滿足我們的基本排程要求,比如在固定時間點執行一次,然後間隔一定時間再次執行這樣的情形。

說了這些後,你可能沒有發現SimpleTrigger的屬性包括開始時間、結束時間、重複次數和重複間隔。所有這些屬性都可以使用的,只是通過開始時間、結束時間這樣的關係來實現的。

重複次數可以是0、一個正整數或者是一個SimpleTrigger.RepeatIndefinitely常量。重複間隔屬性必須是TimeSpan.Zero或者TimeSpan的正整數。需要我們注意的是,當重複間隔為0會導致Trigger觸發器重複計數的同時觸發執行。

如果你不熟悉DateTime類,可以依賴startTimeUtc(或者endTimeUtc)去實現trigger觸發器的觸發時間設定。

EndTimeUtc屬性(如果指定了的話)超出了重複次數的限制,這就可以讓我們實現這樣的需求:比如執行間隔10秒的任務,一直到我們指定的一個截止時間,而不是依賴我們指定的執行次數,這就可以實現了。

SimpleTrigger例項使用TriggerBuilder建立(Trigger觸發器的主要屬性)和WithSimpleSchedule的擴充套件方法(SimpleTrigger的特定屬性)。

建立一個特定的時刻觸發,沒有重複:

// trigger builder creates simple trigger by default, actually an ITrigger is returned
ISimpleTrigger trigger = (ISimpleTrigger) TriggerBuilder.Create()
    .WithIdentity("trigger1", "group1")
    .StartAt(myStartTime) // some Date 
    .ForJob("job1", "group1") // identify job with name, group strings
    .Build();
建立一個特定的時刻觸發,然後重複每十秒十次: 
trigger = TriggerBuilder.Create()
    .WithIdentity("trigger3", "group1")
    .StartAt(myTimeToStartFiring) // if a start time is not given (if this line were omitted), "now" is implied
    .WithSimpleSchedule(x => x
        .WithIntervalInSeconds(10)
        .WithRepeatCount(10)) // note that 10 repeats will give a total of 11 firings
    .ForJob(myJob) // identify job with handle to its JobDetail itself                   
    .Build();
建立一個觸發,執行一次,五分鐘後開始執行: 
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();
建立一個觸發,並立刻執行,然後每隔五分鐘重複一次,直到時間22:00: 
trigger = TriggerBuilder.Create()
    .WithIdentity("trigger7", "group1")
    .WithSimpleSchedule(x => x
        .WithIntervalInMinutes(5)
        .RepeatForever())
    .EndAt(DateBuilder.DateOf(22, 0, 0))
    .Build();
建立一個觸發,下一個小時開始的時候執行,然後每2小時重複一次: 

trigger = TriggerBuilder.Create()
    .WithIdentity("trigger8") // because group is not specified, "trigger8" will be in the default group
    .StartAt(DateBuilder.EvenHourDate(null)) // get the next even-hour (minutes and seconds zero ("00:00"))
    .WithSimpleSchedule(x => x
        .WithIntervalInHours(2)
        .RepeatForever())
    // note that in this example, 'forJob(..)' is not called 
    //  - which is valid if the trigger is passed to the scheduler along with the job  
    .Build();

scheduler.scheduleJob(trigger, job);
多看看TriggerBuilder的方法和其他擴充套件方法,我們就可以更熟悉的使用了,上面的例子只是一部分展示而已。

SimpleTrigger Misfire Instructions

SimpleTrigger有很多種方式通知quart.net需要做什麼在一個misfire發生的時候,這些通知被定義為MisfirePolicy.SimpleTrigger的常量,包括:

SimpleTrigger的misfire通知常量說明:

  1. MisfireInstruction.IgnoreMisfirePolicy
  2. MisfirePolicy.SimpleTrigger.FireNow
  3. MisfirePolicy.SimpleTrigger.RescheduleNowWithExistingRepeatCount
  4. MisfirePolicy.SimpleTrigger.RescheduleNowWithRemainingRepeatCount
  5. MisfirePolicy.SimpleTrigger.RescheduleNextWithRemainingCount
  6. MisfirePolicy.SimpleTrigger.RescheduleNextWithExistingCount
從以前的幾篇文章我們可以得知,所有的Trigger觸發器都是用的MisfirePolicy.SmartPolicy通知方式,而且這些通知也試所有Trigger型別預設的。

如果我們使用動態的職能通知指令,SimpleTrigger基於配置和狀態動態的選擇misfire指令,SimpleTrigger.UpdateAfterMisfire()方法解釋了這些行為的具體細節。

當我們建立SimpleTriggers的時候,我們通過SimpleSchedulerBuilder制定misfire指令作為一個簡單排程的一部分:
trigger = TriggerBuilder.Create()
    .WithIdentity("trigger7", "group1")
    .WithSimpleSchedule(x => x
        .WithIntervalInMinutes(5)
        .RepeatForever()
        .WithMisfireHandlingInstructionNextWithExistingCount())
    .Build();

返回目錄

龐順龍最後編輯於:3年前

內容均為作者獨立觀點,不代表八零IT人立場,如涉及侵權,請及時告知。

相關文章