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

QUARTZ系列之二-监听器的更多相关文章

  1. Sql Server来龙去脉系列之二 框架和配置

    本节主要讲维持数据的元数据,以及数据库框架结构.内存管理.系统配置等.这些技术点在我们使用数据库时很少接触到,但如果要深入学习Sql Server这一章节也是不得不看.本人能力有限不能把所有核心的知识 ...

  2. 【疯狂造轮子-iOS】JSON转Model系列之二

    [疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...

  3. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  4. MySQL 系列(二) 你不知道的数据库操作

    第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 本章内容: 查看\创建\使用\删除 数据库 用户管理及授权实战 局域网 ...

  5. ES6+ 现在就用系列(二):let 命令

    系列目录 ES6+ 现在就用系列(一):为什么使用ES6+ ES6+ 现在就用系列(二):let 命令 ES6+ 现在就用系列(三):const 命令 ES6+ 现在就用系列(四):箭头函数 => ...

  6. CRL快速开发框架系列教程二(基于Lambda表达式查询)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  7. Web 前端开发精华文章推荐(jQuery、HTML5、CSS3)【系列十二】

    2012年12月12日,[<Web 前端开发人员和设计师必读文章>系列十二]和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HT ...

  8. C#微信公众号开发系列教程二(新手接入指南)

    http://www.cnblogs.com/zskbll/p/4093954.html 此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可 ...

  9. 当我们说线程安全时,到底在说什么——Java进阶系列(二)

    原创文章,同步发自作者个人博客,转载请以超链接形式在文章开头处注明出处http://www.jasongj.com/java/thread_safe/ 多线程编程中的三个核心概念 原子性 这一点,跟数 ...

随机推荐

  1. linux 线程同步

    参考链接:https://blog.csdn.net/daaikuaichuan/article/details/82950711#font_size5font_2 一,互斥锁 #include &l ...

  2. PAT 乙级 1044 火星数字 (20 分)

    1044 火星数字 (20 分) 火星人是以 13 进制计数的: 地球人的 0 被火星人称为 tret. 地球人数字 1 到 12 的火星文分别为:jan, feb, mar, apr, may, j ...

  3. leetcode 921. 使括号有效的最少添加(Python)

    class Solution: def minAddToMakeValid(self, S): """ :type S: str :rtype: int "&q ...

  4. 通过c++11的condition_variable实现的有最大缓存限制的队列

    之前曾写过一个通过C++11的condition_variable实现的有最大缓存限制的队列,底层使用std::queue来实现,如果想要提升性能的话,可以考虑改用固定的长度环形数组.环形数组实现如下 ...

  5. navicat 导入execl失败

    在使用navicat导入execl是遇到了如下图的错误 在更换多个版本的navicat后问题依然如故. 解决办法; 1.打开需要导入的execl 2.安装一个AccessDatabaseEngine_ ...

  6. 搭建真正的zookeeper集群

    搭建zookeeper伪分布式集群 zookeeper是Hadop Ecosystem中非常重要的组件,它的主要功能是为分布式系统提供一致性协调服务, 提供的功能包括配置维护,域名服务,分布式同步和组 ...

  7. pycharm移动项目文件后,运行报错

    pycharm移动项目文件后,运行报错: ModuleNotFoundError:  No module named 'D:/my_project/my_cases/email139cases/tes ...

  8. Angular6 Observable.fromEvent error: “Invalid event target”

    今天在angular6项目中写了个拖拽功能,但是控制台报错,如图 后来在控制台打出发现,原来是 ngOnInit( ) 这个生命周期里,页面的dom节点还未产生,还只是null. 改为用 ngAfte ...

  9. [持续交付实践] Jenkins Pipeline 高可用设计方法

    前言 这篇写好一段时间了,一直也没发布上来,今天稍微整理下了交下作业,部分内容偷懒引用了一些别人的内容.使用Jenkins做持续集成/持续交付,当业务达到一定规模的时候,Jenkins本身就很容易成为 ...

  10. 【学习】Python进行数据提取的方法总结【转载】

    链接:http://www.jb51.net/article/90946.htm 数据提取是分析师日常工作中经常遇到的需求.如某个用户的贷款金额,某个月或季度的利息总收入,某个特定时间段的贷款金额和笔 ...