监听器是用来根据调度器发生的事件做出响应的对象。正如你想的那样,TriggerListeners接收触发器相关的事件,JobListeners接收任务相关的事件。
触发器相关的事件包括:任务触发,任务错过触发(在教程的触发器章节讨论过)以及触发完毕(及由触发器触发的任务执行完毕)。
TriggerListener接口代码
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);
}
任务相关的事件包括:任务将要被执行的通知和任务执行完毕的通知
JobListener接口代码
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中。这是因为监听器通常与你的应用集成在一起。因为,每次运行应用程序时,都需要使用调度器重新注册监听程序。
添加对特定作业感兴趣的JobListener:
scheduler.getListenerManager().addJobListener(myJobListener, KeyMatcher.jobKeyEquals(new JobKey("myJobName", "myJobGroup")));
你可能希望将匹配器和关键类静态导入,这将使你更清晰地定义匹配器:
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")));
添加对特定组的所有作业感兴趣的JobListener:
scheduler.getListenerManager().addJobListener(myJobListener, jobGroupEquals("myJobGroup"));
添加对两个特定组的所有作业感兴趣的JobListener:
scheduler.getListenerManager().addJobListener(myJobListener, or(jobGroupEquals("myJobGroup"), jobGroupEquals("yourGroup")));
添加对所有作业感兴趣的JobListener:
scheduler.getListenerManager().addJobListener(myJobListener, allJobs());
...注册TriggerListeners的工作方式相同。
大多数Quartz用户通常不需要使用监听器,但当应用程序需要接收事件通知的时候使用监听器会很方便,因为Job本身不必显式地通知应用程序。