Quartz的监听器(六)上

简介: Quartz的监听器(六)上

一. 监听器


Quartz的监听器与 Servlet的监听器差不多,就是当我们所关注的事情发生时,能够获取这一事件的通知,方便提醒或者通知使用者,如常见的邮件提醒,短信提醒等。


针对于 Quartz 框架的三大元素, JobDetail, Trigger 和 Scheduler , 分别提供了三个监听器,


关于JobDetail事件 的 JobListener, 关于Trigger 事件的 TriggerListener, 关于 Scheduler事件的 SchedulerListener ,


可以对 作业任务,触发器 和调度器 分别进行监听。


在讲解监听器之前,需要了解两个概念, 全局监听器和局部监听器(非全局监听器)。


全局监听器,能够接收项目中所有已经注册的 Job/Trigger,


如 在MyJob12上注册一个全局的监听器, 那么就可以接收到 MyJob~MyJob12 这十三个已经注册好的 Job/Trigger


局部监听器,只能够监听其Scheduler 上注册的 Job/Trigger,不在其上面注册的,不能够监听。


如在 MyJob12上注册一个局部监听器,那么只能接收MyJob12 这一个 Job/Trigger, 不能接受其他的Job/Trigger.


关于监听器的实例,均使用的是 MyJob 作业任务, 位于 com.yjl.listener 包下。

/*
  监听器所使用的任务
*/
public class MyJob implements Job { 
  public MyJob(){
  System.out.println("实例化MyJob对象");
  }
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
      //要做的事,是打印当前的时间 
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //格式化时间
        String dateString=sdf.format(new Date());
        System.out.println("备份数据库的时间是:"+dateString);
    }
}


二. JobListener


二.一 接口定义

org.quartz.JobListener

package org.quartz;
public interface JobListener {
    String getName();
    void jobToBeExecuted(JobExecutionContext context);
    void jobExecutionVetoed(JobExecutionContext context);
    void jobWasExecuted(JobExecutionContext context,
            JobExecutionException jobException);
}


定义了四个方法。

image.png

二.二 接口监听实例

二.二.一 编写自定义监听器,实现 JobListener 接口

MyJobListener.java

public class MyJobListener implements JobListener {
    @Override
    public String getName() {
        String name = this.getClass().getSimpleName();
        System.out.println("监听器的名称是:" + name);
        return name;
    }
    @Override
    public void jobToBeExecuted(JobExecutionContext jobExecutionContext) {
        JobDetail jobDetail=jobExecutionContext.getJobDetail();
        System.out.println("名称是:"+jobDetail.getKey().getName()
        +"------"+"即将被执行时调用");
    }
    @Override
    public void jobExecutionVetoed(JobExecutionContext jobExecutionContext) {
        JobDetail jobDetail=jobExecutionContext.getJobDetail();
        System.out.println("名称是:"+jobDetail.getKey().getName()
                +"------"+"即将被执行但却被TriggerListener否定时调用");
    }
    @Override
    public void jobWasExecuted(JobExecutionContext jobExecutionContext, JobExecutionException e) {
        JobDetail jobDetail=jobExecutionContext.getJobDetail();
        System.out.println("名称是:"+jobDetail.getKey().getName()
                +"------"+"执行之后调用");
    }
}

二.二.二 编写JobListener监听器Demo

/**
 * Job监听器实现
 *
 */
public class JobListenerSchedularDemo {
    public static void main(String[] args) throws  Exception  {
        //获取Scheduler
        Scheduler scheduler= StdSchedulerFactory.getDefaultScheduler();
        // 创建 JobDetail
        JobDetail jobDetail=JobBuilder.newJob(MyJob.class)
                .withIdentity("job1","group1")
                .build();
        //创建 Trigger
        Trigger trigger= TriggerBuilder.newTrigger()
                .withIdentity("trigger1","group1") //设置标识
                .startNow()
                //有冲突时,以开始时间和结束时间为主,不以次数为主
                .withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ? "))
                .build();
        //关联 job和 trigger
        scheduler.scheduleJob(jobDetail,trigger);
        //注册监听器
        //注册全局监听器
       // scheduler.getListenerManager().addJobListener(new MyJobListener(), 
        // EverythingMatcher.allJobs());
        //注册局部监听器
        scheduler.getListenerManager().addJobListener(new MyJobListener(),
                KeyMatcher.keyEquals(JobKey.jobKey("job1","group1")));
        //启动 scheduler
        scheduler.start();
    }
}


如果注册全局监听器:

scheduler.getListenerManager().addJobListener(new MyJobListener(), 
       EverythingMatcher.allJobs());


如果注册局部监听器:

scheduler.getListenerManager().addJobListener(new MyJobListener(),
                KeyMatcher.keyEquals(JobKey.jobKey("job1","group1")));


用局部的进行演示


二.二.三 控制台打印输出

image.png

在重复执行任务的过程中,每监听到一个事件,都会调用一次 getName() 方法。


每一次重复执行,都会执行 jobToBeExecuted()和 jobWasExecuted() 方法,所以每一次都 打印出两行监听器名称的记录。


二.二.四 监听器的名称自定义

监听器的名称,可以由构造方法传递进去。


image.png


注册局部监听器时,将名称传递进去

image.png


运行,控制台打印输出:

image.png


相关文章
|
1月前
|
Java 容器
SpringBoot3 事件和监听器
SpringBoot3 事件和监听器
|
1月前
|
移动开发 前端开发 Java
Flowable 任务监听器与执行监听器的介绍
Flowable 任务监听器与执行监听器的介绍
163 0
|
9月前
|
XML 数据格式
SPRING-QUARTZ 定时器 给TARGETMETHOD传递参数
SPRING-QUARTZ 定时器 给TARGETMETHOD传递参数
117 0
|
Java 调度
Springboot 使用Quartz定时器执行多个定时任务 配置篇
Springboot 使用Quartz定时器执行多个定时任务 配置篇
665 0
Springboot 使用Quartz定时器执行多个定时任务 配置篇
|
Java 调度 Maven
定时任务组件Quartz
定时任务组件Quartz
定时任务组件Quartz
|
存储 Java 数据库连接
这种方式整合Quartz你见过吗?
`Quartz`是一款优秀的任务调度框架,支持内存、JDBC的形式来存储未执行的任务列表,支持多个任务节点同时执行任务,支持任务漂移到不同的节点执行。
|
数据库
Quartz的监听器(六)中
Quartz的监听器(六)中
167 0
Quartz的监听器(六)中
Quartz 定时任务管理类
Quartz 定时任务管理类
151 0