任務調度框架Quartz實現的跑批程序(四)

Job與JobDetail是Quartz用來定義具體任務的,而Trigger則是用來定義任務如何執行的。Quartz提供了Trigger接口來定義公共屬性,使用TriggerBuilder能夠建立具體類型的Trigger;最多見的兩種Trigger分別是SimpleTrigger、CronTrigger。java

Trigger的公共屬性:

  • key,該屬性是爲了標識Trigger的。
  • startTime,Trigger第一次被Scheduler觸發的時間;該屬性的值是指定某個時間點的java.util.Date對象。
  • endTime,Trigger再也不被執行的時間。
  • priority,優先級;經過設置優先級屬性能夠控制Trigger被執行的順序,該屬性默認值是5,能夠爲正整數也能夠爲負整數。須要注意的是,只有在觸發時間相同時,優先級屬性纔會有效;好比10:59執行的任務老是會在11:00執行的任務以前執行;另外,若是Trigger是可恢復的,那麼恢復後,優先級是不會改變的。
  • misfire,若是由於某些緣由,錯過觸發時間,就須要使用該屬性來調整。不一樣類型的Trigger擁有不一樣的misfire,可是默認的是smart policy,這種狀況下會根據Trigger的類型與配置來動態的調整行爲。
  • Calendars,該屬性並非java.util.Calendar類型,它的做用是排除某些時間,好比在週末不執行任務。Quratz的Calendar對象是一個實現了Calendar接口的序列化對象,Calendars接口以下:
package org.quartz;    
public interface Calendar {    
  public boolean isTimeIncluded(long timeStamp);    
  public long getNextIncludedTime(long timeStamp);    
}

這兩個方法都是精確到毫秒的;若是隻是排除以天爲單位的時間,可使用HolidayCalendar。 
Calendars必須實例化,而後經過Scheduler的addCalendar()方法註冊。Calendars能夠重複使用,以下代碼:工具

Trigger trigger1 = TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "test")
                .startAt(DateBuilder.futureDate(3, IntervalUnit.SECOND))
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                        .withIntervalInMilliseconds(5000)
                        .withIntervalInSeconds(5)
                        .withRepeatCount(5))
                .modifiedByCalendar("holidayCalendar")
                .build();

        Trigger trigger2 = TriggerBuilder.newTrigger()
                .withIdentity("trigger2", "test")
                .startAt(DateBuilder.futureDate(3, IntervalUnit.SECOND))
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                        .withIntervalInMilliseconds(5000)
                        .withIntervalInSeconds(5)
                        .withRepeatCount(5))
                .modifiedByCalendar("holidayCalendar")
                .build();

SimpleTrigger

下面來看SimpleTrigger。經過以前的例子能夠看到如何建立Trigger,首先經過TriggerBuilder.newTrigger()方法創建一個TriggerBuilder對象,而後經過withSchedule()方法指定了SimpleScheduleBuilder,最後build()方法構建出了SimpleTrigger對象。 
SimpleTrigger很簡單,以前例子中建立的都是SimpleTrigger,任務啓動後每隔5s運行一次,總共運行5次。Quartz提供了DateBuilder工具類來方便設置時間,裏面提供了不少方法,如上面Trigger2設置的啓動時間就是3秒後啓動任務。ui

CronTrigger

CronTrigger使用cron表達式來設置觸發時間。CronTrigger建立方式:spa

Trigger trigger3 = TriggerBuilder.newTrigger()
                .withIdentity("cron trigger", "test")
                .withSchedule(
                    //每5秒執行一次                       
                    CronScheduleBuilder.cronSchedule("0/5 * * ? * *")
                ).build();

cron表達式code

cron表達式的格式爲:秒 分 時 日 周 年;其中年是可選的,其它爲必填。 
每一個屬性容許的值:對象

秒, 0-59;
分,0-59;
時,0-23;
日,1-31;
周 ,1-7;
年,可選,1970-2099
下面是cron表達式使用的一些符號:接口

「/」:指定增長值;好比上面的」0/5」,意思就是從第0秒開始,而後每隔5秒執行一次。
「*」:表示全部值;好比」5 * ? * *」,意思就是每一分鐘的第5秒執行一次。
「?」:沒有指定具體值,表示某月的某一天或者每週的某一天;只能在」日」和」周」上使用」?」,並且必須使用」?」;好比」5 * * ? * 「或」5 * * * ?」都是正確的且效果同樣,而」5 * * * * *」則是錯誤的。
「,」:表示多選;好比」1,2,3,5 * * ? * *」,意思就是每分鐘的第一、二、三、5秒執行一次任務。
「-「:表示範圍;好比」1-5 * * ? * *」,意思就是每分鐘的第1到5秒執行一次任務。
「L」:只容許在」日」和」周」上使用,分別有不一樣的做用;若是在」日」上使用,則表示該月的最後一天,如:1月31日;若是在」周」上使用,則意味着7或者SAT;另外,若是數字和L在」周」上組合使用則有其它含義,如:」6L」,則表明當前月的最後一個星期五。L用在」日」上還能夠指定偏移,如」L-3」,表示該月的第3天到最後一天。
「W」:表示給定日期最近的工做日,只能用在」日」上面;例如:」15W」,表示每個月15號最近的一個工做日,若是15號是週六,則在14號週五執行;若是15號是週日,則在16號週一執行。須要注意的是結合W使用時,不能使用範圍,只能使用單個值。另外W也能和L聯合使用,表示當月的最後一個工做日。
「#」:表示當月第幾個周X,只能在」周」上使用;如:」1#3」,表示當月的第3個星期一。get

下圖爲每一個屬性容許使用的符號:it

相關文章
相關標籤/搜索