天天看點

Quartz-Trigger詳解概述觸發器接口基本介紹通用 Trigger 屬性Trigger 觸發器實作類排程器建造者Trigger實作類

文章目錄

  • 概述
  • 觸發器接口基本介紹
  • 通用 Trigger 屬性
    • Priority
    • misfire:錯過觸發機制
    • Calendar
  • Trigger 觸發器實作類
  • 排程器建造者
  • Trigger實作類
    • SimpleTrigger
    • CalendarIntervalTrigger
    • DailyTimeIntervalTrigger
    • CronTrigger
    • NthIncludedDayTrigger
Quartz-Trigger詳解概述觸發器接口基本介紹通用 Trigger 屬性Trigger 觸發器實作類排程器建造者Trigger實作類

概述

我們先回顧下Quartz API核心接口

  • Scheduler:(排程器)與scheduler互動的主要API;
  • Job:(作業)你通過scheduler執行任務,你的任務類需要實作的接口;
  • JobDetail:(作業執行個體)定義Job的執行個體;
  • Trigger:(觸發器)觸發Job的執行;
  • JobBuilder:定義和建立JobDetail執行個體的接口;
  • TriggerBuilder:定義和建立Trigger執行個體的接口;

類似于 Job,Trigger 也非常容易使用,但是它包含了大量的自定義選項,你需要了解它們才能完全使用 Quartz。并且,Trigger 本身有很多不同的實作,你需要根據具體情況進行選擇。

觸發器接口基本介紹

// 觸發器狀态  
TriggerState  
    |-public enum TriggerState { NONE, NORMAL, PAUSED, COMPLETE, ERROR, BLOCKED }  
        |-NONE 無  
        |-NORMAL 正常狀态  
        |-PAUSED 暫停狀态   
        |-COMPLETE 完成  
        |-ERROR 錯誤
        |-BLOCKED 堵塞


// 執行完成時狀态  
CompletedExecutionInstruction
    |-    public enum CompletedExecutionInstruction { 
            NOOP, RE_EXECUTE_JOB, SET_TRIGGER_COMPLETE, DELETE_TRIGGER, 
            SET_ALL_JOB_TRIGGERS_COMPLETE, SET_TRIGGER_ERROR, SET_ALL_JOB_TRIGGERS_ERROR }   
        |-NOOP 無   
        |-RE_EXECUTE_JOB 重複執行   
        |-SET_TRIGGER_COMPLETE 觸發器執行完成  
        |-DELETE_TRIGGER 删除觸發器  
        |-SET_ALL_JOB_TRIGGERS_COMPLETE 所有作業和觸發器執行完成    
        |-SET_TRIGGER_ERROR 觸發器執行錯誤  
        |-SET_ALL_JOB_TRIGGERS_ERROR 設定所有都是錯誤的  

TriggerTimeComparator  
getKey 擷取觸發器key值   
getJobKey  擷取作業key 
getDescription 擷取面熟  
getCalendarName 擷取月曆名稱  
getJobDataMap 擷取作業資料map  
getPriority 擷取優先級  
mayFireAgain 是否重複執行  
getStartTime 開始時間  
getEndTime 結束時間  
getNextFireTime 下一次執行時間  
getPreviousFireTime 上一執行時間  
getFireTimeAfter(Date afterTime) 擷取某個時間後的運作時間     
getFinalFireTime 擷取最後執行時間  
getMisfireInstruction 擷取失敗政策  
getTriggerBuilder 擷取觸發器建造者    
getScheduleBuilder 擷取排程類建造者 
equals 
compareTo

// 失敗政策   
MISFIRE_INSTRUCTION_SMART_POLICY   
MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY   
DEFAULT_PRIORITY           

複制

通用 Trigger 屬性

先不說所有 Trigger 都有 TriggerKey 屬性用于跟蹤唯一辨別。

