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

SchedulerListener:

1. 监听scheduler的相关事件,包括job/trigger的新增移除,执行期间的报错以及scheduler的关闭。

2. 接口定义

public interface SchedulerListener {
// 当一个JobDetail被scheduled时。
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();
}

使用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抽象类,具体不再赘述。

最新文章

  1. 兼容IE浏览器的js浏览器全屏代码
  2. 我心中的核心组件(可插拔的AOP)~第十五回 我的日志组件Logger.Core(策略,模版方法,工厂,单例等模式的使用)
  3. iOS - (简单平移动画/弹出View的使用)
  4. Linux 常用命令杂记
  5. Hibernate入门(2)- 不用配置用注解
  6. Part 1 What is AngularJS
  7. centos 改动字符集为GB2312的方法
  8. poj 2763: [JLOI2011]飞行路线(spfa分层图最短路)
  9. 学习微信小程序之css15解决父盒子高度塌陷
  10. if 和 swith的选择.
  11. IOS 面试 --- 动画 block
  12. 使用 VB.NET 开发多线程
  13. js正则验证&quot;汉字&quot;
  14. Chloe and pleasant prizes
  15. Yii2中把路由地址中的%2F改为/
  16. 【Android Studio安装部署系列】二、Android Studio开发环境搭建
  17. c/c++ 网络编程 UDP 主机网络信息取得
  18. 文件中间修改内容遇到OSEerror
  19. SSM+MyBatis框架详解
  20. Tensorflow的Queue读取数据机制

热门文章

  1. iOS业务模块化利用CocoaPod入门实践
  2. python用字符串调用当前模块内的函数
  3. 使用COM打开Excel文档注意事项
  4. webRTC中音频相关的netEQ(四):控制命令决策
  5. Error in loadNamespace 的解决之道
  6. 刘志梅2017710101152.《面向对象程序设计(java)》第十三周学习总结
  7. Delphi 7启动后提示Unable to rename delphi32.dro的解决办法
  8. ZOL 3977. Pointers
  9. include和require的区别
  10. CentOS安装MySQL的完整步骤