我们有这么一种需求,在每个任务运行结束之后发送通知给运维管理员。那是不是要在每个任务的最后添加一行代码呢?这种方式对原来的代码造成了入侵,不利于维护。如果代码不是写在任务代码的最后一行,怎么知道任务执行完了呢?或者说,怎么监测到任务的生命周期呢?

观察者模式:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖它的对象都会得到通知并自动更新。

Quartz中提供了三种 Listener,监听 Scheduler的,监听 Trigger的,监听 Job的。

只需要创建类实现相应的接口,并在 Scheduler上注册 Listener,便可实现对核心对象的监听。

public class MyJobListenerTest {public static void main(String[] args) throws SchedulerException {// JobDetailJobDetail jobDetail = JobBuilder.newJob(MyJob1.class).withIdentity("job1", "group1").build();// TriggerTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever()).build();// SchedulerFactorySchedulerFactory  factory = new StdSchedulerFactory();// SchedulerScheduler scheduler = factory.getScheduler();scheduler.scheduleJob(jobDetail, trigger);// 创建并注册一个全局的Job Listenerscheduler.getListenerManager().addJobListener(new MyJobListener(), EverythingMatcher.allJobs());scheduler.start();}}
public class MySchedulerListenerTest {public static void main(String[] args) throws SchedulerException {// JobDetailJobDetail jobDetail = JobBuilder.newJob(MyJob1.class).withIdentity("job1", "group1").build();// TriggerTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever()).build();// SchedulerFactorySchedulerFactory  factory = new StdSchedulerFactory();// SchedulerScheduler scheduler = factory.getScheduler();scheduler.scheduleJob(jobDetail, trigger);// 创建Scheduler Listenerscheduler.getListenerManager().addSchedulerListener(new MySchedulerListener());scheduler.start();}}
public class MyTriggerListenerTest {public static void main(String[] args) throws SchedulerException {// JobDetailJobDetail jobDetail = JobBuilder.newJob(MyJob1.class).withIdentity("job1", "group1").build();// TriggerTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(10).repeatForever()).build();// SchedulerFactorySchedulerFactory  factory = new StdSchedulerFactory();// SchedulerScheduler scheduler = factory.getScheduler();scheduler.scheduleJob(jobDetail, trigger);// 创建并注册一个全局的Trigger Listenerscheduler.getListenerManager().addTriggerListener(new MyTriggerListener("myListener1"), EverythingMatcher.allTriggers());// 创建并注册一个局部的Trigger Listenerscheduler.getListenerManager().addTriggerListener(new MyTriggerListener("myListener2"), KeyMatcher.keyEquals(TriggerKey.triggerKey("trigger1", "gourp1")));// 创建并注册一个特定组的Trigger ListenerGroupMatcher<TriggerKey> matcher = GroupMatcher.triggerGroupEquals("gourp1");scheduler.getListenerManager().addTriggerListener(new MyTriggerListener("myListener3"), matcher);scheduler.start();}}

JobListener

四个方法:

方法 作用或执行实际
getName() 返回JobListener 的名称
jobToBeExecuted() Scheduler 在JobDetail 将要被执行时调用这个方法
jobExecutionVetoed() Scheduler 在JobDetail 即将被执行,但又被TriggerListener 否决了时调用这个
方法
jobWasExecuted() Scheduler 在JobDetail 被执行之后调用这个方法

工具类:ListenerManager,用于添加、获取、移除监听器

工具类:Matcher,主要是基于 groupName和 keyName进行匹配。

TriggerListener

方法 作用或执行实际
getName() 返回监听器的名称
triggerFired() Trigger 被触发,Job 上的execute() 方法将要被执行时,Scheduler 就调用这个
方法
vetoJobExecution() 在Trigger 触发后, Job 将要被执行时由Scheduler 调用这个方法。
TriggerListener 给了一个选择去否决Job 的执行。假如这个方法返回true,这
个Job 将不会为此次Trigger 触发而得到执行
triggerMisfired() Trigger 错过触发时调用
triggerComplete() Trigger 被触发并且完成了Job 的执行时,Scheduler 调用这个方法

Quartz框架中的Listener相关推荐

  1. Quartz框架中的JobStore