所有的 Trigger 還有另一些通用的其它屬性。這些通用屬性可以在你定義 Trigger 的時候使用 TriggerBuilder 進行設定。(後面有例子)

  • jobKey 屬性表示當 trigger 觸發的時候,被執行的 Job 的唯一辨別。
  • startTime 屬性表示 trigger 的時間表中開始進行關注的時間。這個值是 java.util.Date 類型的對象。 對于有的Trigger 類型來說,它們将會在這個時間被觸發,另外的一些 Trigger 隻是簡單地将這個時間标記為開始關注的時間,這意味着你可以在1 月份的時候設定觸發器為“每月 5 日執行”,并且設定 startTime 為 4 月 1 日,那麼距離這個觸發器觸發還有幾個月的時間。
  • endTime 屬性表示 Trigger 中的時間表不再進行關注的時間。例如,如果你設定了“每月 5 日執行”的觸發器,如果将 endTime 設定為 7 月 1 日,那麼這個觸發器最後一次觸發将會是 6 月 5 日。

Priority

有的時候,當你有多個 Trigger(或者在 Quartz 線程池中有多個工作線程),Quartz 可能沒有足夠的資源同時觸發所有觸發器上的任務。在這種情況下,你可能想控制你的哪個 Trigger 将會在 Quartz 工作線程中第一個被觸發。為了滿足這個需求,你可以設定 Trigger 的 priority 屬性。如果有 N 個 Trigger 同時被觸發,而當時隻有 Z 個工作線程,那麼前 Z 個 priority 最高的 Trigger 将會被觸發。如果沒有設定這個屬性,預設值是 5。這個屬性接受所有整數,正數或負數都合法。

注意:Priority 隻會在同時觸發 Trigger 的時候進行比較。10:59 觸發的 Trigger 總是比 11:00 觸發的 Trigger早執行,不管它們的 priority 值是多少。

注:如果 trigger 上的 job 需要恢複,那麼恢複後會使用原始 trigger 相同的 priority。

misfire:錯過觸發機制

Trigger 上的另一個很重要的屬性是“錯過觸發指令”。當排程器停止或在 Quartz 線程池中沒有可用的線程可以執行任務的時候,就有可能發成錯過觸發(應該觸發而沒有觸發)。

不同的 Trigger 類型有它們各自不同的錯過觸發機制。預設情況下,使用“smart policy”機制-這是基于 Trigger 類型和配置的動态行為。

當排程器啟動的時候,它會檢索是否有 trigger 錯過觸發,然後将會基于它們獨立配置的錯過觸發機制進行更新。當你在自己的項目中使用 Quartz 的時候,你需要熟悉你使用的 trigger 類型的錯過觸發機制,在它們的 JavaDoc 中都有詳細說明。

Calendar

Quartz Calendar 對象(不是 java.util.Calendar 對象)可以在定義 Trigger 的時候關聯到 Trigger,并儲存到排程器中。

使用 Calendar 可以很友善的在觸發周期内去除某些時間。例如,你可以建立一個 trigger,并設定在每個工作日的上午 9:30 被觸發,然後可以添加 Calendar 來去除所有的節假日。

Calendar 可以是任何實作 Calendar 接口的可序列化對象。

Calendar 接口:

package org.quartz;
 
public interface Calendar {
 
  public boolean isTimeIncluded(long timeStamp);
 
  public long getNextIncludedTime(long timeStamp);
 
}           

複制

注意,這些方法的參數都是 long 類型,正如你所料,它們表示毫秒時間戳。 這意味着使用 calendar 可以定義的時間最小機關是毫秒,你可能感興趣的是 Quartz 如何定義一整天,為了友善,Quartz 提供了 org.quartz.impl.HolidayCalendar 來做這個工作。

Calendars 必須執行個體化并通過 addCalendar() 方法注冊到排程器。如果你使用 HolidayCalendar,執行個體化之後,可以調用 addExcludedDate(Date date) 方法在運作周期中去除某些日期。相同的 Calendar 可以由多個 Trigger 使用:

