Quartz2.2.x官方文檔2.2.X—第三章 4.關於更多Triggers

Quartz 教程


Table of Contents | ‹ Lesson 3 | Lesson 5 ›

課程 4: 關於更多Triggers

就像jobs一樣,triggers可以快速、容易的使用,但是多種多樣的自定義參數,在你完全使用Quartz之前,你需要去了解和知道。 另外,正如前面所說,你可以選擇不同類型的觸發器來滿足不同的調度需求。

Lesson 5: Simple Triggers and Lesson 6: Cron Triggers你會瞭解到兩種最常用的觸發器類型。

常用Trigger屬性

除了所有類型的觸發器都有TriggerKey屬性來作爲跟蹤標識外,還有一些其他屬性也適用在所有觸發器類型。當你需要構造觸發器時,可以使用TriggerBuilder來設置通用屬性。(下面將會有例子).

下面是所有類型觸發器的通用屬性列表:

  • “jobKey”屬性表名當觸發器觸發時應該被執行的job標識。
  • “startTime”屬性會對觸發器調度程序的首次執行產生影響。這個值是java.util.Date對象,是指定日曆上的一個時間。對於有些類型的觸發器,觸發器通常在start time時間被觸發,而有些類型則儘量遵從這個標誌時間。這個含義是,你可以在一月份,保存一個每月第5天調度程序觸發器,如果startTime屬性設置爲四月1號,那麼離觸發器第一次觸發還有好幾個月。
  • “endTime”屬性表名調度程序不會生效。另一方面, 一個每月第五天執行的調度任務觸發器,結束時間爲七月一號,那麼6月5號會執行最後一次。

其他屬性,會在下面小結中有其他更多解釋。

優先級

有時,當你大量的大量的Triggers(或者你的Quartz線程池有許多工作任務),Quartz可能沒有資源觸發所有Triggers在同一時間執行調度任務。因此,你可能想要控制你的Tiggers在可獲得Quartz工作線程上首先啓動。爲此,你可以在Tigger上設置優先級屬性。如果N個Triggers在同一時間觸發,但是隻有Z個工作線程能在同時被獲得,那麼首先高優先級的ZTriggers會首先執行。如果Triggers沒有設置優先級,它會使用默認5作爲默認屬性。優先級可以設置爲任何整數,無論正負。

注意: 只有當觸發器有相同觸發時間時纔有優先級比較。一個10:59的觸發器調度任務總是會在11:00的調度程序之前觸發。

注意: 當一個觸發器在異常中恢復,它恢復的是原始觸發器的優先級。

Misfire Instructions

另一個觸發器的重要屬性是"misfire instruction"。如果調度任務因爲關閉或者無法從Quartz線程池中獲得線程執行任務,將會導致錯誤發生。不同的觸發器類型有不同的錯誤指令。默認使用智能策略指令 - 它具有基於觸發器類型和配置的動態行爲。當調度任務開始,它會搜索任何被有錯誤的觸發器,它會基於它們每一個配置的錯誤指令來更新。當你開始使用Quartz項目時,你應該熟悉給定的觸發器類型的錯誤指令和他們的Javadoc。關於更多錯誤指令的信息將會在每種觸發器類型的教程中給出。

Calendars

Quartz Calendar 對象(沒有java.util.Calendar對象)能夠在trigger定義時關聯觸發器,並定義在調度程序中。Calendars能夠用來在觸發器觸發的調度程序中排除時間快。例如,你可以創建一個觸發器在每個工作日9:30AM觸發,接着可以添加一個Calendar排除所有節假日。

Calendar可以是任何序列畫的對象,只要他們實現Calendar接口,看起來像這樣:

The Calendar Interface


package org.quartz;

public interface Calendar {

  public boolean isTimeIncluded(long timeStamp);

  public long getNextIncludedTime(long timeStamp);

}

注意這些方法的參數是long類型。就如你推測的那樣,它們是毫米級的時間戳格式。這就意味着calendars能夠將時間限制在毫米級別。最有可能的是,你可能對整天的限制感興趣。作爲一種便利條件,Quartz包含一個類org.quartz.impl.HolidayCalendar。

Calendars必須實例化和通過addCalendar(..)方法註冊到調度程序。如果你使用HolidayCalendar, 在它實例化後, 你可以使用 addExcludedDate(Date date)方法,可以在調度程序中排除你希望的日期。同一個日曆實例可以與多個觸發器一起使用,例如:

Calendar Example


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

關於triggers的構造/構建細節會在未來幾課中細講。現在,只要相信代碼創建了兩個觸發器,並且每個調度任務都可以觸發即可。不論怎樣, 任何在日曆排除期間的觸發都會被跳過。

org.quartz.impl.calendar包,關於一些Clalendar的實現可能滿足你的需要。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章