监听器顾名思义是当发生某些事件是,发生对应行为的一系列对象。你可能已经猜到了,TriggerListener监听的是trigger相关的事件,JobListener监听的是job相关的事件。trigger相关的事件包括触发器哑火、触发器结束。
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监听事件包括任务开始执行的通知事件和任务执行结束的通知事件。
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);
}
创建自己的监听器
要创建自己的监听器,只需要实现定义的接口即可。在运行时会将监听器注册到scheduler,监听器必须制定一个name(通过实现getName方法)。
为了方便起见,也可以直接继承JobListenerSupport or TriggerListenerSupport,然后重写你的方法即可。
listener的初始化是由ListenerManager完成的。同时还需要一个匹配所监听的job/trigger的匹配器,如下:
为job添加listener
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")));
- 为一个group的job添加listener
scheduler.getListenerManager().addJobListener(myJobListener, jobGroupEquals("myJobGroup"));
- 为两个group的job添加listener:
scheduler.getListenerManager().addJobListener(myJobListener, or(jobGroupEquals("myJobGroup"), jobGroupEquals("yourGroup")));
- 为所有job添加listener
scheduler.getListenerManager().addJobListener(myJobListener, allJobs());
triggerListener同理。
Quartz使用listener的并不多,但如果有类似的事件通知需求,而job本身没有这个功能,监听器是很有用的。
原文链接:
http://www.quartz-scheduler.org/documentation/quartz-2.2.x/tutorials/tutorial-lesson-08.html