Quartz框架(一)—Quartz的基本配置
Quartz框架(二)—jobstore数据库表字段详解
Quartz框架(三)—任务的并行/串行执行
Quartz框架(四)—misfire处理机制
Quartz框架(五)— 有状态的job和无状态job
Quartz框架(六)— Trigger状态转换
Quartz框架(七)— Quartz集群原理
Quartz框架(八)— Quartz实现异步通知
Quartz框架(九)— 动态操作Quartz定时任务
Quartz框架(十)监听
1. 概述
Quartz的监听器用于当任务调度中关注的事件发生时,能够及时获取这一事件的通知。
- Quartz监听的种类:
- JobListener:任务监听;
- TriggerListener:触发器监听;
- SchedulerListener:调度器监听;
- 监听器的作用域
- 全局监听器:能够接收到所有的Job/Trigger的事件通知;
- 局部监听器:只能接收在其上注册Job或者Trigger的事件;
2. 监听器的种类
2.1 JobListener
源码位置:org.quartz.JobListener
public interface JobListener {
//获取该JobListener的名称
String getName();
//Scheduler在JobDetail将要被执行时调用该方法
void jobToBeExecuted(JobExecutionContext context);
//Scheduler在JobDetail将要被执行时,但又被TriggerListener否决调用
void jobExecutionVetoed(JobExecutionContext context);
//任务执行完毕调用该方法
void jobWasExecuted(JobExecutionContext context,
JobExecutionException jobException);
}
将JobListener绑定到Scheduler中:
//监听所有的Job
scheduler.getListenerManager().addJobListener(new SimpleJobListener(), EverythingMatcher.allJobs());
//监听特定的Job
scheduler.getListenerManager().addJobListener(new SimpleJobListener(), KeyMatcher.keyEquals(JobKey.jobKey("HelloWorld1_Job", "HelloWorld1_Group")));
//监听同一任务组的Job
scheduler.getListenerManager().addJobListener(new SimpleJobListener(), GroupMatcher.jobGroupEquals("HelloWorld2_Group"));
//监听两个任务组的Job
scheduler.getListenerManager().addJobListener(new SimpleJobListener(), OrMatcher.or(GroupMatcher.jobGroupEquals("HelloWorld1_Group"), GroupMatcher.jobGroupEquals("HelloWorld2_Group")));
2.2 TriggerListener
源码位置:org.quartz.TriggerListener
触发器监听,即在任务调度过程中,与触发器Trigger相关的事件:触发器触发、触发器未正常触发、触发器触发完成等。
public interface TriggerListener {
//获取触发器的名字
public String getName();
//Job的execute()方法被调用时调用该方法。
public void triggerFired(Trigger trigger, JobExecutionContext context);
//Trigger触发后,TriggerListener给了一个选择否定Job的执行。假如该方法返回true,该Job将不会被触发
public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context);
//Trigger错过触发时间触发该方法,此方法不应该含有长时间的处理逻辑。
public void triggerMisfired(Trigger trigger);
//Trigger被触发并且完成Job后触发。
public void triggerComplete(Trigger trigger, JobExecutionContext context,
int triggerInstructionCode);
}
将TriggerListener绑定到Scheduler中:
//监听所有的Trigger
scheduler.getListenerManager().addTriggerListener(new SimpleTriggerListener("SimpleTrigger"), EverythingMatcher.allTriggers());
//监听特定的Trigger
scheduler.getListenerManager().addTriggerListener(new SimpleTriggerListener("SimpleTrigger"), KeyMatcher.keyEquals(TriggerKey.triggerKey("HelloWord1_Job", "HelloWorld1_Group")));
//监听一组Trigger
scheduler.getListenerManager().addTriggerListener(new SimpleTriggerListener("SimpleTrigger"), GroupMatcher.groupEquals("HelloWorld1_Group"));
//移除监听器
scheduler.getListenerManager().removeTriggerListener("SimpleTrigger");
2.3 SchedulerListener
源码位置:org.quartz.SchedulerListener
SchedulerListener会在Scheduler的生命周期关键事件发生时调用。与Scheduler有关的事件包括:增加一个job/trigger,删除一个job/Trigger,scheduler发生严重错误,关闭Scheduler等。
public interface SchedulerListener {
//用于部署JobDetail时调用
public void jobScheduled(Trigger trigger);
//用于卸载JobDetail时调用
public void jobUnscheduled(String triggerName, String triggerGroup);
//当一个Trigger没有触发次数时调用。
public void triggerFinalized(Trigger trigger);
public void triggersPaused(String triggerName, String triggerGroup);
public void triggersResumed(String triggerName, String triggerGroup);
//当一个或一组 JobDetail 暂停时调用这个方法。
public void jobsPaused(String jobName, String jobGroup);
//当一个或一组 Job 从暂停上恢复时调用这个方法。假如是一个 Job 组,jobName 参数将为 null。
public void jobsResumed(String jobName, String jobGroup);
//在 Scheduler 的正常运行期间产生一个严重错误时调用这个方法。
public void schedulerError(String msg, SchedulerException cause);
//当Scheduler 开启时,调用该方法
public void schedulerStarted();
//当Scheduler处于StandBy模式时,调用该方法
public void schedulerInStandbyMode();
//当Scheduler停止时,调用该方法
public void schedulerShutdown();
//当Scheduler中的数据被清除时,调用该方法。
public void schedulingDataCleared();
}
将SchedulerListener绑定到Scheduler中:
//创建监听
scheduler.getListenerManager().addSchedulerListener(new SimpleSchedulerListener());
//移除监听
scheduler.getListenerManager().removeSchedulerListener(new SimpleSchedulerListener());
总结
以监听器的种类来说,比较有价值的便是
-
org.quartz.TriggerListener#triggerMisfired
,即一些比较重要的定时,若错过触发时间(并且超过了org.quartz.jobStore.misfireThreshold = 60000
单位ms,忍受时间),就可以发送邮件报警。 -
org.quartz.JobListener#jobWasExecuted
,当定时任务中抛出异常后,该方法可以获取到该异常信息,然后进行报警出来(也可以进行立即重试或者移除所有触发器操作)。
Quartz使用(4) - Quartz监听器Listerner