schedulerListener

在我们的监听器实现类中,这个类中需实现的方法很多,不需要的可以给出空实现,下面是一些常用的用法:

方法 说明
jobScheduled() Scheduler 在有新的 JobDetail 部署时调用此方法。
jobUnscheduled() Scheduler 在有新的 JobDetail卸载时调用此方法
triggerFinalized() 当一个 Trigger 来到了再也不会触发的状态时调用这个方法。除非这个 Job 已设置成了持久性,否则它就会从 Scheduler 中移除。
triggersPaused() Scheduler 调用这个方法是发生在一个 Trigger 或 Trigger 组被暂停时。假如是 Trigger 组的话,triggerName 参数将为 null。
triggersResumed() Scheduler 调用这个方法是发生成一个 Trigger 或 Trigger 组从暂停中恢复时。假如是 Trigger 组的话,triggerName 参数将为 null。
jobsPaused() 当一个或一组 JobDetail 暂停时调用这个方法。
jobsResumed() 当一个或一组 Job 从暂停上恢复时调用这个方法。假如是一个 Job 组,jobName 参数将为 null。
schedulerError() Scheduler 的正常运行期间产生一个严重错误时调用这个方法。错误的类型会各式的,但是下面列举了一些错误例子:初始化 Job 类的问题,试图去找到下一 Trigger 的问题,JobStore 中重复的问题,数据存储连接的问题。我们可以使用 SchedulerException 的 getErrorCode() 或者 getUnderlyingException() 方法或获取到特定错误的更详尽的信息。
schedulerShutdown() Scheduler 调用这个方法用来通知 SchedulerListener Scheduler 将要被关闭。

1.x版本配置

下面是一个1.+版本实例配置:

package tool.job;

import org.quartz.JobDetail;
import org.quartz.SchedulerException;
import org.quartz.SchedulerListener;
import org.quartz.Trigger; public class MySchedulerListener implements SchedulerListener { @Override
public void jobScheduled(Trigger trigger) {
System.out.println("任务被部署时被执行");
} @Override
public void triggerFinalized(Trigger trigger) {
System.out.println("任务完成了它的使命,光荣退休时被执行");
} @Override
public void jobAdded(JobDetail jobDetail) {
System.out.println("一个新的任务被动态添加时执行");
} @Override
public void jobUnscheduled(String triggerName, String triggerGroup) {
System.out.println("任务被卸载时被执行"); } @Override
public void triggersPaused(String triggerName, String triggerGroup) {
System.out.println(triggerGroup + "所在组的全部触发器被停止时被执行");
} @Override
public void triggersResumed(String triggerName, String triggerGroup) {
System.out.println(triggerGroup + "所在组的全部触发器被回复时被执行");
} @Override
public void jobDeleted(String jobName, String groupName) {
System.out.println(groupName + "." + jobName + "被删除时被执行");
} @Override
public void jobsPaused(String jobName, String jobGroup) {
System.out.println(jobGroup + "(一组任务)被暂停时被执行");
} @Override
public void jobsResumed(String jobName, String jobGroup) {
System.out.println(jobGroup + "(一组任务)被回复时被执行");
}
@Override
public void schedulerError(String msg, SchedulerException cause) {
System.out.println("出现异常" + msg + "时被执行");
cause.printStackTrace();
} @Override
public void schedulerInStandbyMode() {
System.out.println("scheduler被设为standBy等候模式时被执行"); } @Override
public void schedulerStarted() {
System.out.println("scheduler启动时被执行"); } @Override
public void schedulerShutdown() {
System.out.println("scheduler关闭时被执行");
} @Override
public void schedulerShuttingdown() {
System.out.println("scheduler正在关闭时被执行");
}
}

下面是我们的测试方法,关于方法中没提到的类的配置可参考我前面系列的文章。

public static void main(String args[]) throws SchedulerException {
JobDetail pickNewsJob =new JobDetail("job1", "jgroup1", PickNewsJob.class);
JobDetail getHottestJob =new JobDetail("job2", "jgroup2", GetHottestJob.class);
SimpleTrigger pickNewsTrigger = new SimpleTrigger("trigger1", "group1",1,2000);
SimpleTrigger getHottestTrigger = new SimpleTrigger("trigger2", "group2",1,3000); SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
JobListener myJobListener = new MyJobListener();
/**********局部Job监听器配置**********/
pickNewsJob.addJobListener("myJobListener");//这里的名字和myJobListener中getName()方法的名字一样
scheduler.addJobListener(myJobListener);//向scheduler注册我们的监听器
/*********全局Job监听器配置************/
// scheduler.addGlobalJobListener(myJobListener);//直接添加为全局监听器 TriggerListener myTriggerListener = new MyTriggerListener();
/**********局部Trigger监听器配置**********/
pickNewsTrigger.addTriggerListener("myTriggerListener");
scheduler.addTriggerListener(myTriggerListener);
/*********全局Trigger监听器配置************/
// scheduler.addGlobalTriggerListener(myTriggerListener);//直接添加为全局监听器
/************SchedulerListener配置*************/
SchedulerListener mySchedulerListener = new MySchedulerListener();
scheduler.addSchedulerListener(mySchedulerListener); scheduler.scheduleJob(pickNewsJob,pickNewsTrigger);
scheduler.scheduleJob(getHottestJob,getHottestTrigger); scheduler.start(); }

