一. 监听器
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); }
定义了四个方法。
二.二 接口监听实例
二.二.一 编写自定义监听器,实现 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")));
用局部的进行演示
二.二.三 控制台打印输出
在重复执行任务的过程中,每监听到一个事件,都会调用一次 getName() 方法。
每一次重复执行,都会执行 jobToBeExecuted()和 jobWasExecuted() 方法,所以每一次都 打印出两行监听器名称的记录。
二.二.四 监听器的名称自定义
监听器的名称,可以由构造方法传递进去。
注册局部监听器时,将名称传递进去
运行,控制台打印输出: