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.+版本内容基本一致

源码下载

关于本节测试源码内容可到https://github.com/jeanhao/spring下quartzEvent文件夹下载

时间: 2024-11-08 17:28:03

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

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

在<spring学习笔记(15)趣谈spring 事件:实现业务逻辑解耦,异步调用提升用户体验>我们通过实例分析讲解了spring的事件机制,或许你会觉得其中的配置略显繁琐,而在Quartz框架中,它为我们集成了强大的事件机制,轻松地帮助我们在任务调度中完成各类辅佐操作,高内聚而耦合. 相对spring的事件实现,quartz这边简化了许多,我们只需: 1. 自定义监听器接口实现类 2. 向scheduler中注册监听器实现类 只需以上两步即可我完成我们的事件监听.对于监听器实现类中,可能有些

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

TriggerListener 在我们的触发器监听器中,也包含了一系列监听方法 方法 说明 getName() 定义并返回监听器的名字 triggerFired() 当与监听器相关联的 Trigger 被触发,Job 上的 execute() 方法将要被执行时,Scheduler 就调用这个方法.在全局 TriggerListener 情况下,这个方法为所有 Trigger 被调用. vetoJobExecution() 在 Trigger 触发后,Job 将要被执行时由 Scheduler 调

Quartz任务调度(1)概念例析快速入门

Quartz框架需求引入 在现实开发中,我们常常会遇到需要系统在特定时刻完成特定任务的需求,在<spring学习笔记(14)引介增强详解:定时器实例:无侵入式动态增强类功能>,我们通过引介增强来简单地模拟实现了一个定时器.它可能只需要我们自己维护一条线程就足以实现定时监控.但在实际开发中,我们遇到的需求会复杂很多,可能涉及多点任务调度,需要我们多线程并发协作.线程池的维护.对运行时间规则进行更细粒度的规划.运行线程现场的保持与恢复等等.如果我们选择自己来造轮子,可能会遇到许多难题.这时候,引入

Java中关于内存泄漏出现的原因汇总及如何避免内存泄漏(超详细版)_java

Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题.内存泄漏大家都不陌生了,简单粗俗的讲,就是该被释放的对象没有释放,一直被某个或某些实例所持有却不再被使用导致 GC 不能回收.最近自己阅读了大量相关的文档资料,打算做个 总结 沉淀下来跟大家一起分享和学习,也给自己一个警示,以后 coding 时怎么避免这些情况,提高应用的体验和质量. 我会从 java 内存泄漏的基础知识开始,并通过具体例子来说明 Android 引起内存泄漏的各种原因,以

CentOS6.4 下安装SVN的详细教程(超详细)_Linux

1.检查系统是否已经安装如果安装就卸载 rpm -qa subversion yum remove subversion 2.安装 yum install subversion 3.建立SVN库 mkdir -p /home/svn/repos svnadmin create /home/svn/repos 执行上面的命令后,自动建立repositories库,查看/home/svn/repos 文件夹发现包含了conf, db,format,hooks, locks, README.txt等文

c++-初学C++ 求超详细的视频教程

问题描述 初学C++ 求超详细的视频教程 本人最近想学C++的编程写3D游戏 却不知道要怎么写 所以要求各位大神告诉我最好看些什么书可以是速成的.或者是超详细视频教程 谢谢 P.S. 如果在Mac上我最好用什么样的编程软件呢? 解决方案 推荐学习路线: 第一:<数据结构与操作系统>必看 第二:<C语言程序设计>必看 第三:<C++程序设计>书可以随便选了,跟着做几个例程 第四:<C++游戏设计指南>书随便选,都差不多.再跟着网上视频教程学就成了. 解决方案二

超详细的双曲线精细磨皮教程

超详细的双曲线精细磨皮教程 教程的磨皮方法操作起来可能有点复制,不过处理后的图片细节分布均匀,效果也非常精细.大致过程:首先需要选择精度好一点的素材图片,再磨皮之前需要创建两个曲线调整图层,分别把图片调亮和变暗,然后把曲线蒙版都填充黑色.为了便于观察还可以添加两个观察图层,都填充黑色,适当更改图层混合模式.处理的时候只需要用白色画笔变亮的曲线蒙版上把较暗的部分涂亮,在变暗的曲线蒙版上把较亮的部分涂暗即可. 原图 最终效果  1.大原图素材,建立"观察器". 2.创建纯色填充图层,选择黑

优化-新手求助一个超详细讲解的遗传算法的MATLAB程序

问题描述 新手求助一个超详细讲解的遗传算法的MATLAB程序 主要是要对函数优化,函数是三个范数只和求最小值.用遗传算法来优化.

超详细从零记录Hadoop2.7.3完全分布式集群部署过程

超详细从零记录Ubuntu16.04.1 3台服务器上Hadoop2.7.3完全分布式集群部署过程.包含,Ubuntu服务器创建.远程工具连接配置.Ubuntu服务器配置.Hadoop文件配置.Hadoop格式化.启动.(首更时间2016年10月27日) 主机名/hostname IP 角色 hadoop1 192.168.193.131 ResourceManager/NameNode/SecondaryNameNode hadoop2 192.168.193.132 NodeManager/