1. 程式人生 > >QUARTZ系列之二-監聽器

QUARTZ系列之二-監聽器

Listener

1.是什麼: perform actions based on events occurring within the scheduler.

2.分類:a.TriggerListeners ; b.JobListeners ; c.SchedulerListeners 

TriggerListener

1. 處理與trigger相關的事件,包括: trigger firings, trigger mis-firings , and trigger completions (the jobs fired off by the trigger is finished).

2. 介面定義:

public interface TriggerListener {
   // 獲取監聽器的名稱
    public String getName();
   // 1.Called by the Scheduler when a Trigger has fired,
   // 2.before it's associated org.quartz.JobDetail is executed.
   // 3.called before the vetoJobExecution(..)method
   // public void triggerFired(Trigger trigger, JobExecutionContext context);
    // 1.如果返回true,將veto關聯JobDetail的執行;
  // 2. 在triggerFired()方法之後執行
public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context);  
   // 1. 當trigger misfired之後執行此方法
// 2. 需要注意的是:本方法的耗時需要被關注,因為如果耗時太長,那麼當有大量triggers同時misfire時,將會出現問題
public void triggerMisfired(Trigger trigger);
// 1. jobDetail
public void triggerComplete(Trigger trigger, JobExecutionContext context, int triggerInstructionCode); }

3. 內建實現:內建實現有倆個,一個是TriggerListenerSupport抽象類,只需要實現getName()指定名稱,別的方法都是空的,實現需要實現的即可。

另一個是BroadcastTriggerListener,這個類又是另外一個作用了,相當於一個代理吧,內部有一個TriggerListener例項的集合,當有事件通知時,廣播給內部的listeners。主要程式碼如下:

    private List<TriggerListener> listeners;
  // 內部通過迴圈進行請求的分發,這樣就只需要這個listener與trigger關聯了
    public void triggerFired(Trigger trigger, JobExecutionContext context) {

        Iterator<TriggerListener> itr = listeners.iterator();
        while(itr.hasNext()) {
            TriggerListener l = itr.next();
            l.triggerFired(trigger, context);
        }
    }

 JobListener 

1. 處理與job有關的事件,包括:the job is about to be executed, and  the job has completed execution.

2. 介面定義:

public interface JobListener {

    public String getName();
    // 1.JobDetail即將執行時觸發
    // 2.如果job被vetoed了,此方法不會執行
    public void jobToBeExecuted(JobExecutionContext context);
    // 觸發時機:JobDetail即將執行,但是TriggerListener  veto 了該執行時會觸發此方法
    public void jobExecutionVetoed(JobExecutionContext context);

    public void jobWasExecuted(JobExecutionContext context,
            JobExecutionException jobException);

}

3. 實現:與trigerListener類似,

方法的觸發順序:

triggerFired
jobToBeExecuted
job executing。。。
jobWasExecuted
triggerComplete

使用Listener:

1.名字必須有;2.可以繼承support類,不必實現介面實現不需要的方法。

1.通過scheduler的ListenerManager 物件註冊在scheduler上,隨帶著一個Matcher,用來指示listener監聽的是那個trigger/job

 程式碼示意如下;

scheduler.getListenerManager().addJobListener(myJobListener, KeyMatcher.jobKeyEquals(new JobKey("myJobName", "myJobGroup")));

Matcher介面方法如下:

public interface Matcher<T extends Key<?>> extends Serializable {

    boolean isMatch(T key);
 
    public int hashCode();

    public boolean equals(Object obj);
}

Matcher的型別很多,可以根據自己的需要靈活應用:EverythingMatcher,GroupMatcher,KeyMatcher,NameMatcher,  AndMatcher,  NotMatcher,  OrMatcher。這些都可以通過靜態方法執行使用,如果有自定義的需求,quartz還提供了StringMatcher抽象類,具體不再贅述。