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
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系列之二-监听器的更多相关文章
- Sql Server来龙去脉系列之二 框架和配置
本节主要讲维持数据的元数据,以及数据库框架结构.内存管理.系统配置等.这些技术点在我们使用数据库时很少接触到,但如果要深入学习Sql Server这一章节也是不得不看.本人能力有限不能把所有核心的知识 ...
- 【疯狂造轮子-iOS】JSON转Model系列之二
[疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...
- 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新
上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...
- MySQL 系列(二) 你不知道的数据库操作
第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 本章内容: 查看\创建\使用\删除 数据库 用户管理及授权实战 局域网 ...
- ES6+ 现在就用系列(二):let 命令
系列目录 ES6+ 现在就用系列(一):为什么使用ES6+ ES6+ 现在就用系列(二):let 命令 ES6+ 现在就用系列(三):const 命令 ES6+ 现在就用系列(四):箭头函数 => ...
- CRL快速开发框架系列教程二(基于Lambda表达式查询)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- Web 前端开发精华文章推荐(jQuery、HTML5、CSS3)【系列十二】
2012年12月12日,[<Web 前端开发人员和设计师必读文章>系列十二]和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HT ...
- C#微信公众号开发系列教程二(新手接入指南)
http://www.cnblogs.com/zskbll/p/4093954.html 此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可 ...
- 当我们说线程安全时,到底在说什么——Java进阶系列(二)
原创文章,同步发自作者个人博客,转载请以超链接形式在文章开头处注明出处http://www.jasongj.com/java/thread_safe/ 多线程编程中的三个核心概念 原子性 这一点,跟数 ...
随机推荐
- linux 线程同步
参考链接:https://blog.csdn.net/daaikuaichuan/article/details/82950711#font_size5font_2 一,互斥锁 #include &l ...
- PAT 乙级 1044 火星数字 (20 分)
1044 火星数字 (20 分) 火星人是以 13 进制计数的: 地球人的 0 被火星人称为 tret. 地球人数字 1 到 12 的火星文分别为:jan, feb, mar, apr, may, j ...
- leetcode 921. 使括号有效的最少添加(Python)
class Solution: def minAddToMakeValid(self, S): """ :type S: str :rtype: int "&q ...
- 通过c++11的condition_variable实现的有最大缓存限制的队列
之前曾写过一个通过C++11的condition_variable实现的有最大缓存限制的队列,底层使用std::queue来实现,如果想要提升性能的话,可以考虑改用固定的长度环形数组.环形数组实现如下 ...
- navicat 导入execl失败
在使用navicat导入execl是遇到了如下图的错误 在更换多个版本的navicat后问题依然如故. 解决办法; 1.打开需要导入的execl 2.安装一个AccessDatabaseEngine_ ...
- 搭建真正的zookeeper集群
搭建zookeeper伪分布式集群 zookeeper是Hadop Ecosystem中非常重要的组件,它的主要功能是为分布式系统提供一致性协调服务, 提供的功能包括配置维护,域名服务,分布式同步和组 ...
- pycharm移动项目文件后,运行报错
pycharm移动项目文件后,运行报错: ModuleNotFoundError: No module named 'D:/my_project/my_cases/email139cases/tes ...
- Angular6 Observable.fromEvent error: “Invalid event target”
今天在angular6项目中写了个拖拽功能,但是控制台报错,如图 后来在控制台打出发现,原来是 ngOnInit( ) 这个生命周期里,页面的dom节点还未产生,还只是null. 改为用 ngAfte ...
- [持续交付实践] Jenkins Pipeline 高可用设计方法
前言 这篇写好一段时间了,一直也没发布上来,今天稍微整理下了交下作业,部分内容偷懒引用了一些别人的内容.使用Jenkins做持续集成/持续交付,当业务达到一定规模的时候,Jenkins本身就很容易成为 ...
- 【学习】Python进行数据提取的方法总结【转载】
链接:http://www.jb51.net/article/90946.htm 数据提取是分析师日常工作中经常遇到的需求.如某个用户的贷款金额,某个月或季度的利息总收入,某个特定时间段的贷款金额和笔 ...