Listeners是您创建的对象,用于根据调度程序中发生的事件执行操作。
1. JobListenser
job相关事件包括:job即将执行的通知,以及job完成执行时的通知。
org.quartz.JobListener接口:
public interface JobListener {
public String getName();
public void jobToBeExecuted(JobExecutionContext context);
public void jobExecutionVetoed(JobExecutionContext context);
public void jobWasExecuted(JobExecutionContext context,
JobExecutionException jobException);
}
(1)创建一个JobListenser接口
要创建一个listener,只需创建一个实现org.quartz.JobLitenser接口的对象。然后,listener在运行时会向调度程序注册,并且必须给出一个名称(或者,他们必须通过他们的getName()方法来获得自己的名字)。
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobListener;
public class MyJobListener implements JobListener {
private String name;
public MyJobListener(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void jobToBeExecuted(JobExecutionContext context) {
// do something with the event
}
public void jobWasExecuted(JobExecutionContext context,
JobExecutionException jobException) {
// do something with the event
}
public void jobExecutionVetoed(JobExecutionContext context) {
// do something with the event
}
}
为了方便起见,实现这些接口,类也可以扩展JobListenerSuppor类,并且只需覆盖感兴趣的事件。
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.listeners.JobListenerSupport;
public class MyOtherJobListener extends JobListenerSupport {
private String name;
public MyOtherJobListener(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public void jobWasExecuted(JobExecutionContext context,
JobExecutionException jobException) {
// do something with the event
}
}
(2)使用JobListenser
listener与调度程序的ListenerManager一起注册,并配有描述listener希望接收事件的job的Matcher。 :::info Listener在运行时间内与调度程序一起注册,并且不与jobs和触发器一起存储在JobStore中。这是因为Listenser通常是与应用程序的集成点。因此,每次运行应用程序时,都需要重新注册该调度程序。 ::: 需要为匹配器和关键类使用静态导入,这将使定义匹配器更简洁:
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.*;
向调度程序注册一个作业监听器,以侦听所有作业
scheduler.getListenerManager().addJobListener(myJobListener, allJobs());
向调度程序注册一个作业监听器,以侦听特定的作业
scheduler.getListenerManager().addJobListener(myJobListener, jobKeyEquals(jobKey("myJobName", "myJobGroup")));
向调度程序注册一个作业监听器,以侦听两个特定的作业
scheduler.getListenerManager().addJobListener(myJobListener, or(jobGroupEquals("myJobGroup"), jobGroupEquals("yourGroup")));
向调度程序注册一个作业监听器,以侦听一个特定组的所有作业
scheduler.getListenerManager().addJobListener(myJobListener, jobGroupEquals("myJobGroup"));
2. TriggerListenser
(1)创建一个TriggerListenser接口
要创建一个listener,只需创建一个实现org.quartz.TriggerListener接口的对象。然后,listener在运行时会向调度程序注册,并且必须给出一个名称(或者,他们必须通过他们的getName()方法来获得自己的名字)。
import org.quartz.JobExecutionContext;
import org.quartz.Trigger;
import org.quartz.TriggerListener;
import org.quartz.Trigger.CompletedExecutionInstruction;
public class MyTriggerListener implements TriggerListener {
private String name;
public MyTriggerListener(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void triggerComplete(Trigger trigger, JobExecutionContext context,
CompletedExecutionInstruction triggerInstructionCode) {
// do something with the event
}
public void triggerFired(Trigger trigger, JobExecutionContext context) {
// do something with the event
}
public void triggerMisfired(Trigger trigger) {
// do something with the event
}
public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) {
// do something with the event
return false;
}
}
为了方便起见,实现这些接口,类也可以扩展TriggerListenerSupport类,并且只需覆盖感兴趣的事件。
import org.quartz.JobExecutionContext;
import org.quartz.Trigger;
import org.quartz.listeners.TriggerListenerSupport;
public class MyOtherTriggerListener extends TriggerListenerSupport {
private String name;
public MyOtherTriggerListener(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public void triggerFired(Trigger trigger, JobExecutionContext context) {
// do something with the event
}
}
(2)使用TriggerListenser
listener与调度程序的TriggerManager一起注册,并配有描述listener希望接收事件的触发器的Matcher。
需要为匹配器和关键类使用静态导入,这将使定义匹配器更简洁:
import static org.quartz.TriggerKey.*;
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.*;
向调度程序注册一个trigger监听器,以侦听所有trigger
scheduler.getListenerManager().addTriggerListener(myTriggerListener, allTriggers());
向调度程序注册一个trigger监听器,以侦听特定的trigger
scheduler.getListenerManager().addTriggerListener(myTriggerListener, triggerKeyEquals(triggerKey("myTriggerName", "myTriggerGroup")));
向调度程序注册一个trigger监听器,以侦听一个特定组的所有trigger
scheduler.getListenerManager().addTriggerListener(myTriggerListener, triggerGroupEquals("myTriggerGroup"));
3. SchedulerListenser
SchedulerListeners非常类似于TriggerListeners和JobListeners,除了它们在Scheduler本身中接收到事件的通知 - 不一定与特定触发器(trigger)或job相关的事件。
与计划程序相关的事件包括:添加job/触发器,删除job/触发器,调度程序中的严重错误,关闭调度程序的通知等。
org.quartz.SchedulerListener接口:
public interface SchedulerListener {
public void jobScheduled(Trigger trigger);
public void jobUnscheduled(String triggerName, String triggerGroup);
public void triggerFinalized(Trigger trigger);
public void triggersPaused(String triggerName, String triggerGroup);
public void triggersResumed(String triggerName, String triggerGroup);
public void jobsPaused(String jobName, String jobGroup);
public void jobsResumed(String jobName, String jobGroup);
public void schedulerError(String msg, SchedulerException cause);
public void schedulerStarted();
public void schedulerInStandbyMode();
public void schedulerShutdown();
public void schedulingDataCleared();
}
(1)创建SchedulerListenser
继承SchedulerListenerSupport并重写它的方法:
import org.quartz.Trigger;
import org.quartz.listeners.SchedulerListenerSupport;
public class MyOtherSchedulerListener extends SchedulerListenerSupport {
@Override
public void schedulerStarted() {
// do something with the event
}
@Override
public void schedulerShutdown() {
// do something with the event
}
@Override
public void jobScheduled(Trigger trigger) {
// do something with the event
}
}
(2)使用SchedulerListener
SchedulerListeners注册到调度程序的ListenerManager。SchedulerListeners几乎可以实现任何实现org.quartz.SchedulerListener接口的对象。
添加SchedulerListener:
scheduler.getListenerManager().addSchedulerListener(mySchedListener);
删除SchedulerListener:
scheduler.getListenerManager().removeSchedulerListener(mySchedListener);