监听器是您创建的对象,用于根据调度程序中发生的事件执行操作。正如您可能猜到的,TriggerListeners接收与触发器相关的事件,JobListeners 接收与Jobs相关的事件。
与触发器相关的事件包括:触发器触发,触发器触发失败(在本文档的“触发器”部分中讨论)和触发器完成(触发器触发的作业完成)。
The org.quartz.TriggerListener Interface
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完成执行时的通知。
The org.quartz.JobListener Interface
public interface JobListener {
public String getName();
public void jobToBeExecuted(JobExecutionContext context);
public void jobExecutionVetoed(JobExecutionContext context);
public void jobWasExecuted(JobExecutionContext context,
JobExecutionException jobException);
}
Using Your Own Listeners
要创建一个监听器,只需创建一个实现org.quartz.TriggerListener和/或org.quartz.JobListener接口的对象。然后在运行时向调度程序注册监听器,并且必须为其指定名称(或者更确切地说,他们必须通过getName()方法通告自己的名称)。
为方便起见,除了实现这些接口之外,您的类还可以扩展JobListenerSupport或TriggerListenerSupport类,并简单地覆盖您感兴趣的事件。
监听器与调度程序的ListenerManager一起注册,并附带一个Matcher,用于描述监听器想要接收事件的Jobs/触发器。
监听器在运行时在调度程序中注册,并且不与Jobs和触发器一起存储在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本身不必显式通知应用程序。