三. TriggerListener
三.一 接口定义
org.quartz.TriggerListener
package org.quartz; import org.quartz.Trigger.CompletedExecutionInstruction; public interface TriggerListener { String getName(); void triggerFired(Trigger trigger, JobExecutionContext context); boolean vetoJobExecution(Trigger trigger, JobExecutionContext context); void triggerMisfired(Trigger trigger); void triggerComplete(Trigger trigger, JobExecutionContext context, CompletedExecutionInstruction triggerInstructionCode); }
定义了五个方法
三.二 接口监听实例
三.二.一 编写自定义监听器,实现 TriggerListener 接口
MyTriggerListener.java
public class MyTriggerListener implements TriggerListener { @Override public String getName() { String name=this.getClass().getSimpleName(); System.out.println("Trigger 监听器的名称是:"+name); return name; } @Override public void triggerFired(Trigger trigger, JobExecutionContext jobExecutionContext) { //trigger.getKey().getName(); System.out.println("被执行前触发"); } @Override public boolean vetoJobExecution(Trigger trigger, JobExecutionContext jobExecutionContext) { System.out.println("未被执行时触发"); //如果为true, 就不往下执行了。 如果为false, 继续往下执行, 来决定 triggerComplete 是否运行 return false; } @Override public void triggerMisfired(Trigger trigger) { System.out.println("错过执行时触发"); } @Override public void triggerComplete(Trigger trigger, JobExecutionContext jobExecutionContext, Trigger.CompletedExecutionInstruction completedExecutionInstruction) { System.out.println("完成时触发"); } }
三.二.二 编写 TriggerLisenter 监听器 Demo
public class TriggerListenerSchedularDemo { 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); //注册监听器 //注册 Trigger 全局触发器 //scheduler.getListenerManager().addTriggerListener(new MyTriggerListener(), // EverythingMatcher.allTriggers()); //注册局部 scheduler.getListenerManager().addTriggerListener(new MyTriggerListener(), KeyMatcher.keyEquals(TriggerKey.triggerKey("trigger1","group1"))); //启动 scheduler scheduler.start(); } }
三.二.三 控制台打印输出
注册执行的顺序
三.二.四 自定义 TriggerListener 名称
也可以像自定义 JobListener 的名称那样,通过构造方法自定义TriggerListener的名称, 这里就不重复讲解了。
三.二.五 将 vetoJobExecution() 方法的返回值改成 true
@Override public boolean vetoJobExecution(Trigger trigger, JobExecutionContext jobExecutionContext) { System.out.println("未被执行时触发"); //如果为true, 就不往下执行了。 如果为false, 继续往下执行, 来决定 triggerComplete 是否运行 return true; }
三.二.五.一 未注册 JobListener
此时,运行程序,控制台打印输出:
此时,并没有重复执行 MyJob 里面的 备份数据库操作,也没有执行 triggerComplete()的方法。
三.二.五.二 注册 JobListener
在TriggerListenerSchedularDemo.java 中,注册 MyJobListener 的局部监听器
vetoJobExecution() 方法的返回值仍然是 true
//注册Trigger局部 scheduler.getListenerManager().addTriggerListener(new MyTriggerListener(), KeyMatcher.keyEquals(TriggerKey.triggerKey("trigger1","group1"))); //注册JobListener 局部监听器 scheduler.getListenerManager().addJobListener(new MyJobListener(), KeyMatcher.keyEquals(JobKey.jobKey("job1","group1")));
运行程序,控制台打印输出:
执行了 MyJobListener监听器里面的 jobExecutionVetoed() 方法。