HolidayCalendar cal = new HolidayCalendar();
cal.addExcludedDate( someDate );
cal.addExcludedDate( someOtherDate );
 
sched.addCalendar("myHolidays", cal, false);
 
 
Trigger t = newTrigger()
    .withIdentity("myTrigger")
    .forJob("myJob")
    .withSchedule(dailyAtHourAndMinute(9, 30)) // execute job daily at 9:30
    .modifiedByCalendar("myHolidays") // but not on holidays
    .build();
 
// .. schedule job with trigger
 
Trigger t2 = newTrigger()
    .withIdentity("myTrigger2")
    .forJob("myJob2")
    .withSchedule(dailyAtHourAndMinute(11, 30)) // execute job daily at 11:30
    .modifiedByCalendar("myHolidays") // but not on holidays
    .build();
 
// .. schedule job with trigger2           

複制

上面的代碼建立了兩個 trigger,都是每日觸發。然而,在設定的 calendar 周期内的觸發将會被忽略。

org.quartz.impl.calendar 包中有更多的 Calendar 實作可以滿足你的需要。

Trigger 觸發器實作類

Quartz-Trigger詳解概述觸發器接口基本介紹通用 Trigger 屬性Trigger 觸發器實作類排程器建造者Trigger實作類
Trigger (org.quartz)    
    |-CalendarIntervalTrigger (org.quartz) 日期觸發器   
    |   |-CalendarIntervalTriggerImpl (org.quartz.impl.triggers)  
    | 
    |-MutableTrigger (org.quartz.spi)   
    |   |-OperableTrigger (org.quartz.spi)    
    |       |-AbstractTrigger (org.quartz.impl.triggers)    
    |           |-CalendarIntervalTriggerImpl (org.quartz.impl.triggers)   
    |           |-SimpleTriggerImpl (org.quartz.impl.triggers)   
    |           |-DailyTimeIntervalTriggerImpl (org.quartz.impl.triggers)   
    |           |-CronTriggerImpl (org.quartz.impl.triggers)
    |
    |-SimpleTrigger (org.quartz) 簡單觸發器  
    |   |-SimpleTriggerImpl (org.quartz.impl.triggers)  
    |
    |-CoreTrigger (org.quartz.impl.triggers)  
    |   |-CalendarIntervalTriggerImpl (org.quartz.impl.triggers)   
    |   |-SimpleTriggerImpl (org.quartz.impl.triggers)   
    |   |-DailyTimeIntervalTriggerImpl (org.quartz.impl.triggers)  
    |   |-CronTriggerImpl (org.quartz.impl.triggers)
    |
    |-CronTrigger (org.quartz) cron表達式   
    |   |-CronTriggerImpl (org.quartz.impl.triggers)  
    |
    |-DailyTimeIntervalTrigger (org.quartz)日期觸發類(日)    
        |-DailyTimeIntervalTriggerImpl (org.quartz.impl.triggers)           

複制

常用的觸發器有下面四個

  • SimpleTrigger:簡單的觸發器
  • CalendarIntervalTrigger:月曆觸發器
  • CronTrigger:Cron表達式觸發器
  • DailyTimeIntervalTrigger:日期觸發器

排程器建造者

這裡源碼中利用了建造者模式

// 用于建立各個排程器  
ScheduleBuilder (org.quartz)   
    |-CalendarIntervalScheduleBuilder (org.quartz)    
    |-DailyTimeIntervalScheduleBuilder (org.quartz)   
    |-SimpleScheduleBuilder (org.quartz)       
    |-CronScheduleBuilder (org.quartz)           

複制

private TriggerBuilder() 構造函數私有  

public static TriggerBuilder<Trigger> newTrigger()  建立一個建造者

build() 建立觸發器

// 根據name和預設的group(即"DEFAULT_GROUP")建立trigger的key
public TriggerBuilder<T> withIdentity(String name) 
public TriggerBuilder<T> withIdentity(String name, String group)
public TriggerBuilder<T> withIdentity(TriggerKey triggerKey)

