转载请出自出处: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上的 ,这里就不做笔记了