【轉】Quartz教程七--TriggerListener和JobListener

listener是一個對象,用於監聽scheduler中發生的事件,而後執行相應的操做;你可能已經猜到了,TriggerListeners接受與trigger相關的事件,JobListeners接受與jobs相關的事件。git

trigger相關的事件包括:trigger的觸發、trigger錯過觸發(mis-fire)以及trigger的完成(即trigger觸發的job執行完成)。github

org.quartz.TriggerListener接口web

public interface TriggerListener {

    public String getName();

    public void triggerFired(Trigger trigger, JobExecutionContext context);

    public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context);

    public void triggerMisfired(Trigger trigger);

    public void triggerComplete(Trigger trigger, JobExecutionContext context,
            int triggerInstructionCode);
}

job相關的事件包括:job即將執行的通知以及job執行完畢的通知。spa

org.quartz.JobListener接口:code

public interface JobListener {

    public String getName();

    public void jobToBeExecuted(JobExecutionContext context);

    public void jobExecutionVetoed(JobExecutionContext context);

    public void jobWasExecuted(JobExecutionContext context,
            JobExecutionException jobException);

}

使用自定義的listener

建立一個listener,只須要實現org.quartz.TriggerListener接口或者org.quartz.JobListener 接口便可;而後在運行時將listener註冊到scheduler上,而且須要給listener取個名稱(由於listener須要經過其getName()方法廣播它的名稱)。orm

咱們能夠實現上面提到的接口,但更方便的方式是繼承JobListenerSupport類或者TriggerListenerSupport類,只需重寫須要的方法便可。對象

listener是註冊到scheduler的ListenerManager上的,與listener一同註冊的還有一個Matcher對象,該對象用於描述listener指望接收事件的job或trigger。繼承

listener是在運行的時候註冊到scheduler上的,並且不會與job和trigger同樣保存在JobStore中。由於listener通常是應用的一個集成點(integration point),所以,應用每次運行的時候,listener都應該從新註冊到scheduler上。接口

給一個job添加JobListener:事件

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

能夠對matcher和key下的類進行靜態導入,這樣使得matcher的定義更加清晰:

import static org.quartz.JobKey.*;
import static org.quartz.impl.matchers.KeyMatcher.*;
import static org.quartz.impl.matchers.GroupMatcher.*;
import static org.quartz.impl.matchers.AndMatcher.*;
import static org.quartz.impl.matchers.OrMatcher.*;
import static org.quartz.impl.matchers.EverythingMatcher.*;
...etc.

靜態導入後,上面的實例能夠寫成:

scheduler.getListenerManager().addJobListener(myJobListener, jobKeyEquals(jobKey("myJobName", "myJobGroup")));

給一個group下的全部job添加一個JobListener:

scheduler.getListenerManager().addJobListener(myJobListener, jobGroupEquals("myJobGroup"));

給兩個group下的全部job添加一個JobListener:

scheduler.getListenerManager().addJobListener(myJobListener, or(jobGroupEquals("myJobGroup"), jobGroupEquals("yourGroup")));

給全部的job添加一個JobListener:

scheduler.getListenerManager().addJobListener(myJobListener, allJobs());

TriggerListener的註冊過程與JobListener相似。

Quartz的大部分用戶都不使用listener,但若是應用須要對發生的事件感興趣,固然可讓job顯示通知應用,但顯然listener更方便。

相關文章
相關標籤/搜索