`
eksliang
  • 浏览: 592362 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Quartz——TriggerListener和JobListener

阅读更多

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

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics