Quartz总结

401 阅读3分钟

「这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战

1、前言

在前几篇的分享中,我为大家基于Quartz开发定时任务的应用。但是,对于Quartz中的一些基本概念与实现原理并没有讲很清楚。下面就结合笔者本人之前的开发过程中总结的一些知识,为大家分享下。

2、基本概念与原理

1、Job任务

这是Quartz中非常重要的一个概念,就是任务。它代表具体要执行的业务逻辑。e.g.:同步数据、发送信息等.

2、Trigger触发器

它是用来定义Job(任务)的触发条件、触发时间、触发间隔,终止时间等信息。常用CornTrigger(基于cron表达式)

3、Scheduler调度器

启动Trigger去执行Job(PS:单例),由scheduler工厂创建。

4、串行定时任务

给对应任务类使用以下注解,即可防止(同一)任务并行 -> @DisallowConcurrentExecution

5、有状态JOB与无状态JOB

无状态任务在执行时,拥有自己的JobDataMap拷贝,对JobData的更改不会影响下次的执行。

有状态任务共享同一个JobDataMap实例,每次任务执行对JobDataMap所做的更改都会保存下来,后面的执行可以看到这个更改。也就是每次执行任务后都会对后面的执行发生影响。

无状态的Job可以并发执行,而有状态的StatefulJob不能并发执行。因此除非必要,应该尽量使用无状态的Job。

实现一个有状态的JOB,可以使用以下两个注解

@DisallowConcurrentExecution 不允许并发执行,即JOB为串行执行。

@PersistJobDataAfterExecution 在执行后将JobData持久化。

6、Quartz中数据库表介绍

qrtz_simple_triggers:记录SimpleTrigger的信息。

qrtz_corn_triggers:记录CornTrigger的信息。

qrtz_simprop_triggers:记录CalendarIntervalTrigger和DailyTimeIntervalTrigger两种类型的触发器信息。

qrtz_blob_triggers:记录自定义的triggers使用blog类型进行存储,非自定义的triggers不会存放在此表中。

qrtz_fired_triggers:记录每个正在执行的触发器。trigger随着时间的推移状态发生变化,直到最后trigger执行完成,从表中被删除。

qrtz_triggers:记录每个触发器的详细信息。

qrtz_job_details:记录每个任务的详细信息。

qrtz_calendars:记录日历信息。可以自己定义一个时间段,可以控制触发器在这个时间段内触发或者不触发;现在提供6种类型:AnnualCalendar,CronCalendar,DailyCalendar,HolidayCalendar,MonthlyCalendar,WeeklyCalendar。

qrtz_paused_trigger_grps:记录暂停的触发器,

qrtz_scheduler_state:记录 调度器(每个机器节点)的生命状态。

qrtz_locks:记录程序的悲观锁(防止多个节点同时执行同一个定时任务)。

7、触发器激活失败

可能原因:调度器被关闭、线程池没有可用线程、应用重启、任务的串行执行、错过激活时间(misfire)。

那么如何判定激活失败呢?在Quartz的配置文件中有一个misfireThreshold的属性,用来指定调度引擎设置触发器超时的“临界值”。

激活失败的处理:所有的misfile任务马上执行、将错过的触发归类,立即触发一次,正常执行下一个周期的任务、直接执行下一个周期的任务等策略。

8、其他:

org.quartz.TriggerListener#triggerMisfired,即一些比较重要的定时,若错过触发时间(并且超过了org.quartz.jobStore.misfireThreshold = 60000单位ms),就可以发送邮件报警。

org.quartz.JobListener#jobWasExecuted,当定时任务中抛出异常后,该方法可以获取到该异常信息,然后进行报警出来(也可以进行立即重试或者移除所有触发器操作)。

好了、本期就先介绍到这里,有什么需要交流的,大家可以随时私信我。😊