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. xirr函数

    内部收益计算函数 曾经看过一个帖子:有一个理财产品,每年年初存入10000元,每年年底得到利息1000元.持续5年,5年后返还本金50000元:问:利率是多少?下面有个回复:每年存10000,利息10 ...

  2. Virtualbox扩展硬盘

    动态调整 1.VBoxManage showhdinfo win10.vdi 2.VBoxManage modifyhd win10.vdi --resize 61200 3.磁盘管理器中分配空间并格 ...

  3. [转][Oracle]清理归档日志

    来自:https://www.cnblogs.com/Roobbin/p/9617962.html 在Oracle 服务器,打开cmd命令行,执行以下命令: rman target / crossch ...

  4. C/C++中的函数指针的使用与总结

    概要: 函数指针介绍 typedef简化函数指针的定义 指向函数的指针的初始化和赋值 通过指针调用函数 函数指针形参 返回指向函数的指针 指向重载函数的指针 参考<C++ Primer> ...

  5. 聊一聊isinstance与type

    聊一聊isinstance与type 最近写代码的时候遇到了一个关于isinstance与type的坑,这里给大家分享下,如果大家也遇到了同样的问题,希望本文能为大家解决疑惑把. isinstance ...

  6. PTA币值转化

    include<stdio.h> include<math.h> int n,s=0; int main(void){ int i,j,k,p=1,flag=1; int f( ...

  7. Python解释器的安装

    Python解释器的安装 作者:Eric 微信:loveoracle11g 下载Python Python-3.7.0(64-bit)下载链接地址: https://www.python.org/ft ...

  8. ubuntu go环境安装搭建

    一.安装必备环境 sudo apt-get install git golang-go vim sublime-text-installer 如果出现安装错误,进行修复安装: sudo apt-get ...

  9. vue-cli 发布部署IIS

    有些时候我们的服务器不用的是node,也许是IIS,这样就需要把工程构建出来,与IIS集成. 构建的命令如下 cnpm run build 将其中的dist文件夹拷贝出来,放到IIS的发布目录,在浏览 ...

  10. vue.js 自定义事件

    <div id="app"> <h2>{{num}}</h2> <h1>全局组件</h1> <my-compone ...