转载请出自出处:http://eksliang.iteye.com/blog/2208624
一.概述
listener是一个监听器对象,用于监听scheduler中发生的事件,然后执行相应的操作;你可能已经猜到了,TriggerListeners接受与trigger相关的事件,JobListeners接受与jobs相关的事件。
二.JobListener监听器
job相关的事件包括:job即将执行时触发以及job执行完毕时触发。
具体实例如下所示:
定义job类,用来打印任务详情,代码如下:
package com.ickes.job; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; /** * 实现Job接口,定义运行的任务 * @author Ickes */ public class SimpleJob implements Job { public void execute(JobExecutionContext context) throws JobExecutionException { //打印任务详情 System.out.println( context.getJobDetail().getGroup() +"——"+context.getJobDetail().getName() +"——"+context.getTrigger().getName() +"——"+context.getTrigger().getGroup()); } }
JobListener监听器类,代码如下:
package com.ickes.job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.JobListener; /** * JobListener监听器 * @author Ickes */ public class Job1Listener implements JobListener { /** * 返回当前监听器的名字,这个方法必须被写他的返回值; * 因为listener需要通过其getName()方法广播它的名称 */ public String getName() { return "Job1Listener"; } /** * 任务被触发前触发 */ public void jobToBeExecuted(JobExecutionContext context) { System.out.println(context.getJobDetail().getName()+":A"); } /** * 这个不管 */ public void jobExecutionVetoed(JobExecutionContext context) { System.out.println(context.getJobDetail().getName()+":B"); } /** * 任务调度完成后触发 */ public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException) { System.out.println(context.getJobDetail().getName()+":C"); } }
JobListener监听器测试类,代码如下:
package com.ickes.job; import java.util.Date; import org.quartz.JobDetail; import org.quartz.JobListener; import org.quartz.Scheduler; import org.quartz.SchedulerFactory; import org.quartz.SimpleTrigger; import org.quartz.impl.StdSchedulerFactory; /** * @author Ickes */ public class ListenerDemo { public static void main(String[] args) throws Exception { //第一步:创建一个JobDetail实例 JobDetail jobDetail = new JobDetail("j_job1","j_group1", SimpleJob.class); //第二步:通过SimpleTrigger触发器定义调度规则:马上启动,每2秒运行一次,共运行100次 SimpleTrigger simpleTrigger = new SimpleTrigger("t_job1","t_group1"); simpleTrigger.setStartTime(new Date()); simpleTrigger.setEndTime(new Date(System.currentTimeMillis()+1000*5)); simpleTrigger.setRepeatInterval(2000); //运行间隔单位为毫秒 simpleTrigger.setRepeatCount(10); //运行次数 //第三步:通过SchedulerFactory获取一个调度器实例 SchedulerFactory schedulerFactory = new StdSchedulerFactory(); Scheduler scheduler = schedulerFactory.getScheduler(); //第四步:关联监听器 JobListener listener = new Job1Listener(); scheduler.addJobListener(listener); jobDetail.addJobListener(listener.getName()); //第五步:将job跟trigger注册到scheduler中进行调度 scheduler.scheduleJob(jobDetail, simpleTrigger); //第六步:调度启动 scheduler.start(); } }
三.TriggerListener监听器
trigger相关的事件包括:trigger的触发、trigger错过触发(misfire)以及trigger的完成(即trigger触发的job执行完成)。
具体实例如下所示:
Trigger1Listener监听器类,该类实现了TriggerListener接口,代码如下:
package com.ickes.job; import org.quartz.JobExecutionContext; import org.quartz.Trigger; import org.quartz.TriggerListener; /** * * @author Ickes * */ public class Trigger1Listener implements TriggerListener { public String getName() { return "Trigger1Listener"; } /** * 被调度时触发,和它相关的org.quartz.jobdetail即将执行。 * 该方法优先vetoJobExecution()执行 */ public void triggerFired(Trigger trigger, JobExecutionContext context) { System.out.println("A"); } /** * 被调度时触发,和它相关的org.quartz.jobdetail即将执行。 */ public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) { System.out.println("B"); return false; } /** * 被调度时,触发失败时触发 */ public void triggerMisfired(Trigger trigger) { System.out.println("C"); } /** * 执行完毕时触发 */ public void triggerComplete(Trigger trigger, JobExecutionContext context, int triggerInstructionCode) { System.out.println("D"); } }
TriggerListener监听器测试类TriggerListenerDemo代码如下:
package com.ickes.job; import java.util.Date; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerFactory; import org.quartz.SimpleTrigger; import org.quartz.TriggerListener; import org.quartz.impl.StdSchedulerFactory; /** * @author Ickes */ public class TriggerListenerDemo { public static void main(String[] args) throws Exception { //第一步:创建一个JobDetail实例 JobDetail jobDetail = new JobDetail("j_job1","j_group1", SimpleJob.class); //第二步:通过SimpleTrigger触发器定义调度规则:马上启动,每2秒运行一次,共运行100次 SimpleTrigger simpleTrigger = new SimpleTrigger("t_job1","t_group1"); simpleTrigger.setStartTime(new Date()); //5秒钟还有任务没有完成,所以 simpleTrigger.setEndTime(new Date(System.currentTimeMillis()+1000*5)); simpleTrigger.setRepeatInterval(2000); //运行间隔单位为毫秒 simpleTrigger.setRepeatCount(10); //运行次数 //第三步:通过SchedulerFactory获取一个调度器实例 SchedulerFactory schedulerFactory = new StdSchedulerFactory(); Scheduler scheduler = schedulerFactory.getScheduler(); //第四步:关联监听器 TriggerListener listener = new Trigger1Listener(); scheduler.addTriggerListener(listener); simpleTrigger.addTriggerListener(listener.getName()); //第五步:将job跟trigger注册到scheduler中进行调度 scheduler.scheduleJob(jobDetail, simpleTrigger); //第六步:调度启动 scheduler.start(); } }
三.SchedulerListener监听器
SchedulerListener与TriggerListener、JobListener类似,但它仅接收来自Scheduler自身的消息,而不一定是某个具体的trigger或job的消息。
scheduler相关的消息包括:job/trigger的增加、job/trigger的删除、scheduler内部发生的严重错误以及scheduler关闭的消息等;
SchedulerListener接口如下:
public interface SchedulerListener { public void jobScheduled(Trigger trigger); public void jobUnscheduled(String triggerName, String triggerGroup); public void triggerFinalized(Trigger trigger); public void triggersPaused(String triggerName, String triggerGroup); public void triggersResumed(String triggerName, String triggerGroup); public void jobsPaused(String jobName, String jobGroup); public void jobsResumed(String jobName, String jobGroup); public void schedulerError(String msg, SchedulerException cause); public void schedulerStarted(); public void schedulerInStandbyMode(); public void schedulerShutdown(); public void schedulingDataCleared(); }
SchedulerListener也是注册到scheduler的ListenerManager上的 ,这里就不做笔记了