    问题:最多可以运行多少个任务(磁盘.内存.线程数) Jobstore用来存储任务和触发器相关的信息,例如所有任务的名称.数量.状态等等.Quartz中有两种存储任务的方式,一种在在内存,一种是在数据库 ...

  2. Quartz框架中的Scheduler

    调度器,是 Quartz的指挥官,由 StdSchedulerFactory产生.它是单例的.并且是 Quartz中最重要的 API,默认是实现类是 StdScheduler,里面包含了一个Quart ...

  3. Quartz框架中的Trigger

    定义任务的触发规律,Trigger,使用 TriggerBuilder来构建. JobDetail跟 Trigger是 1:N的关系. 思考:为什么要解耦? Trigger接口在 Quartz有 4个 ...

  4. Quartz框架之触发器(3)

    1 关于Quartz的触发器 Quartz框架中的触发器的主要功能就是指明何时该触发任务的执行, 触发器包含一系列的定义信息,开发人员可根据实际情形自定义对应的触发器. triggerKey 用于分组 ...

  5. SpringBoot与quartz框架实现分布式定时任务

    前言 quartz的分布式调度策略是以数据库为边界资源的一种异步策略.各个调度器都遵守一个基于数据库锁的操作规则从而保证了操作的唯一性. 在quartz的集群解决方案里有张表scheduler_loc ...

  6. Quartz 框架快速入门(二)

    尽可能的用声明式处理软件配置,其次才考虑编程式的方式.在上一篇<Quartz 框架快速入门(一)>中,如果我们要在 Job 启动之后改变它的执行时间和频度,必须去修改源代码重新编译.这种方 ...

  7. SSH框架中配置log4j的方法

    /*2011年8月29日 09:52:54 by Rush*/ SSH框架中使用log4j的方便之处 1. 动态的改变记录级别和策略,即修改log4j.properties,不需要重启Web应用,这需 ...

  8. Quartz框架多个trigger任务执行出现漏执行的问题分析--转

    原文地址:http://blog.csdn.net/dailywater/article/details/51470779 一.问题描述  使用Quartz配置定时任务,配置了超过10个定时任务,这些 ...

  9. Quartz 框架快速入门(四)

    Spring的scheduling.quartz包中对Quartz框架进行了封装,使得开发时不用写任何QuartSpring的代码就可以实现定时任务.Spring通过JobDetailBean,Met ...

最新文章

  1. Spring事务失效的原因
  2. 一加7t人脸识别_一加7T跑分及配置信息曝光;新款iPad Pro曝光增加3D ToF镜头
  3. //某父元素(.class)底下相同class的第二的取值
  4. 数据结构:单向环形链表
  5. mysql选择索引逻辑_Mysql索引选择逻辑
  6. 解决php的It is not safe to rely on the system’s timezone settings的问题
  7. 解决kettle配置文件中的中文乱码
  8. scp会覆盖同名文件吗_你会Hypermesh一键式完成几何文件到求解文件的输出吗?
  9. C# OpenTK教程 - 1.2 你好三角形
  10. Intel Pin架构
  11. phalapi 数据库锁_phalApi数据库操作
  12. 【Amaple教程】4. 组件
  13. java 软考_关于软考
  14. java语言获取应用服务器的时间_java如何获得服务器时间
  15. 为软件简单加密的小程序,附源码
  16. 流媒体相关资源下载地址(整理)
  17. 计算机专业毕业祝福语,大学毕业生祝福语
  18. 通过路由器SF上网设置方法.....
  19. 吴恩达机器学习课后作业——神经网络
  20. DOS/WinPE双启动移动硬盘制作详解

热门文章

  1. HttpURLConnection 发送http请求帮助类
  2. 剑指offer:变态跳台阶
  3. 【论文阅读-Bidding】《Feedback Control of Real-Time Display Advertising》
  4. 上古神器之Vim编辑器
  5. modbus3-关于Modicon Modbus Protocol和modscan32
  6. io-同步 异步 阻塞 非阻塞
  7. spring boot 架构问题 时间处理 (映射,时区问题)
  8. 【动态代理】从源码实现角度剖析JDK动态代理
  9. eclipse 快捷键大全
  10. 【Python】Docx解析