前言
这次我负责的一个后端项目,用了很多定时任务,定时任务框架是自带的Quartz
。我让新来的小刘记录一下定时任务的执行情况。后来他很快的完成了,我看了之后,还是觉得有些问题吧。小刘是通过AOP去实现的,看一下代码
@Around("jobAspect()")
public Object doInvoke(ProceedingJoinPoint joinPoint) throws Throwable{
// 执行目标方法
Object result = joinPoint.proceed();
// 创建任务日志实体对象
JobLog log = new JobLog();
//记录任务开始执行时间,任务时间(代码省略)......
// 设置任务执行是否成功
log.setIsSuccess(true);
// 保存日志
jobMapper.insert(log);
return result;
}
看到这个代码我认为有两个问题:
- 上面的日志,不能记录异常状态;
- 并且根据经验来讲,应该可以实现接口就行了,不用AOP。
因此到这儿我觉得是时候,重新认识一下Quartz内部的接口了。下面就给大家简单介绍一下Quartz的重要接口吧。
Quartz重要三个关键的Listener接口
JobListener 任务监听接口
监听任务执行情况的接口,监听 任务执行前、以及执行结果、执行是否有异常。
//必须设置一个名称
String getName();
//任务调用前回调
void jobToBeExecuted(JobExecutionContext context);
//任务被阻止执行的回调。
void jobExecutionVetoed(JobExecutionContext context);
//任务执行完成之后的方法,如果任务异常jobException不为null
void jobWasExecuted(JobExecutionContext context,
JobExecutionException jobException);
对于前言中的案例可以使用实现
JobListener
的jobWasExecuted
方法去记录日志
如果JobExecutionException
不为空则表明任务异常,并记录报错日志。
TriggerListener 触发器监听接口
监听触发器的情况
String getName();
//trigger 被触发
void triggerFired(Trigger trigger, JobExecutionContext context);
// 是否阻止任务执行,如果返回true 对应trigger绑定的任务就不会执行(JobListener.jobExecutionVetoed 就能监听到任务被阻止)
boolean vetoJobExecution(Trigger trigger, JobExecutionContext context);
// 当触发器错过触发时间时被调用
void triggerMisfired(Trigger trigger);
//trigger绑定的任务执行完成
void triggerComplete(Trigger trigger, JobExecutionContext context,
CompletedExecutionInstruction triggerInstructionCode);
SchedulerListener
Quartz 框架中的 SchedulerListener
接口定义了一组监听 Scheduler 生命周期事件的方法。通过实现 SchedulerListener
接口,开发者可以在 Scheduler 状态发生变化时得到相应的通知。下面我们来详细介绍一下 SchedulerListener
接口中的各个方法(代码就不粘贴了):
-
jobScheduled(Trigger trigger)
:- 当有新的任务被成功调度时,此方法会被调用。
- 参数
trigger
表示被调度的触发器对象。
-
jobUnscheduled(TriggerKey triggerKey)
:- 当一个任务被从 Scheduler 中删除时,此方法会被调用。
- 参数
triggerKey
表示被删除的触发器的标识。
-
triggerFinalized(Trigger trigger)
:- 当一个触发器完成它的生命周期时,此方法会被调用。
- 参数
trigger
表示完成生命周期的触发器对象。
-
triggerPaused(TriggerKey triggerKey)
:- 当一个触发器被暂停时,此方法会被调用。
- 参数
triggerKey
表示被暂停的触发器的标识。
-
triggerResumed(TriggerKey triggerKey)
:- 当一个触发器从暂停状态恢复时,此方法会被调用。
- 参数
triggerKey
表示被恢复的触发器的标识。
-
jobAdded(JobDetail jobDetail)
:- 当一个新的任务被添加到 Scheduler 中时,此方法会被调用。
- 参数
jobDetail
表示被添加的任务详情。
-
jobDeleted(JobKey jobKey)
:- 当一个任务从 Scheduler 中删除时,此方法会被调用。
- 参数
jobKey
表示被删除的任务标识。
-
jobPaused(JobKey jobKey)
:- 当一个任务被暂停时,此方法会被调用。
- 参数
jobKey
表示被暂停的任务标识。
-
jobResumed(JobKey jobKey)
:- 当一个任务从暂停状态恢复时,此方法会被调用。
- 参数
jobKey
表示被恢复的任务标识。
-
schedulerError(String msg, SchedulerException cause)
:- 当 Scheduler 发生错误时,此方法会被调用。
- 参数
msg
表示错误消息,cause
表示引发错误的异常对象。
-
schedulerInStandbyMode()
:- 当 Scheduler 进入待机模式时,此方法会被调用。
-
schedulerStarted()
:- 当 Scheduler 启动完成时,此方法会被调用。
-
schedulerStarting()
:- 当 Scheduler 开始启动时,此方法会被调用。
-
schedulerShutdown()
:- 当 Scheduler 关闭时,此方法会被调用。
-
schedulerShuttingdown()
:- 当 Scheduler 开始关闭时,此方法会被调用。
通过实现 SchedulerListener
接口,开发者可以监听 Scheduler 生命周期中的各种事件,并在事件发生时执行相应的业务逻辑。这样可以增强定时任务系统的可观测性和可维护性。
Listener使用方式:
1.实现Listener 接口
2.将实现类注册到ListenerManager中。不同的监听器需要使用对应的Add方法。
eg:
Scheduler scheduler = // 获取 Scheduler 实例;
scheduler.getListenerManager().addTriggerListener(new MyTriggerListener());