Quartz任务调度(6)schedulerListener分版本超详细解析
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分版本超详细解析的更多相关文章
- Quartz任务调度(4)JobListener分版本超详细解析
JobListener 我们的jobListener实现类必须实现其以下方法: 方法 说明 getName() getName() 方法返回一个字符串用以说明 JobListener 的名称.对于注册 ...
- Quartz任务调度(5)TriggerListener分版本超详细解析
TriggerListener 在我们的触发器监听器中,也包含了一系列监听方法 方法 说明 getName() 定义并返回监听器的名字 triggerFired() 当与监听器相关联的 Trigger ...
- (转)MySQL优化笔记(八)--锁机制超详细解析(锁分类、事务并发、引擎并发控制)
当一个系统访问量上来的时候,不只是数据库性能瓶颈问题了,数据库数据安全也会浮现,这时候合理使用数据库锁机制就显得异常重要了. 原文:http://www.jianshu.com/p/163c96983 ...
- 8.JVM内存分配机制超详细解析
一.对象的加载过程 之前研究过类的加载过程.具体详情可查看文章:https://www.cnblogs.com/ITPower/p/15356099.html 那么,当一个对象被new的时候,是如何加 ...
- RCNN系列超详细解析
一.基于Region Proposal(候选区域)的深度学习目标检测算法 Region Proposal(候选区域),就是预先找出图中目标可能出现的位置,通过利用图像中的纹理.边缘.颜色等信息,保证在 ...
- 【内核】探究linux内核,超详细解析子系统
Perface 前面已经写过一篇<嵌入式linux内核的五个子系统>,概括性比较强,也比较简略,现在对其进行补充说明. 仅留此笔记,待日后查看及补充! Linux内核的子系统 内核是操作系 ...
- 干货 | 自适应大邻域搜索(Adaptive Large Neighborhood Search)入门到精通超详细解析-概念篇
01 首先来区分几个概念 关于neighborhood serach,这里有好多种衍生和变种出来的胡里花俏的算法.大家在上网搜索的过程中可能看到什么Large Neighborhood Serach, ...
- 【优化算法】Greedy Randomized Adaptive Search算法 超详细解析,附代码实现TSP问题求解
01 概述 Greedy Randomized Adaptive Search,贪婪随机自适应搜索(GRAS),是组合优化问题中的多起点元启发式算法,在算法的每次迭代中,主要由两个阶段组成:构造(co ...
- 【分类问题中模型的性能度量(二)】超强整理,超详细解析,一文彻底搞懂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 ...
随机推荐
- python根据窗口标题找句柄,将窗口前置活动
import time, threading, copy import win32api, win32con import win32gui import win32gui def zhaojb(aa ...
- 【LeetCode】203.移除链表元素
203.移除链表元素 知识点:链表:双指针 题目描述 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 . 示例 ...
- Kettle——shell交互命令
Kettle--shell交互命令 在kettle上开发了job或transform可以以单独的文件存在,也可以存放在资源库中.调用这些程序可以通过shell脚本调用,记录下: 资源库中的job: . ...
- Java数据库分表与多线程查询结果汇总
今天接到一个需求:要对一个物理分表的逻辑表进行查询统计.而数据库用的是公司自己研发的产品,考虑的到公司产品的特点以及业务的需求,该逻辑表是按年月进行分表的,而非分区.我们来看一下,在按时间段进行查询统 ...
- java学习笔记之OOP(二)
java学习笔记二.面向对象[OOP]Object Oriented Programming 一.三大特性: 1.封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式,将变化隔离,便于使用,提高复用 ...
- Python如何将py文件打包成exe
安装pyinstaller 打开cmd窗口,输入pip install pyinstaller,命令行输出successfully表示成功. 生成exe文件 一.单个py文件 在py文件目录下,打开c ...
- 【小工具系列】Python + OpenCV 图片序列转换成视频
图片序列转换成视频 最近一直在找一个工具,能够将一堆图片转化成视频.网上找了一些小软件,还有 win10 的照片自带的视频制作功能,都不是很满意. 又不想下载那些专业的视频剪辑软件大材小用. 然后找到 ...
- 实现html页面转pdf
实现方式比较简单,使用js代码实现的. 需要引入的js: 1.jQuery.js: 2.html2canvas.js(实现方式是先将Html页面转换成image图片然后在转换为pdf,所以转换之后会有 ...
- Jmeter RMI 反序列化命令执行漏洞(CVE-2018-1297)
下载ysoserial,git git clone https://github.com/frohoff/ysoserial.git cd ysoserialmvn clean package -Ds ...
- 大数据学习(14)—— HBase进阶
HBase读写流程 在网上找了一张图,这个画的比较简单,就拿这个图来说吧. 写流程 1.当Client发起一个Put请求时,首先访问Zookeeper获取hbase:meta表. 2.从hbase:m ...