// 描述
public TriggerBuilder<T> withDescription(String triggerDescription) 
// 優先級 
public TriggerBuilder<T> withPriority(int triggerPriority) 
//日期
public TriggerBuilder<T> modifiedByCalendar(String calName) 
//開始時間
public TriggerBuilder<T> startAt(Date triggerStartTime) 
//立即執行
public TriggerBuilder<T> startNow() 
//結束時間
public TriggerBuilder<T> endAt(Date triggerEndTime) 
//排程器
public <SBT extends T> TriggerBuilder<SBT> withSchedule(ScheduleBuilder<SBT> schedBuilder) 
//設定作業
public TriggerBuilder<T> forJob(JobKey keyOfJobToFire) 
public TriggerBuilder<T> forJob(String jobName)
public TriggerBuilder<T> forJob(String jobName, String jobGroup)
public TriggerBuilder<T> forJob(JobDetail jobDetail)
usingJobData(----,----) 設定作業内容

key
description
startTime
endTime
priority Trigger.DEFAULT_PRIORITY 
calendarName
jobKey
jobDataMap
scheduleBuilder           

複制

SimpleScheduleBuilder 簡單的排程器建立者

分析源碼中的方法和屬性

//構造函數私有化
protected SimpleScheduleBuilder() 

//擷取簡單排程器
public static SimpleScheduleBuilder simpleSchedule()

/***********************/
// 1分鐘執行(一直執行)   
public static SimpleScheduleBuilder repeatMinutelyForever() 
//每隔幾分鐘執行(一直執行)   
public static SimpleScheduleBuilder repeatMinutelyForever(int minutes) 
// 1秒執行(一直執行)      
public static SimpleScheduleBuilder repeatSecondlyForever() 
//每隔幾秒鐘執行(一直執行)   
public static SimpleScheduleBuilder repeatSecondlyForever(int seconds) 
// 1小時執行(一直執行)   
public static SimpleScheduleBuilder repeatHourlyForever() 
//每隔幾小時鐘執行(一直執行) 
public static SimpleScheduleBuilder repeatHourlyForever(int hours)  
 
/***********************/
//間隔時間為1分鐘,總的執行次數為count
public static SimpleScheduleBuilder repeatMinutelyForTotalCount(int count)
//間隔時間為幾分鐘,總的執行次數為count   .............
public static SimpleScheduleBuilder repeatMinutelyForTotalCount(int count, int minutes)
public static SimpleScheduleBuilder repeatSecondlyForTotalCount(int count)
public static SimpleScheduleBuilder repeatSecondlyForTotalCount(int count, int seconds)
public static SimpleScheduleBuilder repeatHourlyForTotalCount(int count)
public static SimpleScheduleBuilder repeatHourlyForTotalCount(int count, int hours)

/***********************/
public MutableTrigger build() 建立一個Trigger

/***********************/
// 幾秒鐘重複執行   
public SimpleScheduleBuilder withIntervalInMilliseconds(long intervalInMillis)
public SimpleScheduleBuilder withIntervalInSeconds(int intervalInSeconds)
public SimpleScheduleBuilder withIntervalInMinutes(int intervalInMinutes)
public SimpleScheduleBuilder withIntervalInHours(int intervalInHours)

/***********************/
 // 重複執行冊數  
public SimpleScheduleBuilder withRepeatCount(int triggerRepeatCount)

/***********************/

//以錯過的第一個頻率時間立刻開始執行
//重做錯過的所有頻率周期後
//當下一次觸發頻率發生時間大于目前時間後,再按照正常的Cron頻率依次執行
public SimpleScheduleBuilder withMisfireHandlingInstructionIgnoreMisfires()

//以目前時間為觸發頻率立即觸發執行
//執行至FinalTIme的剩餘周期次數
//以排程或恢複排程的時刻為基準的周期頻率,FinalTime根據剩餘次數和目前時間計算得到
//調整後的FinalTime會略大于根據starttime計算的到的FinalTime值
public SimpleScheduleBuilder withMisfireHandlingInstructionFireNow()

