您的位置:首页 > 其它

Quartz任务调度(5)TriggerListener分版本超详细解析

2016-03-27 14:11 453 查看

TriggerListener

在我们的触发器监听器中,也包含了一系列监听方法

方法说明
getName()定义并返回监听器的名字
triggerFired()当与监听器相关联的 Trigger 被触发,Job 上的 execute() 方法将要被执行时,Scheduler 就调用这个方法。在全局 TriggerListener 情况下,这个方法为所有 Trigger 被调用。
vetoJobExecution()在 Trigger 触发后,Job 将要被执行时由 Scheduler 调用这个方法。TriggerListener 给了一个选择去否决 Job 的执行。假如这个方法返回 true,这个 Job 将不会为此次 Trigger 触发而得到执行。
triggerMisfired()Scheduler 调用这个方法是在 Trigger 错过触发时。如这个方法的 JavaDoc 所指出的,你应该关注此方法中持续时间长的逻辑:在出现许多错过触发的 Trigger 时,长逻辑会导致骨牌效应。你应当保持这上方法尽量的小。
triggerComplete()Trigger 被触发并且完成了 Job 的执行时,Scheduler 调用这个方法。这不是说这个 Trigger 将不再触发了,而仅仅是当前 Trigger 的触发(并且紧接着的 Job 执行) 结束时。这个 Trigger 也许还要在将来触发多次的。
下面是我们的监听器实例配置

1. 自定义监听器

public class MyTriggerListener implements TriggerListener {

@Override
public String getName() {
return "myTriggerListener";
}

@Override
public void triggerFired(Trigger trigger, JobExecutionContext context) {
System.out.println(" Trigger 被触发了,此时Job 上的 execute() 方法将要被执行");
}

@Override
public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) {
System.out.println("发现此次Job的相关资源准备存在问题,不便展开任务,返回true表示否决此次任务执行");
return true;
}

@Override
public void triggerMisfired(Trigger trigger) {
System.out.println( "当前Trigger触发错过了");
}

@Override//1.+版本
public void triggerComplete(Trigger trigger, JobExecutionContext context,
int triggerInstructionCode) {
System.out.println("Trigger 被触发并且完成了 Job 的执行,此方法被调用");
}
/*
@Override//这是2.+版本的配置,差别在于将triggerInstructionCode从整型改成了枚举类型
public void triggerComplete(Trigger trigger, JobExecutionContext context,
CompletedExecutionInstruction triggerInstructionCode) {
System.out.println("Trigger 被触发并且完成了 Job 的执行,此方法被调用");
}
*/
}


使用TriggerListener和JobListener的方法大同小异,思路都是一样的。

2. 1.x版本

相对于上一篇文章的配置,我们只需将JobListener替换成TriggerListener即可。下面是我们的完整测试代码:

public static void main(String args[]) throws SchedulerException {
JobDetail pickNewsJob =new JobDetail("job1", "jgroup1", PickNewsJob.class);
JobDetail getHottestJob =new JobDetail("job2", "jgroup2", GetHottestJob.class);
SimpleTrigger pickNewsTrigger = new SimpleTrigger("trigger1", "group1",1,2000);
SimpleTrigger getHottestTrigger = new SimpleTrigger("trigger2", "group2",1,3000);

SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
JobListener myJobListener = new MyJobListener();
/**********局部Job监听器配置**********/
pickNewsJob.addJobListener("myJobListener");//这里的名字和myJobListener中getName()方法的名字一样
scheduler.addJobListener(myJobListener);//向scheduler注册我们的监听器
/*********全局Job监听器配置************/
//      scheduler.addGlobalJobListener(myJobListener);//直接添加为全局监听器

TriggerListener myTriggerListener = new MyTriggerListener();
/**********局部Trigger监听器配置**********/
pickNewsTrigger.addTriggerListener("myTriggerListener");
scheduler.addTriggerListener(myTriggerListener);
/*********全局Trigger监听器配置************/
//      scheduler.addGlobalTriggerListener(myTriggerListener);//直接添加为全局监听器

scheduler.scheduleJob(pickNewsJob,pickNewsTrigger);
scheduler.scheduleJob(getHottestJob,getHottestTrigger);

scheduler.start();

}


运行程序,我们会看到:

Trigger 被触发了,此时Job 上的 execute() 方法将要被执行

发现此次Job的相关资源准备存在问题,不便展开任务,返回true表示否决此次任务执行——————我们的Trigger监听器要否决我们的任务,触发了相应的监听方法,同时后续的complete监听方法自然不会再被执行