运行方法,我们会看到:

一个新的任务被动态添加时执行————SchedulerListener中的方法被调用
任务被部署时被执行————SchedulerListener中的方法被调用
一个新的任务被动态添加时执行————SchedulerListener中的方法被调用
任务被部署时被执行————SchedulerListener中的方法被调用
scheduler启动时被执行————SchedulerListener中的方法被调用
Trigger 被触发了,此时Job 上的 execute() 方法将要被执行
不否决Job,正常执行
myJobListener触发对class tool.job.PickNewsJob的开始执行的监听工作,这里可以完成任务前的一些资源准备工作或日志记录
在13:53:18扒取新闻
在13:53:18根据文章的阅读量和评论量来生成我们的最热文章列表
myJobListener触发对class tool.job.PickNewsJob结束执行的监听工作,这里可以进行资源销毁工作或做一些新闻扒取结果的统计工作
Trigger 被触发并且完成了 Job 的执行,此方法被调用
Trigger 被触发了,此时Job 上的 execute() 方法将要被执行
不否决Job,正常执行
myJobListener触发对class tool.job.PickNewsJob的开始执行的监听工作,这里可以完成任务前的一些资源准备工作或日志记录
在13:53:20扒取新闻
myJobListener触发对class tool.job.PickNewsJob结束执行的监听工作,这里可以进行资源销毁工作或做一些新闻扒取结果的统计工作
Trigger 被触发并且完成了 Job 的执行,此方法被调用
任务完成了它的使命,光荣退休时被执行————SchedulerListener中的方法被调用
在13:53:21根据文章的阅读量和评论量来生成我们的最热文章列表
任务完成了它的使命,光荣退休时被执行————SchedulerListener中的方法被调用

2.x 版本配置

2.+版本与1.+版本的主要区别是新添加了一些方法,并将jobName,groupName参数对换成了JobKey等。
下面是配置实例:

package tool.job;

import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.SchedulerException;
import org.quartz.SchedulerListener;
import org.quartz.Trigger;
import org.quartz.TriggerKey; public class MySchedulerListener implements SchedulerListener { @Override
public void jobScheduled(Trigger trigger) {
System.out.println("任务被部署时被执行");
} @Override
public void jobUnscheduled(TriggerKey triggerKey) {
System.out.println("任务被卸载时被执行");
} @Override
public void triggerFinalized(Trigger trigger) {
System.out.println("任务完成了它的使命,光荣退休时被执行");
} @Override
public void triggerPaused(TriggerKey triggerKey) {
System.out.println(triggerKey + "(一个触发器)被暂停时被执行");
} @Override
public void triggersPaused(String triggerGroup) {
System.out.println(triggerGroup + "所在组的全部触发器被停止时被执行");
} @Override
public void triggerResumed(TriggerKey triggerKey) {
System.out.println(triggerKey + "(一个触发器)被恢复时被执行");
} @Override
public void triggersResumed(String triggerGroup) {
System.out.println(triggerGroup + "所在组的全部触发器被回复时被执行");
} @Override
public void jobAdded(JobDetail jobDetail) {
System.out.println("一个JobDetail被动态添加进来");
} @Override
public void jobDeleted(JobKey jobKey) {
System.out.println(jobKey + "被删除时被执行");
} @Override
public void jobPaused(JobKey jobKey) {
System.out.println(jobKey + "被暂停时被执行"); } @Override
public void jobsPaused(String jobGroup) {
System.out.println(jobGroup + "(一组任务)被暂停时被执行");
} @Override
public void jobResumed(JobKey jobKey) {
System.out.println(jobKey + "被恢复时被执行");
} @Override
public void jobsResumed(String jobGroup) {
System.out.println(jobGroup + "(一组任务)被回复时被执行");
} @Override
public void schedulerError(String msg, SchedulerException cause) {
System.out.println("出现异常" + msg + "时被执行");
cause.printStackTrace();
} @Override
public void schedulerInStandbyMode() {
System.out.println("scheduler被设为standBy等候模式时被执行"); } @Override
public void schedulerStarted() {
System.out.println("scheduler启动时被执行"); } @Override
public void schedulerStarting() {
System.out.println("scheduler正在启动时被执行"); } @Override
public void schedulerShutdown() {
System.out.println("scheduler关闭时被执行");
} @Override
public void schedulerShuttingdown() {
System.out.println("scheduler正在关闭时被执行"); } @Override
public void schedulingDataCleared() {
System.out.println("scheduler中所有数据包括jobs, triggers和calendars都被清空时被执行");
} }

在2.+版本中,我们通过以下方式注册我们的监听器:

SchedulerListener mySchedulerListener = new MySchedulerListener();
scheduler.getListenerManager().addSchedulerListener(mySchedulerListener);

其它测试代码可参考我前面系列文章的,测试结果和之前1.+版本内容基本一致

