文章目录

  • 概述
  • TriggerListener接口方法
  • 示例
  • 示例源码

概述

Quartz-JobListener解读

与 JobListener 有所不同的是, TriggerListener 接口还有关于 Trigger 实例生命周期的方法。


TriggerListener接口方法

我们先看下TriggerListener的源码

import org.quartz.Trigger.CompletedExecutionInstruction;public interface TriggerListener {String getName();void triggerFired(Trigger var1, JobExecutionContext var2);boolean vetoJobExecution(Trigger var1, JobExecutionContext var2);void triggerMisfired(Trigger var1);void triggerComplete(Trigger var1, JobExecutionContext var2, CompletedExecutionInstruction var3);
}
  • getName():和前面的 JobListener 一样,TriggerListner 接口的 getName()返回一个字符串用以说明监听器的名称。对于非全局的 TriggerListener,在 addTriggerListener()方法中给定的名称必须与监听器的 getName() 方法返回值相匹配。

  • triggerFired() :当与监听器相关联的 Trigger 被触发,Job 上的 execute()方法将要被执行时,Scheduler 就调用这个方法。在全局 TriggerListener 情况下,这个方法为所有 Trigger被调用。

  • vetoJobExecution():在 Trigger 触发后,Job 将要被执行时由 Scheduler调用这个方法。TriggerListener 给了一个选择去否决 Job 的执行。假如这个方法返回 true,这个 Job 将不会为此次Trigger 触发而得到执行。

  • triggerMisfired():Scheduler 调用这个方法是在 Trigger 错过触发时。如这个方法的 JavaDoc所指出的,你应该关注此方法中持续时间长的逻辑:在出现许多错过触发的 Trigger 时,长逻辑会导致骨牌效应。你应当保持这上方法尽量的小。

  • triggerComplete():Trigger 被触发并且完成了 Job 的执行时,Scheduler 调用这个方法。这不是说这个Trigger 将不再触发了,而仅仅是当前 Trigger 的触发(并且紧接着的 Job 执行) 结束时。这个 Trigger也许还要在将来触发多次的。


示例

Job