//不觸發立即執行
//等待下次觸發頻率周期時刻,執行至FinalTime的剩餘周期次數
//以startTime為基準計算周期頻率,并得到FinalTime
//即使中間出現pause,resume以後保持FinalTime時間不變
public SimpleScheduleBuilder withMisfireHandlingInstructionNextWithExistingCount()

//不觸發立即執行
//等待下次觸發頻率周期時刻,執行至FinalTime的剩餘周期次數
//以startTime為基準計算周期頻率,并得到FinalTime
//即使中間出現pause,resume以後保持FinalTime時間不變
public SimpleScheduleBuilder withMisfireHandlingInstructionNextWithRemainingCount()

//以目前時間為觸發頻率立即觸發執行
//執行至FinalTIme的剩餘周期次數
//以排程或恢複排程的時刻為基準的周期頻率,FinalTime根據剩餘次數和目前時間計算得到
//調整後的FinalTime會略大于根據starttime計算的到的FinalTime值
public SimpleScheduleBuilder withMisfireHandlingInstructionNowWithExistingCount()

//以目前時間為觸發頻率立即觸發執行
//執行至FinalTIme的剩餘周期次數
//以排程或恢複排程的時刻為基準的周期頻率,FinalTime根據剩餘次數和目前時間計算得到
public SimpleScheduleBuilder withMisfireHandlingInstructionNowWithRemainingCount()

interval 時間間隔
repeatCount 重複時間
misfireInstruction           

複制

CronScheduleBuilder Corn排程器建立者

源碼分析

// 構造函數私有化
protected CronScheduleBuilder(CronExpression cronExpression)、

public MutableTrigger build()

// 根據cron表達式建造
public static CronScheduleBuilder cronSchedule(String cronExpression)

// 核查表達式是否正确
public static CronScheduleBuilder cronScheduleNonvalidatedExpression(String cronExpression) throws ParseException
            
//表達式異常
cronScheduleNoParseException

// 利用CronExpression建造
public static CronScheduleBuilder cronSchedule(CronExpression cronExpression)

//每天在指定的時間執行,根據這個排程建立一個cron表達式
public static CronScheduleBuilder dailyAtHourAndMinute(int hour, int minute)

// 通過`分鐘`、`小時`、`周`建立一個CronScheduleBuilder執行個體,即在某一天的給定時刻
// (通過`分鐘`、`小時`指定)執行,,而天數由`周`确定,如果“周二、周四的10:05“等;
public static CronScheduleBuilder atHourAndMinuteOnGivenDaysOfWeek(int hour, int minute, Integer... daysOfWeek)
            
//排程計劃:每周的某一天,在指定的時間(小時和分鐘)執行
public static CronScheduleBuilder weeklyOnDayAndHourAndMinute(int dayOfWeek, int hour, int minute)

//排程計劃:每月的某一天,在指定的時間(小時和分鐘)執行
public static CronScheduleBuilder monthlyOnDayAndHourAndMinute(int dayOfMonth, int hour, int minute)

//設定時區
public CronScheduleBuilder inTimeZone(TimeZone timezone)

// 設定處理辦法
public CronScheduleBuilder withMisfireHandlingInstructionIgnoreMisfires() 
public CronScheduleBuilder withMisfireHandlingInstructionDoNothing()
public CronScheduleBuilder withMisfireHandlingInstructionFireAndProceed()

cronExpression
misfireInstruction           

複制

CalendarIntervalScheduleBuilder 月曆間隔計劃生成器

CalendarIntervalScheduleBuilder
calendarIntervalSchedule
build

// 和DailyTimeIntervalScheduleBuilder差不多
public CalendarIntervalScheduleBuilder withInterval(int timeInterval, IntervalUnit unit)
withIntervalInSeconds
withIntervalInMinutes
withIntervalInHours
withIntervalInDays
withIntervalInWeeks
withIntervalInMonths
withIntervalInYears