Quartz任务调度(6)schedulerListener分版本超详细解析的更多相关文章

  1. Quartz任务调度(4)JobListener分版本超详细解析

    JobListener 我们的jobListener实现类必须实现其以下方法: 方法 说明 getName() getName() 方法返回一个字符串用以说明 JobListener 的名称.对于注册 ...

  2. Quartz任务调度(5)TriggerListener分版本超详细解析

    TriggerListener 在我们的触发器监听器中,也包含了一系列监听方法 方法 说明 getName() 定义并返回监听器的名字 triggerFired() 当与监听器相关联的 Trigger ...

  3. (转)MySQL优化笔记(八)--锁机制超详细解析(锁分类、事务并发、引擎并发控制)

    当一个系统访问量上来的时候,不只是数据库性能瓶颈问题了,数据库数据安全也会浮现,这时候合理使用数据库锁机制就显得异常重要了. 原文:http://www.jianshu.com/p/163c96983 ...

  4. 8.JVM内存分配机制超详细解析

    一.对象的加载过程 之前研究过类的加载过程.具体详情可查看文章:https://www.cnblogs.com/ITPower/p/15356099.html 那么,当一个对象被new的时候,是如何加 ...

  5. RCNN系列超详细解析

    一.基于Region Proposal(候选区域)的深度学习目标检测算法 Region Proposal(候选区域),就是预先找出图中目标可能出现的位置,通过利用图像中的纹理.边缘.颜色等信息,保证在 ...

  6. 【内核】探究linux内核,超详细解析子系统

    Perface 前面已经写过一篇<嵌入式linux内核的五个子系统>,概括性比较强,也比较简略,现在对其进行补充说明. 仅留此笔记,待日后查看及补充! Linux内核的子系统 内核是操作系 ...

  7. 干货 | 自适应大邻域搜索(Adaptive Large Neighborhood Search)入门到精通超详细解析-概念篇

    01 首先来区分几个概念 关于neighborhood serach,这里有好多种衍生和变种出来的胡里花俏的算法.大家在上网搜索的过程中可能看到什么Large Neighborhood Serach, ...

  8. 【优化算法】Greedy Randomized Adaptive Search算法 超详细解析,附代码实现TSP问题求解

    01 概述 Greedy Randomized Adaptive Search,贪婪随机自适应搜索(GRAS),是组合优化问题中的多起点元启发式算法,在算法的每次迭代中,主要由两个阶段组成:构造(co ...

  9. 【分类问题中模型的性能度量(二)】超强整理,超详细解析,一文彻底搞懂ROC、AUC

    文章目录 1.背景 2.ROC曲线 2.1 ROC名称溯源(选看) 2.2 ROC曲线的绘制 3.AUC(Area Under ROC Curve) 3.1 AUC来历 3.2 AUC几何意义 3.3 ...

随机推荐

  1. python根据窗口标题找句柄,将窗口前置活动

    import time, threading, copy import win32api, win32con import win32gui import win32gui def zhaojb(aa ...

  2. 【LeetCode】203.移除链表元素

    203.移除链表元素 知识点:链表:双指针 题目描述 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 . 示例 ...

  3. Kettle——shell交互命令

    Kettle--shell交互命令 在kettle上开发了job或transform可以以单独的文件存在,也可以存放在资源库中.调用这些程序可以通过shell脚本调用,记录下: 资源库中的job: . ...

  4. Java数据库分表与多线程查询结果汇总

    今天接到一个需求:要对一个物理分表的逻辑表进行查询统计.而数据库用的是公司自己研发的产品,考虑的到公司产品的特点以及业务的需求,该逻辑表是按年月进行分表的,而非分区.我们来看一下,在按时间段进行查询统 ...

  5. java学习笔记之OOP(二)

    java学习笔记二.面向对象[OOP]Object Oriented Programming 一.三大特性: 1.封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式,将变化隔离,便于使用,提高复用 ...

  6. Python如何将py文件打包成exe

    安装pyinstaller 打开cmd窗口,输入pip install pyinstaller,命令行输出successfully表示成功. 生成exe文件 一.单个py文件 在py文件目录下,打开c ...

  7. 【小工具系列】Python + OpenCV 图片序列转换成视频

    图片序列转换成视频 最近一直在找一个工具,能够将一堆图片转化成视频.网上找了一些小软件,还有 win10 的照片自带的视频制作功能,都不是很满意. 又不想下载那些专业的视频剪辑软件大材小用. 然后找到 ...

  8. 实现html页面转pdf

    实现方式比较简单,使用js代码实现的. 需要引入的js: 1.jQuery.js: 2.html2canvas.js(实现方式是先将Html页面转换成image图片然后在转换为pdf,所以转换之后会有 ...

  9. Jmeter RMI 反序列化命令执行漏洞(CVE-2018-1297)

    下载ysoserial,git git clone https://github.com/frohoff/ysoserial.git cd ysoserialmvn clean package -Ds ...

  10. 大数据学习(14)—— HBase进阶

    HBase读写流程 在网上找了一张图,这个画的比较简单,就拿这个图来说吧. 写流程 1.当Client发起一个Put请求时,首先访问Zookeeper获取hbase:meta表. 2.从hbase:m ...