Quartz主要類與接口組成

quartz是一個高質量的任務調度軟件包。其主要組成部分爲:

Scheduler接口: quartz的執行線程,它根據Trigger決定調度時刻,根據JobDetail的說明實例化並運行Job

JobDetail類: 可持久化的任務描述信息。任務雖然分組,但是僅用作管理標示,任務之間並無實質性關聯, 例如無法定義job chain。

Trigger類:任務的調度策略。這裏的特點是調度策略與任務描述分開,調度策略和任務描述都可以分別在Scheduler註冊,然後再關聯起來。JobDetail與Trigger的關係是一對多。

JobDataMap: 將任務的運行時可持久化狀態信息從JobDetail類中分離出來

Job接口: 任務的執行代碼

StatefulJob接口: 無狀態任務對應的JobDataMap可以認爲是隻讀的,而有狀態的任務在多次執行過程中保留對JobDataMap所作的修改,一個後果是有狀態任務無法被併發執行。

JobExecutionException類: 可以通過JobExecutionException調整調度程序的下一步動作
Calendar接口: 用於從trigger的調度計劃中排除某些時間段,例如假期等。

以上幾個部分的交互關係如下:
class JobImpl implements Job{
    public void execute(JobExecutionContext context) throws JobExecutionException{
        JobDetail detail = context.getJobDetail();
        JobDataMap dataMap = detail.getJobDataMap();
        ...
    }
}

scheduler.addCalendar("myHolidays", holidayCalendar, false);
trigger.setCanlendarName("myHolidays");

JobDetail jobDetail = new JobDetail(jobName, jobGroupName, JobImpl.class);

scheduler.scheduleJob(jobDetail, trigger);

JobDetail可以設置如下屬性:
1. Durability: non-durable的任務當不再與任何active trigger關聯的時候將會從scheduler中被自動刪除。
2. Volatility: volatile的任務在scheduler的兩次啓動之間不會被持久化
3. RequestsRecovery: 如果在執行過程中程序意外崩潰,標記爲"request recovery"的任務在scheduler重起之後將會被再次執行,此時JobExecutionContext.isRecovering()返回true.

Trigger可以設置如下屬性:
1. misfireInstruction: 設定當trigger錯過了觸發時刻的時候需要採取的處理策略

SimpleTrigger按照固定的時間間隔進行觸發
startTime, endTime, repeatCount, repeatInterval

CronTrigger按照日曆間隔進行觸發
seconds minutes hours day-of-month month day-of-week

在quartz內部,QuartzSchedulerThread按照時間順序選擇trigger(沒有任務優先級的概念), 然後在JobRunShell中運行Job。

JobRunShell中的調用順序如下:

TriggerListener.triggerFired
    Called by the Scheduler when a Trigger has fired, and it's associated JobDetail is about to be executed.

TriggerListener.vetoJobExecution
    Called by the Scheduler when a Trigger has fired, and it's associated JobDetail is about to be executed.

JobListener.jobToBeExecuted
    Called by the Scheduler when a JobDetail is about to be executed (an associated Trigger has occured).

Job.execute
    Called by the Scheduler when a Trigger fires that is associated with the Job.
 
JobListener.jobWasExecuted
    Called by the Scheduler after a JobDetail has been executed, and be for the associated Trigger's triggered(xx) method has

been called.

Trigger.executionComplete
    Called after the Scheduler has executed the JobDetail associated with the Trigger in order to get the final instruction

code from the trigger.

TriggerListener.triggerComplete
     Called by the Scheduler when a Trigger has fired, it's associated JobDetail has been executed, and it's triggered(xx)

method has been called.

SchedulerListener.triggerFinalized [if(trigger.getNextFireTime() == null)]
     Called by the Scheduler when a Trigger has reached the condition in which it will never fire again. 
 

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