withMisfireHandlingInstructionIgnoreMisfires
withMisfireHandlingInstructionDoNothing
withMisfireHandlingInstructionFireAndProceed
inTimeZone

preserveHourOfDayAcrossDaylightSavings
skipDayIfHourDoesNotExist
validateInterval
interval
intervalUnit
misfireInstruction
timeZone
preserveHourOfDayAcrossDaylightSavings
skipDayIfHourDoesNotExist           

複制

DailyTimeIntervalScheduleBuilder

DailyTimeIntervalScheduleBuilder()

dailyTimeIntervalSchedule()

build()

withInterval(int timeInterval, IntervalUnit unit) //執行時間間隔觸發執行,unit時間機關 
withIntervalInSeconds(int intervalInSeconds)    //秒 
withIntervalInMinutes(int intervalInMinutes)    //分鐘 
withIntervalInHours(int intervalInHours)    //小時 

// 周幾執行 
onDaysOfTheWeek(Set<Integer> onDaysOfWeek)
onDaysOfTheWeek(Integer... onDaysOfWeek)

onMondayThroughFriday()
onSaturdayAndSunday()
onEveryDay()

startingDailyAt(TimeOfDay timeOfDay)    // 開始觸發時間 
endingDailyAt(TimeOfDay timeOfDay)    //結束時間 
endingDailyAfterCount(int count)    

withMisfireHandlingInstructionIgnoreMisfires()
withMisfireHandlingInstructionDoNothing()
withMisfireHandlingInstructionFireAndProceed()

//重複次數 
withRepeatCount() 
validateInterval()

// 常量等 
interval 
intervalUnit 
daysOfWeek 
startTimeOfDay 
endTimeOfDay 
repeatCount 
misfireInstruction 
ALL_DAYS_OF_THE_WEEK 
MONDAY_THROUGH_FRIDAY 
SATURDAY_AND_SUNDAY           

複制

Trigger實作類

SimpleTrigger

一個quartz簡單的觸發器。指定從某一個時間開始,以一定的時間間隔(機關是毫秒)執行的任務。

它适合的任務類似于:9:00 開始,每隔1小時,每隔幾分鐘,每隔幾秒鐘執行一次。

它的屬性有:

  • repeatInterval:重複間隔
  • repeatCount:重複次數。實際執行次數是 repeatCount+1。因為在startTime的時候一定會執行一次。

官網介紹:http://www.quartz-scheduler.org/documentation/quartz-2.2.x/tutorials/tutorial-lesson-05.html

import org.quartz.*;
import java.text.SimpleDateFormat;
import java.util.Date;

public class SimpleTriggerMain {
    public static void main(String[] args) throws SchedulerException {
        // 擷取一個排程工廠
        SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();
        // 擷取一個排程器
        Scheduler sched = schedFact.getScheduler();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        JobDetail job = JobBuilder.newJob(HelloJob.class).withIdentity("job1", "group1").build();
        // 在目前時間15秒後運作
        Date startTime = DateBuilder.nextGivenSecondDate(new Date( ),15);
        // 建立一個SimpleTrigger執行個體,指定該Trigger在Scheduler中所屬組及名稱。
        // 接着設定排程的時間規則.目前時間15秒後運作,每10秒運作一次,共運作5次
        SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
                .startAt(startTime).withSchedule(SimpleScheduleBuilder.simpleSchedule()
                        .withIntervalInSeconds(10)
                        .withRepeatCount(5)
                )
                .build();
        sched.scheduleJob(job, trigger);
        // 排程啟動
        sched.start();
    }
}           

複制

CalendarIntervalTrigger

類似于SimpleTrigger,指定從某一個時間開始,以一定的時間間隔執行的任務。 但是不同的是SimpleTrigger指定的時間間隔為毫秒,沒辦法指定每隔一個月執行一次(每月的時間間隔不是固定值),而CalendarIntervalTrigger支援的間隔機關有秒,分鐘,小時,天,月,年,星期。

