在《spring学习笔记(15)趣谈spring 事件:实现业务逻辑解耦,异步调用提升用户体验》我们通过实例分析讲解了spring的事件机制,或许你会觉得其中的配置略显繁琐,而在Quartz框架中,它为我们集成了强大的事件机制,轻松地帮助我们在任务调度中完成各类辅佐操作,高内聚而耦合。
相对spring的事件实现,quartz这边简化了许多,我们只需:
1. 自定义监听器接口实现类
2. 向scheduler中注册监听器实现类
只需以上两步即可我完成我们的事件监听。对于监听器实现类中,可能有些方法不是我们需要的,这时候我们只需给出空实现即可。在Quartz中,监听器类型主要分为三种,和Quartz三个核心类相对应:JobListener,TriggerListener,SchedulerListener。下面我们先分析JobListener的使用方法。其他两种监听器留待后面系列文章详解
JobListener
我们的jobListener实现类必须实现其以下方法:
方法 | 说明 |
---|---|
getName() | getName() 方法返回一个字符串用以说明 JobListener 的名称。对于注册为全局的监听器,getName() 主要用于记录日志,对于由特定 Job 引用的 JobListener,注册在 JobDetail 上的监听器名称必须匹配从监听器上 getName() 方法的返回值。 |
jobToBeExecuted() | Scheduler 在 JobDetail 将要被执行时调用这个方法。 |
jobExecutionVetoed() | Scheduler 在 JobDetail 即将被执行,但又被 TriggerListener 否决了时调用这个方法。 |
jobWasExecuted() | Scheduler 在 JobDetail 被执行之后调用这个方法。 |
接下来我们以《Quartz任务调度(1)概念例析快速入门》一文中的定时扒取新闻任务和获得最热新闻任务为例,分析我们的监听器方法。
1. 自定义监听器接口实现类
public class MyJobListener implements JobListener {
@Override//相当于为我们的监听器命名
public String getName() {
return "myJobListener";
}
@Override
public void jobToBeExecuted(JobExecutionContext context) {
System.out.println(getName() + "触发对"+context.getJobDetail().getJobClass()+"的开始执行的监听工作,这里可以完成任务前的一些资源准备工作或日志记录");
}
@Override//“否决JobDetail”是在Triiger被其相应的监听器监听时才具备的能力
public void jobExecutionVetoed(JobExecutionContext context) {
System.out.println("被否决执行了,可以做些日志记录。");
}
@Override
public void jobWasExecuted(JobExecutionContext context,
JobExecutionException jobException) {
System.out.println(getName() + "触发对"+context.getJobDetail().getJobClass()+"结束执行的监听工作,这