Quartz任务调度(6)schedulerListener分版本超详细解析

简介: <div class="markdown_views"><h1 id="schedulerlistener">schedulerListener</h1><p>在我们的监听器实现类中,这个类中需实现的方法很多,不需要的可以给出空实现,下面是一些常用的用法:</p><table><thead><tr><th>方法</th> <th>说明</th></tr></

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文件夹下载

目录
相关文章
|
Web App开发 前端开发
Chrome 浏览器插件 V3 版本 Manifest.json 文件中 Action 的类型(Types)、方法(Methods)和事件(Events)的属性和参数解析
Chrome 浏览器插件 V3 版本 Manifest.json 文件中 Action 的类型(Types)、方法(Methods)和事件(Events)的属性和参数解析
399 0
|
JavaScript 前端开发 索引
JavaScript ES6及后续版本:新增的常用特性与亮点解析
JavaScript ES6及后续版本:新增的常用特性与亮点解析
411 4
|
Java 关系型数据库 MySQL
【编程基础知识】Eclipse连接MySQL 8.0时的JDK版本和驱动问题全解析
本文详细解析了在使用Eclipse连接MySQL 8.0时常见的JDK版本不兼容、驱动类错误和时区设置问题,并提供了清晰的解决方案。通过正确配置JDK版本、选择合适的驱动类和设置时区,确保Java应用能够顺利连接MySQL 8.0。
993 1
|
域名解析 存储 缓存
HTTP请求流程概览:浏览器构建请求行含方法、URL和版本;检查缓存;解析IP与端口
【6月更文挑战第23天】 HTTP请求流程概览:浏览器构建请求行含方法、URL和版本;检查缓存;解析IP与端口;TCP连接(HTTP/1.1可能需排队);三次握手;发送请求头与体;服务器处理并返回响应;TCP连接可能关闭或保持;浏览器接收并显示响应,更新缓存。HTTP版本间有差异。
317 5
|
JavaScript 前端开发 Linux
|
存储 关系型数据库 MySQL
MVCC:深入解析多版本并发控制机制
【4月更文挑战第20天】MVCC是数据库并发控制的关键技术,通过保存数据多个版本,使读写操作无锁并发,减少锁竞争,提高并发性能。它保证事务看到一致数据快照,避免并发问题,并支持事务回滚与恢复。MVCC广泛应用于PostgreSQL、InnoDB等,提供时间旅行查询和无锁读等功能,对于构建高性能、高并发数据库系统至关重要。
528 13
|
搜索推荐 算法 索引
【排序算法】深入解析快速排序(霍尔法&&三指针法&&挖坑法&&优化随机选key&&中位数法&&小区间法&&非递归版本)
【排序算法】深入解析快速排序(霍尔法&&三指针法&&挖坑法&&优化随机选key&&中位数法&&小区间法&&非递归版本)
488 4
|
缓存 Linux 程序员
Linux探秘:多角度解析如何查看库的版本号
Linux探秘:多角度解析如何查看库的版本号
444 5
|
网络协议 Windows
Windows Server 各版本搭建 DNS 服务器实现域名正反向解析
Windows Server 各版本搭建 DNS 服务器实现域名正反向解析
|
算法 程序员 C++
【Qt 焦点】深入解析 焦点枚举 Qt::FocusPolicy 属性及其在不同版本中的应用
【Qt 焦点】深入解析 焦点枚举 Qt::FocusPolicy 属性及其在不同版本中的应用
568 0

热门文章

最新文章

推荐镜像

更多
  • DNS