package com.xgj.quartz.quartzItself.listener.triggerListener;import java.text.SimpleDateFormat;
import java.util.Date;import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;public class SimpleJob1 implements Job {public void execute(JobExecutionContext context)throws JobExecutionException {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");JobKey jobKey = context.getJobDetail().getKey();System.out.println("\nJob1 - 任务key "+ jobKey+ "执行时间:"+ sdf.format(new Date()));}
}

Job

package com.xgj.quartz.quartzItself.listener.triggerListener;import java.text.SimpleDateFormat;
import java.util.Date;import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;public class SimpleJob2 implements Job {public void execute(JobExecutionContext context)throws JobExecutionException {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");JobKey jobKey = context.getJobDetail().getKey();System.err.println("\nJob2 - 任务key "+ jobKey+ "执行时间:"+ sdf.format(new Date()));}
}

自定义TriggerListener

package com.xgj.quartz.quartzItself.listener.triggerListener;import org.quartz.JobExecutionContext;
import org.quartz.Trigger;
import org.quartz.TriggerListener;public class MyTriggerListener implements TriggerListener {@Overridepublic String getName() {return "MyTriggerListener";}/*** (1) Trigger被激发 它关联的job即将被运行** @param trigger* @param context*/@Overridepublic void triggerFired(Trigger trigger, JobExecutionContext context) {System.out.println("MyTrigger监听器:" + trigger.getJobKey()+ ",进入方法 triggerFired()");}/*** (2) Trigger被激发 它关联的job即将被运行,先执行(1),在执行(2) 如果返回TRUE 那么任务job会被终止** @param trigger* @param context* @return*/@Overridepublic boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) {System.out.println("MyTrigger监听器:" + trigger.getJobKey()+ ",vetoJobExecution()");return false;}/*** (3) 当Trigger错过被激发时执行,比如当前时间有很多触发器都需要执行,但是线程池中的有效线程都在工作,那么有的触发器就有可能超时,* 错过这一轮的触发。** @param trigger*/@Overridepublic void triggerMisfired(Trigger trigger) {System.out.println("MyTrigger监听器:" + trigger.getJobKey()+ ",triggerMisfired()");}/*** (4) 任务完成时触发** @param trigger* @param jobExecutionContext* @param completedExecutionInstruction*/@Overridepublic void triggerComplete(Trigger trigger,JobExecutionContext jobExecutionContext,Trigger.CompletedExecutionInstruction completedExecutionInstruction) {System.out.println("MyTrigger监听器:" + trigger.getJobKey()+ ",triggerComplete()");}
}

调度类

package com.xgj.quartz.quartzItself.listener.triggerListener;import static org.quartz.JobBuilder.newJob;
import static org.quartz.TriggerBuilder.newTrigger;import org.quartz.JobDetail;
import org.quartz.Matcher;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SchedulerMetaData;
import org.quartz.Trigger;
import org.quartz.TriggerKey;
import org.quartz.TriggerListener;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.matchers.KeyMatcher;public class TriggerListenerDemo {public static void main(String[] args) throws Exception {System.out.println("------- 初始化 ----------------------");// SchedulerSchedulerFactory schedulerFactory = new StdSchedulerFactory();Scheduler scheduler = schedulerFactory.getScheduler();// JobJobDetail job = newJob(SimpleJob1.class).withIdentity("job1","group1").build();// TirggerTrigger trigger = newTrigger().withIdentity("trigger1", "group1").startNow().build();// 设置监听器TriggerListener triggerListener = new MyTriggerListener();Matcher<TriggerKey> matcher = KeyMatcher.keyEquals(trigger.getKey());scheduler.getListenerManager().addTriggerListener(triggerListener,matcher);// 将job任务加入到调度器scheduler.scheduleJob(job, trigger);// 开始任务System.out.println("------- 开始执行调度器 Scheduler ----------------");scheduler.start();try {System.out.println("------- 等待 30 秒... --------------");Thread.sleep(30L * 1000L);} catch (Exception e) {e.printStackTrace();}scheduler.shutdown(true);System.out.println("------- 关闭调度器 -----------------");SchedulerMetaData metaData = scheduler.getMetaData();System.out.println("~~~~~~~~~~  执行了 "+ metaData.getNumberOfJobsExecuted() + " 个 jobs.");}}

运行结果

------- 初始化 ----------------------
INFO  StdSchedulerFactory - Using default implementation for ThreadExecutor
INFO  SimpleThreadPool - Job execution threads will use class loader of thread: main
INFO  SchedulerSignalerImpl - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
INFO  QuartzScheduler - Quartz Scheduler v.2.2.3 created.
INFO  RAMJobStore - RAMJobStore initialized.
INFO  QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v2.2.3) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED'Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.NOT STARTED.Currently in standby mode.Number of jobs executed: 0Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.INFO  StdSchedulerFactory - Quartz scheduler 'DefaultQuartzScheduler' initialized from default resource file in Quartz package: 'quartz.properties'
INFO  StdSchedulerFactory - Quartz scheduler version: 2.2.3
------- 开始执行调度器 Scheduler ----------------
INFO  QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
------- 等待 30 秒... --------------
MyTrigger监听器:group1.job1,进入方法 triggerFired()
MyTrigger监听器:group1.job1,vetoJobExecution()Job1 - 任务key group1.job1执行时间:2017-11-16 21:52:50
MyTrigger监听器:group1.job1,triggerComplete()
INFO  QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutting down.
INFO  QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED paused.
INFO  QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutdown complete.
------- 关闭调度器 -----------------
~~~~~~~~~~  执行了 1 个 jobs.

示例源码

代码已托管到Github—> https://github.com/yangshangwei/SpringMaster

Quartz-TriggerListener解读相关推荐

  1. 关于Quartz的Job 不能被注入以及SpringAop对Job失效

    关于Quartz的Job 不能被注入以及SpringAop对Job失效 Problem(问题) ​ 最近在工作遇到需要对Quartz的Job进行异常后将异常记录到数据库的操作,第一反应就想到了使用Sp ...

  2. Quartz的Scheduler初始化源码分析

    2019独角兽企业重金招聘Python工程师标准>>> Quartz的使用:http://donald-draper.iteye.com/blog/2321886  Quartz的S ...

  3. (翻译)Quartz官方教程——第七课:TriggerListeners 和 JobListeners

    2019独角兽企业重金招聘Python工程师标准>>> 监听器是用来根据调度器发生的事件做出响应的对象.正如你想的那样,TriggerListeners接收触发器相关的事件,JobL ...

  4. Quartz定时任务学习(九)Quartz监听器

    Quartz 提供了三种类型的监听器:监听 Job 的,监听 Trigger 的,和监听 Scheduler 自已的. 本章解释如何应用每一种类型来更好的管理你的 Quartz 应用,并获悉到什么事件 ...

  5. java quartz 触发_手动触发Quartz作业

    您可以尝试在计划程序中添加触发器过滤器 this.scheduler.addGlobalTriggerListener(new DebugExecutionFilter()); 当执行不是易失性(未安 ...

  6. 项目中使用Quartz集群分享--转载

    原文:http://hot66hot.iteye.com/blog/1726143 在公司分享了Quartz,发布出来,希望大家讨论补充. CRM使用Quartz集群分享  一:CRM对定时任务的依赖 ...

  7. Quartz-JobListener解读

    文章目录 概述 步骤简述 全局/非全局监听器 JobListener 任务监听器 示例 JobListener源码 完整示例 示例源码 概述 在某个所关注事件发生时,监听器提供了一种方便且非侵入性的机 ...

  8. quartz.properties配置文件详解

    我们通常是通过quartz.properties属性配置文件(默认情况下均使用该文件)结合StdSchedulerFactory 来使用Quartz的.StdSchedulerFactory 会加载属 ...

  9. Quartz 2.4.0 源码解析

    执行逻辑图 代码流程图 源代码[注释版本] 核心代码 org.quartz.core.QuartzScheduler org.quartz.core.QuartzSchedulerThread 执行逻 ...

最新文章

  1. LeetCode简单题之两数之和
  2. ii 第七单元 访问网络共享文件系统
  3. python的with用法(参考)
  4. JAVA元注解@interface详解(@Target,@Documented,@Retention,@Inherited)。
  5. 一个关于Angular Directive selector里的中括号使用问题
  6. 图形显卡_选核芯显卡还是独立显卡?这才是决定笔记本电脑性能的关键
  7. 第十一:Pytest进阶之conftest.py
  8. Mybatis 实现关联表查询
  9. WordPress 客户端软件列表
  10. bzoj千题计划141:bzoj3532: [Sdoi2014]Lis
  11. jq取第一个子元素为select_Python爬取博客的所有文章并存为带目录的word文档(实例67)...
  12. 项目验收文档模板(二)
  13. ardupilot 增加新的定点控制实现刹车
  14. Classic Shell 后继者之 Classic Start
  15. ISP算法:gamma矫正
  16. 2021年的Gartner云基础设施和平台服务魔力象限有什么不一样?
  17. 防火墙服务器搭建与应用(1.0)
  18. 什么是BGP协议,以及其工作原理
  19. 邮箱的容量怎么算怎么看?免费邮箱容量多大?能办公用吗?
  20. 拟合数据时报错Number of calls to function has reached maxfev = 1000

热门文章

  1. php后台登录页修改成ajax,使用php后台给自己做一个页面路由,配合ajax实现局部刷新。(示例代码)...
  2. linux mpich配置_Linux下安装MPICH
  3. python字符串无效的原因_python字符串问题
  4. 146. Leetcode 51. N 皇后 (回溯算法-棋盘问题)
  5. 74. Leetcode 501. 二叉搜索树中的众数 (二叉搜索树-中序遍历类)
  6. 寻找搜索二叉树中两个错误的节点
  7. ubantu使用apt安装时出现: xxx is not found 的解决方法
  8. 你的画像是怎么来的?推荐系统是如何找到相似用户的?
  9. 遗传算法与直接搜索工具箱学习笔记 -----从直接搜索算法开始
  10. Python入门100题 | 第053题