TriggerListeners和JobListeners

发表时间:2018-01-12 14:50:59 浏览量( 14 ) 留言数( 0 )

学习目标:

1、了解TriggerLinstener的

2、了解JobListeners的基本概念


学习过程:

    你可以通过监听器,在一个Job或者Trigger执行的时候进行一些操作。这个时候就可以使用JobListeners或者TriggerLinstener,顾名思义,JobListeners就是针对Job执行的,而TriggerLinstener就是针对Trigger的。你可以实现对应的接口就可以了。

我们可以看一下这两个接口:


The org.quartz.TriggerListener Interface

public interface TriggerListener {


    public String getName();


    public void triggerFired(Trigger trigger, JobExecutionContext context);


    public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context);


    public void triggerMisfired(Trigger trigger);


    public void triggerComplete(Trigger trigger, JobExecutionContext context,

            int triggerInstructionCode);

}


The org.quartz.JobListener Interface

public interface JobListener {


    public String getName();


    public void jobToBeExecuted(JobExecutionContext context);


    public void jobExecutionVetoed(JobExecutionContext context);


    public void jobWasExecuted(JobExecutionContext context,

            JobExecutionException jobException);


}

   如果你不想实现接口的所有方法,你也可以继承JobListenerSupport or TriggerListenerSupport ,实现自己想实现的方法。

   我们可以通过scheduler.getListenerManager()添加对应的监听类的。就好像下面的代码:

    scheduler.getListenerManager().addJobListener(myJobListener, jobKeyEquals(jobKey("myJobName", "myJobGroup")));

   我们也可以专门为一个组的添加同一个监听。 

scheduler.getListenerManager().addJobListener(myJobListener, jobGroupEquals("myJobGroup"));

    又或者可以给两个组添加

   scheduler.getListenerManager().addJobListener(myJobListener, or(jobGroupEquals("myJobGroup"), jobGroupEquals("yourGroup")));

    也可以给所有的jobs添加

scheduler.getListenerManager().addJobListener(myJobListener, allJobs());

  TriggerListeners的工作方式时一样的。


SchedulerListeners 和 TriggerListeners and JobListeners非常相似, 不过他监听的时添加job/trigger或者删除 job/trigger的事件,或者scheduler的错误,关闭等等。

添加 SchedulerListener:

scheduler.getListenerManager().addSchedulerListener(mySchedListener);

删除 SchedulerListener:

scheduler.getListenerManager().removeSchedulerListener(mySchedListener);


二、示例代码

定义监听器

public class JobLin implements JobListener{

	public String getName() {
		
		return "JobLin";
	}

	public void jobToBeExecuted(JobExecutionContext context) {
		System.out.println("jobToBeExecuted:"+context.getJobDetail().getKey());
		
	}

	public void jobExecutionVetoed(JobExecutionContext context) {
		System.out.println("jobExecutionVetoed:"+context.getJobDetail().getKey());
		
	}

	public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException) {
		System.out.println("jobWasExecuted:"+context.getJobDetail().getKey());
		
	}

}

定义Trigger的监听器,这里定义两个

public class TriggerLins implements TriggerListener {

	public String getName() {
		// TODO Auto-generated method stub
		return "TriggerLins";
	}

	public void triggerFired(Trigger trigger, JobExecutionContext context) {
		System.out.println("triggerFired:"+context.getJobDetail().getKey()+","+trigger.getKey());
		
	}

	public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) {
		// TODO Auto-generated method stub
		return false;
	}

	public void triggerMisfired(Trigger trigger) {
		System.out.println("triggerMisfired:"+trigger.getKey());
		
	}

	public void triggerComplete(Trigger trigger, JobExecutionContext context,
			CompletedExecutionInstruction triggerInstructionCode) {
		System.out.println("triggerComplete:"+context.getJobDetail().getKey()+","+trigger.getKey());
		
	}

}

运行类:注意两个Trigger绑定一个job需要storeDurably

public class QuartzTest {

	public static void main(String[] args) {

		try {
			SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();

			Scheduler sched = schedFact.getScheduler();

			sched.start();

			// define the job and tie it to our HelloJob class
			JobDetail majob = newJob(HelloJob.class).withIdentity("majob", "Jobgroup1").storeDurably().build();

			//
			Trigger trigger1 = newTrigger().withIdentity("trigger1", "group1")
					.withSchedule(cronSchedule("0/5 * 8-17 * * ?")).forJob(majob).build();

			Trigger trigger2 = newTrigger().withIdentity("trigger2", "group2")
					.withSchedule(cronSchedule("0/10 * 8-17 * * ?")).forJob(majob).build();

			// Tell quartz to schedule the job using our trigger
			sched.addJob(majob, true);
			
			
			sched.getListenerManager().addJobListener(new JobLin(),  KeyMatcher.keyEquals(new JobKey("majob", "Jobgroup1")));
			sched.getListenerManager().addTriggerListener(new TriggerLins(),  KeyMatcher.keyEquals(new TriggerKey("trigger1", "group1")));
			sched.getListenerManager().addTriggerListener(new TriggerLins2(),  KeyMatcher.keyEquals(new TriggerKey("trigger2", "group2")));

			
			sched.scheduleJob( trigger1);
			sched.scheduleJob( trigger2);

		} catch (SchedulerException se) {
			se.printStackTrace();
		}
	}
}

自己可以查看一下输出的。