分布式部署时需要保证各个节点的系统时间一致。
Quartz默认提供了11张表,如果下载了quartz的源码,相应的sql文件所在目录为quartz/quartz-core/src/main/resources/org/quartz/impl/jdbcjobstore
本文使用的是tables_mysql_innodb.sql文件,它显示指定了使用innodb存储引擎,另一个tables_mysql.sql文件没有指定具体的存储引擎;本方将对这些张表做简单介绍
前面6张都是关于各种triggers的信息,后面包括job,日程表,调度节点状态,悲观锁等信息;相关表操作在类StdJDBCDelegate中,相关sql语句在StdJDBCConstants中;
1.qrtz_blob_triggers
用户自定义的Trigger使用Blob类型进行trigger详细信息的存储(这样设计,JobStore更容易通用),非自定义的Trigger不会存放在此表中;
Quartz提供的triggers包括:CronTrigger,CalendarIntervalTrigger, DailyTimeIntervalTrigger以及SimpleTrigger,这几个trigger信息会保存在后面的几张表中;
2.qrtz_cron_triggers
存储CronTrigger的详细信息,这也是我们使用最多的触发器, 包括cron表达式,时区信息等; Spring对应的封装CronTriggerFactoryBean
3.qrtz_simple_triggers
存储SimpleTrigger的详细信息, 包括重复次数,重复间隔时间和已经执行的次数等
Spring对应的封装SimpleTriggerFactoryBean
4.qrtz_simprop_triggers
存储CalendarIntervalTrigger和DailyTimeIntervalTrigger两种类型的触发器
Spring没有对应的封装类,可能因为这两种不常用,且基本上可以用CronTrigger来实现
5.qrtz_triggers
存储所有Trigger(包括自带的4种Trigger和用户自定义Trigger)的通用动态信息;随着调度的触发preFireTime,nextFireTime, triggerState等都会相应的跟着变化
6.qrtz_fired_triggers
存储即将触发或正在触发的trigger相关信息,trigger随着时间的推移状态发生变化,直到最后trigger执行完成,从表中被删除
7.qrtz_job_details
存储jobDetails信息,相关信息在定义的时候指定,后续不会发生变化
8.qrtz_calendars
Quartz为我们提供了日历的功能,可以自己定义多个时间段,可以控制触发器在这个时间段内不触发或者触发;实际使用中一般是用于定义多个不触发的时间段,用于排除特殊日期,节假日等
系统提供6种类型:AnnualCalendar,CronCalendar,DailyCalendar,HolidayCalendar,MonthlyCalendar,WeeklyCalendar
9.qrtz_paused_trigger_grps
存储已暂停的Trigger组的信息,批量暂停Trigger时用到,不常用。
10.qrtz_scheduler_state
开启集群功能时,存储Scheduler实例名称,检查周期,各节点最后活跃时间等信息;Quartz集群下的故障转移就是借助这个表来实现的
11.qrtz_locks
Quartz提供的锁表,为多个节点调度提供分布式锁,实现分布式调度,默认有2个锁:STATE_ACCESS 主要用在scheduler定期检查是否有失效节点的时候,保证只有一个节点去检查和处理;
TRIGGER_ACCESS 主要用在Trigger触发和触发完成的时候,保证只有一个节点去执行相应的逻辑, 当然也可以通过配置让Trigger在获取任务时也加锁