被否决执行了,可以做些日志记录。——————我们的pickNewsJob被否决了,触发了相应的监听方法

在13:15:39根据文章的阅读量和评论量来生成我们的最热文章列表

Trigger 被触发了,此时Job 上的 execute() 方法将要被执行

发现此次Job的相关资源准备存在问题,不便展开任务,返回true表示否决此次任务执行

被否决执行了,可以做些日志记录。

在13:15:42根据文章的阅读量和评论量来生成我们的最热文章列表

如果我们将TriggerListener中的vetoJobExecution()方法改成如下所示:

@Override
public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) {
//      System.out.println("发现此次Job的相关资源准备存在问题,不便展开任务,返回true表示否决此次任务执行");
//      return true;
System.out.println("不否决Job,正常执行");
return false;
}


再运行我们的测试程序,会打印:

Trigger 被触发了,此时Job 上的 execute() 方法将要被执行

不否决Job,正常执行

myJobListener触发对class tool.job.PickNewsJob的开始执行的监听工作,这里可以完成任务前的一些资源准备工作或日志记录

在13:20:20扒取新闻

在13:20:20根据文章的阅读量和评论量来生成我们的最热文章列表

myJobListener触发对class tool.job.PickNewsJob结束执行的监听工作,这里可以进行资源销毁工作或做一些新闻扒取结果的统计工作

Trigger 被触发并且完成了 Job 的执行,此方法被调用

Trigger 被触发了,此时Job 上的 execute() 方法将要被执行

不否决Job,正常执行

myJobListener触发对class tool.job.PickNewsJob的开始执行的监听工作,这里可以完成任务前的一些资源准备工作或日志记录

在13:20:22扒取新闻

myJobListener触发对class tool.job.PickNewsJob结束执行的监听工作,这里可以进行资源销毁工作或做一些新闻扒取结果的统计工作

Trigger 被触发并且完成了 Job 的执行,此方法被调用

在13:20:23根据文章的阅读量和评论量来生成我们的最热文章列表

我们的Job不被否决,同时有后续的Job成功执行的监听方法调用

2.x版本

我们可以调用如下所示测试代码:

public static void main(String args[]) throws SchedulerException {
final JobDetail pickNewsJob = JobBuilder.newJob(PickNewsJob.class)
.withIdentity("job1", "jgroup1").build();
JobDetail getHottestJob = JobBuilder.newJob(GetHottestJob.class)
.withIdentity("job2", "jgroup2").build();

SimpleTrigger pickNewsTrigger = TriggerBuilder
.newTrigger()
.withIdentity("trigger1","tgroup1")
.withSchedule(SimpleScheduleBuilder.repeatSecondlyForTotalCount(2, 1)).startNow()
.build();
SimpleTrigger getHottestTrigger = TriggerBuilder
.newTrigger()
.withIdentity("trigger2","tgroup2")
.withSchedule(SimpleScheduleBuilder.repeatSecondlyForTotalCount(2, 2)).startNow()
.build();

Scheduler scheduler = new StdSchedulerFactory().getScheduler();
JobListener myJobListener = new MyJobListener();
KeyMatcher<JobKey> keyMatcher = KeyMatcher.keyEquals(pickNewsJob.getKey());
scheduler.getListenerManager().addJobListener(myJobListener, keyMatcher);
/********下面是新加部分***********/
TriggerListener myTriggerListener = new MyTriggerListener();
KeyMatcher<TriggerKey> tkeyMatcher = KeyMatcher.keyEquals(pickNewsTrigger.getKey());
scheduler.getListenerManager().addTriggerListener(myTriggerListener, tkeyMatcher);

scheduler.scheduleJob(pickNewsJob, pickNewsTrigger);
scheduler.scheduleJob(getHottestJob,getHottestTrigger);
scheduler.start();
}


调用此方法,我们和得到和1.+版本中类似的结果:

Trigger 被触发了,此时Job 上的 execute() 方法将要被执行

发现此次Job的相关资源准备存在问题,不便展开任务,返回true表示否决此次任务执行

被否决执行了,可以做些日志记录。

根据文章的阅读量和评论量来生成我们的最热文章列表

Trigger 被触发了,此时Job 上的 execute() 方法将要被执行

发现此次Job的相关资源准备存在问题,不便展开任务,返回true表示否决此次任务执行

被否决执行了,可以做些日志记录。

根据文章的阅读量和评论量来生成我们的最热文章列表

源码下载

关于本节测试源码内容可到https://github.com/jeanhao/spring下quartzEvent文件夹下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: