之前使用quartz都是简单的执行几个任务,前段时间,公司需要集群支持,所有抽空研究了下quartz源码,现在整理下
因业务需要任务量会大量增加,平常一般使用方式都是单点,任务相关数据采用RAMStore,容易出现单点故障,需要人工介入,因此我们开启了Quartz集群功能,多台机器一起调度执行一波任务,其中一台机器宕机或任务非异常原因都会自动被其他机器接管.
1.配置
Quartz使用特别简单,单机和集群区别在quartz.properties
一般使用都是默认配置
// quartz 服务实例名
org.quartz.scheduler.instanceName:DefaultQuartzScheduler
// rmi远程调用代理默认不用
org.quartz.scheduler.rmi.export: false
org.quartz.scheduler.rmi.proxy: false
// Job事务是否自定义的 spring quartz采用了这个特性
org.quartz.scheduler.wrapJobExecutionInUserTransaction:false
// Job执行的线程池
org.quartz.threadPool.class:org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount: 10
// 线程权重
org.quartz.threadPool.threadPriority:5
// 线程类加载器是否继承父类加载器
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread:true
// job阻塞时间操作此时间将跳过此次执行
org.quartz.jobStore.misfireThreshold:60000
// 默认内存存储模式
org.quartz.jobStore.class:org.quartz.simpl.RAMJobStore
集群配置模式与单机配置唯一区别
// quartz jdbc事务持久化
org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.tablePrefix = QRTZ_
// 此值默认是关闭的集群要开启它
org.quartz.jobStore.isClustered = true
// 同一实例集群检测其他实例是否存活的轮询时间
org.quartz.jobStore.clusterCheckinInterval=20000
// 指定数据源
org.quartz.jobStore.dataSource = myDS
org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver
// 数据源 内部c3p0池子
org.quartz.dataSource.myDS.URL = ${jdbc.url}
org.quartz.dataSource.myDS.user = ${jdbc.username}
org.quartz.dataSource.myDS.password= ${jdbc.password}
org.quartz.dataSource.myDS.maxConnections = 30
表结构说明
表名前缀qrtz通过配置决定,下面表都是quartz官方提供的建表sql生成,对各表简要说明
1. 表:qrtz_blob_triggers
字段 | 说明 |
SCHED_NAME | Quartz 实例名 |
TRIGGER_NAME | 密码 |
TRIGGER_GROUP | 应用编码 |
BLOB_DATA |
|
说明:
2.表:qrtz_calendars
字段 | 说明 |
SCHED_NAME | Quartz 实例名 |
CALENDAR_NAME | 日历名称 |
CALENDAR | Blob calendar对象序列化后存入此字段 |
说明:
schedule.addCalendars里创建此表记录, trigger.setCalendarName让trigger应用于calendar方式
3.表:qrtz_cron_triggers
字段 | 说明 |
SCHED_NAME | Quartz 实例名 |
TRIGGER_NAME | Trigger名称 |
TRIGGER_GROUP | Trigger组 |
CRON_EXPRESSION | Cron表达式 |
TIME_ZONE_ID | 时区 |
说明:创建的cron表达式的trigger记录存放此表
4.表: qrtz_fired_triggers
字段 | 说明 |
SCHED_NAME | Quartz 实例名 |
ENTRY_ID | InstanceId+系统当前毫秒 |
TRIGGER_NAME | Trigger 名称 |
TRIGGER_GROUP | Trigger 组 |
INSTANCE_NAME | Quartz InstanceId 实例对象ID |
FIRED_TIME | 触发时间(系统时间) |
SCHED_TIME | 下次fire时间 |
PRIORITY | 任务优先级 |
STATE | 状态都是“ACQUIRED” |
JOB_NAME | jobdetail名字 |
JOB_GROUP | Jobdetail 组 |
IS_NONCONCURRENT | 同一任务是否并行执行 |
REQUESTS_RECOVERY | job是否恢复运行 |
说明:要被执行的任务将出现在此表,执行完后删除
5.表: QRTZ_JOB_DETAILS
字段 | 说明 |
SCHED_NAME` | Quartz 实例名 |
JOB_NAME | job名称
|
JOB_GROUP | job组 |
DESCRIPTION | 描述 |
JOB_CLASS_NAME | 执行job class类 |
IS_DURABLE | 持久job |
IS_NONCONCURRENT | 并发JOB @DisallowConcurrentExecution |
持久jobDataMap @PersistJobDataAfterExecution | |
REQUESTS_RECOVERY | job是否恢复运行 |
JOB_DATA | Job的datamap里的数据 |
说明:job属性表,维护job的基础信息
6.表: QRTZ_LOCKS
字段 | 说明 |
SCHED_NAME | Quartz 实例名 |
LOCK_NAME | 锁名称 |
说明:字典表,初始化两条记录,一个是获取trigger的锁,一个触发trigger的锁
7.表: QRTZ_PAUSED_TRIGGER_GRPS
字段 | 说明 |
SCHED_NAME | Quartz 实例名 |
TRIGGER_GROUP | Trigger 组 |
说明:
8.表: QRTZ_SCHEDULER_STATE
字段 | 说明 |
SCHED_NAME | Quartz 实例名 |
INSTANCE_NAME | InstanceId |
LAST_CHECKIN_TIME | 最后一次检查时间 |
CHECKIN_INTERVAL | 检查周期 |
说明:quartz服务实例信息此表,后台线程通过LAST_CHECKIN_TIME CHECKIN_INTERVAL 当前时间确定那个实例崩溃
9.表: QRTZ_SIMPLE_TRIGGERS
字段 | 说明 |
SCHED_NAME | Quartz 实例名 |
TRIGGER_NAME | Trigger 名称 |
TRIGGER_GROUP | Trigger 组 |
REPEAT_COUNT | 重复执行次数 |
REPEAT_INTERVAL | 间隔时间 |
TIMES_TRIGGERED | 作业运行的次数 |
说明:simpleTrigger对象创建记录在此表
10.表: QRTZ_SIMPROP_TRIGGERS
字段 | 说明 |
SCHED_NAME | Quartz 实例名 |
TRIGGER_NAME | Trigger 名称 |
TRIGGER_GROUP | Trigger 组 |
STR_PROP_1 |
|
STR_PROP_2 |
|
STR_PROP_3 |
|
INT_PROP_1 |
|
INT_PROP_2 |
|
LONG_PROP_1 |
|
LONG_PROP_2 |
|
DEC_PROP_1 |
|
DEC_PROP_2 |
|
BOOL_PROP_1 |
|
BOOL_PROP_2 |
|
说明:
11.表:QRTZ_TRIGGERS
字段 | 说明 |
SCHED_NAME | Quartz 实例名 |
TRIGGER_NAME | Trigger 名称 |
TRIGGER_GROUP | Trigger 组 |
JOB_NAME | Job 名称 |
JOB_GROUP | Job 组 |
DESCRIPTION | 描述 |
NEXT_FIRE_TIME | 下次触发时间 毫秒 |
PREV_FIRE_TIME | 上次触发时间 |
PRIORITY | 权重 |
TRIGGER_STATE | 状态 |
TRIGGER_TYPE | 触发类型 cron ,simple,calendar |
START_TIME | 开始运行时间 |
END_TIME | 结束运行时间 |
CALENDAR_NAME | 设置的calendar的名称 |
MISFIRE_INSTR | -1:错过执行 0:正常 |
JOB_DATA | JOB的datamap,仓库ID存在此datamap里 |