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,只須要實現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更方便。