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. webdriver xpath

    aa=wd.find_elements_by_xpath('//a') for a in aa: print(a.text) #显示所有A标签中文本 aa=wd.find_elements_by_xp ...

  2. c语言:getchar() getch()回显

    //getch() 不回显函数,当用户按下某个字符时,函数自动读取,无需按回车 //所在头文件:conio.h 从控制台读取一个字符,但不显示在屏幕上 //int getchar() //头文件:#i ...

  3. C语言:复合语句

    复合语句(compound statement)简称为语句块,它使用大括号把许多语句和声明组合到一起,形成单条语句.语句块与简单的语句不同,语句块不用分号当作结尾.用括号{}括起来组成的一个语句称复合 ...

  4. EasyUI:combotree(树形下拉框)复选框选中父节点(子节点的状态也全部选中)输入框中只显示父节点的文本值

    参考: https://blog.csdn.net/weixin_43236850/article/details/100320564

  5. Linux 安装 Nodejs 的两种方式

    Linux 安装 Nodejs 的两种方式 目录 Linux 安装 Nodejs 的两种方式 一.压缩包安装 Nodejs 二.源码编译安装 Nodejs 一.压缩包安装 Nodejs 下载 Node ...

  6. 在java中为啥要重写toString 方法?

    在java中为啥要重写toString 方法?下面以一个简单的例子来说明. 先定义一个test5类.并写它的get,set方法. package test5; public class Test5 { ...

  7. js中的 true 与 false

    可判断为 false 的情况: 0,-0,NaN,undedined,"",false,null,缺省的值 可判断为 true 的情况: 除false的其他情况均可,包括负数.&q ...

  8. dva的effect那么难用,自己造一个轮子吧

    背景 对于dva这个开发框架,国内从事react的前端工程师多半不会感到陌生,dva完善的开发体系和简单的api,让其被广泛运用到实际工作中.我所在的公司也是长期使用dva作为基础的开发框架,虽然好用 ...

  9. IPV6改造?华为云如此简单

    现在很多企业都在搞这个IPV6改造,说实话这个IPV6改造我这边也不是特别精通,也是通过查阅各种资料来了解IPV6这个东西,下面是我查的一些资料大家可以借鉴一下. IPv6改造三步曲--Vecloud ...

  10. Python基础之读取ini文件

    基本使用方法 第一步:准备一份INI文件.如test1.ini [ITEMS] item1=1 item2=2 item3=3 item4=4 [ITEM1] test1=aaa [ITEM2] te ...