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. Python3.7 lxml引入etree

    用xml代替lxml,Python3.7中已经没有etree这个模块了 import xml.etree.ElementTree as etree from lxml import etree 这种方 ...

  2. 小猿圈-IT自学人的小圈子 【强力推荐学习】

    笔记链接 https://book.apeland.cn/details/322/ 学习视频 https://www.apeland.cn/python

  3. 【动画消消乐】HTML+CSS 自定义加载动画 065

    前言 Hello!小伙伴! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出-   自我介绍 ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计 ...

  4. 微信小程序云开发-列表下拉刷新

    一.json文件开启页面刷新 开启页面刷新.在页面的json文件里配置两处: "enablePullDownRefresh": true, //true代表开启页面下拉刷新 &qu ...

  5. 在docker for windows建立mssql容器后,ssms连接mssql出现错误号码18456的问题

    在docker for windows建立mssql容器后,ssms连接mssql出现错误号码18456的问题 笔者提供一个可能会没考虑到的点. 请检查本机是否安装了mssql!!! 请检查本机的ms ...

  6. mysql实现主从复制、读写分离的配置方法(一)

    1. 测试环境 两个CentOS7虚拟机 mysql 5.5-MariaDB master_ip:192.168.1.109 slave_ip:192.168.1.118 2. 配置主服务器 2.1  ...

  7. java 日期字符串互相转换

    一.把日期转换成字符串 //获取当前时间  Date date = new Date();   //打印date数据类型  System.out.println(date.getClass().get ...

  8. 第二十七篇 -- 如何给静态文本设置成ico图标形式以及如何修改文本框中的内容

    修改静态文本框内容: CWnd* pWnd = GetDlgItem(IDC_STATIC1); pWnd->SetWindowText(_T("Server is on!" ...

  9. video标签的视频全屏

    按钮: <div class="fullScreen" @click="fullScreen"><i class="el-icon- ...

  10. xampp搭建开源项目iwebshop后,服务器重启后再启动xampp显示组件都启动ok,但是实际启动失败解决办法

    最近用xampp搭建了开源商城项目iwebshop,刚搭建完没问题,可是周一来因为服务器重启了,我再启动xampp,显示组件都启动ok了,但是用linux命令查看相关组件的进程时,发现实际没启动起来, ...