QUARTZ系列之二-监听器
Posted po-shi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QUARTZ系列之二-监听器相关的知识,希望对你有一定的参考价值。
Listener
1.是什么: perform actions based on events occurring within the scheduler.
2.分类:a.TriggerListeners ; b.JobListeners ; c.SchedulerListeners
TriggerListener
1. 处理与trigger相关的事件,包括: trigger firings, trigger mis-firings , and trigger completions (the jobs fired off by the trigger is finished).
2. 接口定义:
public interface TriggerListener { // 获取监听器的名称 public String getName(); // 1.Called by the Scheduler when a Trigger has fired,
// 2.before it‘s associated org.quartz.JobDetail is executed.
// 3.called before the vetoJobExecution(..)method
// public void triggerFired(Trigger trigger, JobExecutionContext context);
// 1.如果返回true,将veto关联JobDetail的执行;
// 2. 在triggerFired()方法之后执行
public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context);
// 1. 当trigger misfired之后执行此方法
// 2. 需要注意的是:本方法的耗时需要被关注,因为如果耗时太长,那么当有大量triggers同时misfire时,将会出现问题 public void triggerMisfired(Trigger trigger);
// 1. jobDetail public void triggerComplete(Trigger trigger, JobExecutionContext context, int triggerInstructionCode); }
3. 内置实现:内置实现有俩个,一个是TriggerListenerSupport抽象类,只需要实现getName()指定名称,别的方法都是空的,实现需要实现的即可。
另一个是BroadcastTriggerListener,这个类又是另外一个作用了,相当于一个代理吧,内部有一个TriggerListener实例的集合,当有事件通知时,广播给内部的listeners。主要代码如下:
private List<TriggerListener> listeners; // 内部通过循环进行请求的分发,这样就只需要这个listener与trigger关联了 public void triggerFired(Trigger trigger, JobExecutionContext context) { Iterator<TriggerListener> itr = listeners.iterator(); while(itr.hasNext()) { TriggerListener l = itr.next(); l.triggerFired(trigger, context); } }
JobListener
1. 处理与job有关的事件,包括:the job is about to be executed, and the job has completed execution.
2. 接口定义:
public interface JobListener { public String getName(); // 1.JobDetail即将执行时触发 // 2.如果job被vetoed了,此方法不会执行 public void jobToBeExecuted(JobExecutionContext context); // 触发时机:JobDetail即将执行,但是TriggerListener veto 了该执行时会触发此方法 public void jobExecutionVetoed(JobExecutionContext context); public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException); }
3. 实现:与trigerListener类似,
方法的触发顺序:
triggerFired
jobToBeExecuted
job executing。。。
jobWasExecuted
triggerComplete
使用Listener:
1.名字必须有;2.可以继承support类,不必实现接口实现不需要的方法。
1.通过scheduler的ListenerManager 对象注册在scheduler上,随带着一个Matcher,用来指示listener监听的是那个trigger/job
代码示意如下;
scheduler.getListenerManager().addJobListener(myJobListener, KeyMatcher.jobKeyEquals(new JobKey("myJobName", "myJobGroup")));
Matcher接口方法如下:
public interface Matcher<T extends Key<?>> extends Serializable { boolean isMatch(T key); public int hashCode(); public boolean equals(Object obj); }
Matcher的类型很多,可以根据自己的需要灵活应用:EverythingMatcher,GroupMatcher,KeyMatcher,NameMatcher, AndMatcher, NotMatcher, OrMatcher。这些都可以通过静态方法执行使用,如果有自定义的需求,quartz还提供了StringMatcher抽象类,具体不再赘述。
以上是关于QUARTZ系列之二-监听器的主要内容,如果未能解决你的问题,请参考以下文章