相較于SimpleTrigger有兩個優勢:

  • 1、更友善,比如每隔1小時執行,你不用自己去計算1小時等于多少毫秒。
  • 2、支援不是固定長度的間隔,比如間隔為月和年。但劣勢是精度隻能到秒。

它适合的任務類似于:9:00 開始執行,并且以後每周 9:00 執行一次

它的屬性有:

  • interval:執行間隔
  • intervalUnit:執行間隔的機關(秒,分鐘,小時,天,月,年,星期)
// 每兩秒執行
CalendarIntervalTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").withSchedule(
    CalendarIntervalScheduleBuilder.calendarIntervalSchedule().withInterval(2, DateBuilder.IntervalUnit.SECOND)
).build();           

複制

DailyTimeIntervalTrigger

指定每天的某個時間段内,以一定的時間間隔執行任務。并且它可以支援指定星期。

它适合的任務類似于:指定每天9:00 至 18:00 ,每隔70秒執行一次,并且隻要周一至周五執行。

它的屬性有:

  • startTimeOfDay:每天開始時間
  • endTimeOfDay:每天結束時間
  • daysOfWeek:需要執行的星期
  • interval:執行間隔
  • intervalUnit:執行間隔的機關(秒,分鐘,小時,天,月,年,星期)
  • repeatCount:重複次數
DailyTimeIntervalTrigger trigger = dailyTimeIntervalSchedule()
    .startingDailyAt(TimeOfDay.hourAndMinuteOfDay(9, 0)) // 第天9:00開始
    .endingDailyAt(TimeOfDay.hourAndMinuteOfDay(16, 0)) // 16:00 結束 
    .onDaysOfTheWeek(MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY) // 周一至周五執行
    .withIntervalInHours(1) // 每間隔1小時執行一次
    .withRepeatCount(100) // 最多重複100次(實際執行100+1次)
    .build();
    
DailyTimeIntervalTrigger trigger = dailyTimeIntervalSchedule()
    .startingDailyAt(TimeOfDay.hourAndMinuteOfDay(9, 0)) // 第天9:00開始
    .endingDailyAfterCount(10) // 每天執行10次,這個方法實際上根據 startTimeOfDay+interval*count 算出 endTimeOfDay
    .onDaysOfTheWeek(MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY) // 周一至周五執行
    .withIntervalInHours(1) // 每間隔1小時執行一次
    .build();
    
// 每兩秒執行
DailyTimeIntervalTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").withSchedule(
        DailyTimeIntervalScheduleBuilder.dailyTimeIntervalSchedule().withInterval(2, DateBuilder.IntervalUnit.SECOND)
).build();           

複制

CronTrigger

适合于更複雜的任務,它支援類型于Linux Cron的文法(并且更強大)。基本上它覆寫了以上三個Trigger的絕大部分能力(但不是全部)

CronTrigger 允許設定非常複雜的觸發時間表。然而有時也許不得不使用兩個或多個 SimpleTrigger 來滿足你的觸發需求,這時候你僅僅需要一個CronTrigger 執行個體就夠了。

它的屬性隻有: Cron表達式

// 每兩秒執行
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").withSchedule(
        CronScheduleBuilder.cronSchedule("/2 * * * * ?")
).build();           

複制

NthIncludedDayTrigger

org.quartz.NthIncludedDayTrigger 是 Quartz 開發團隊最新加入到架構中的一個 Trigger。它設計用于在每一間隔類型的第幾天執行 Job。

例如,你要在每個月的 15 号執行開票的 Job,用 NthIncludedDayTrigger 就再合适不過了。Quartz 的 Caldendar 也可與 Trigger 關聯以此把周末與節假日考慮進來,并在必要時跳開這些日期。

NthIncludedDayTrigger trigger = new NthIncludedDayTrigger("MyTrigger", Scheduler.DEFAULT_GROUP);
trigger.setN(15);
trigger.setIntervalType(NthIncludedDayTrigger.INTERVAL_TYPE_MONTHLY);           

複制