监听器是用来根据调度器发生的事件作出响应的对象。正如你想的那样,TriggerListeners接收触发器相关的事件,JobListeners接收任务相关的事件。java
触发器相关的事件包括:任务触发,任务错过触发(在教程的触发器章节讨论过)以及触发完毕(及由触发器触发的任务执行完毕)。spa
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); }
任务相关的事件包括:任务将要被执行的通知和任务执行完毕的通知code
public interface JobListener { public String getName(); public void jobToBeExecuted(JobExecutionContext context); public void jobExecutionVetoed(JobExecutionContext context); public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException); }
要想建立一个监听器,只须要简单的实现org.quartz.TriggerListener 和/或者org.quartz.JobListener接口。它们将会在运行时被注册到调度器而且被分配一个名字(或者它们必须能经过getName()方法获取到名字)。对象
为了方便,除了实现这些接口以外,您还能够扩展JobListenerSupport或TriggerListenerSupport类,并简单地覆盖你感兴趣的事件。教程
监听器向ListenerManager注册了一个匹配器,该匹配器描述了监听器想要从哪一个任务/触发器接收事件。接口
监听器在运行时在调度器中注册,而且不会与任务和触发器一块儿存储在JobStore中。这是由于监听器一般与你的应用集成在一块儿。由于,每次运行应用程序时,都须要使用调度器从新注册监听程序。事件
scheduler.getListenerManager().addJobListener(myJobListener, KeyMatcher.jobKeyEquals(new JobKey("myJobName", "myJobGroup")));
你可能但愿将匹配器和关键类静态导入,这将使你更清晰地定义匹配器:get
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.
而后上边的例子将变成这样:io
scheduler.getListenerManager().addJobListener(myJobListener, jobKeyEquals(jobKey("myJobName", "myJobGroup")));
scheduler.getListenerManager().addJobListener(myJobListener, jobGroupEquals("myJobGroup"));
scheduler.getListenerManager().addJobListener(myJobListener, or(jobGroupEquals("myJobGroup"), jobGroupEquals("yourGroup")));
scheduler.getListenerManager().addJobListener(myJobListener, allJobs());
...注册TriggerListeners的工做方式相同。class
大多数Quartz用户一般不须要使用监听器,但当应用程序须要接收事件通知的时候使用监听器会很方便,由于Job自己没必要显式地通知应用程序。