第7课 TriggerListener和JobListener
监听器是在调度器中基于事件机制执行操作的对象。你大概可以猜到,TriggerListener接收与触发器有关的事件,JobListener接收与作业任务有关的事件。
与Trigger有关的事件包括:trigger触发、trigger触发失败(在Trigger部分谈论过了)和trigger触发完成(trigger触发的job完成了)。
org.quartz.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); } |
与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); } |
使用你自己的监听器
要创建一个监听器,可以简单地创建一个实现org.quartz.TriggerListener或org.quartz.JobListener接口的对象即可。监听器会在运行时注册到调度器中,并且必须要给定监听器名(或者更确切地说,监听器会调用getName方法获取自己的名字)。
为了方便使用,监听器除了可以实现这些接口,你还可以继承JobListenerSupport和TriggerListenerSupport类,可以只重写你感兴趣的事件方法。
监听器注册到调度器中的监听器管理类时还携带着一个匹配器,这个匹配器描述了作业任务和触发器的监听器想接收的事件。
在运行时,监听器会被注册到schedule中,但是不会像job和trigger那样存储到JobStore中。那是因为监听器在你的应用中通常是一些点的集合。因此,每次应用运行时,监听器都需要重新在调度器中注册。
1、给特定的job添加监听器:
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")));
2、给特定组的所有job添加JobListener:
scheduler.getListenerManager().addJobListener(myJobListener, jobGroupEquals("myJobGroup"));
3、给两个特定组的所有job添加JobListener:
scheduler.getListenerManager().addJobListener(myJobListener, or(jobGroupEquals("myJobGroup"), jobGroupEquals("yourGroup")));
4、给所有job添加监听器:
scheduler.getListenerManager().addJobListener(myJobListener, allJobs());
注册TriggerListener也是同样的方法。
大部分的Quartz用户都不会用到监听器,但是当应用要求创建需要的事件通知时,而没有Job实例去通知应用时,使用监听器非常方便。