小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
在上一篇文章中,通过自定义配置实现了Quartz的持久化存储等功能,这次就来详细学习Quartz配置文件中配置项的具体含义。
1. Quartz配置信息
Quartz的配置内容根据功能可以分为四个部分:
- 调度器相关配置
- 数据源类型相关配置
- 线程池相关配置
- 监听器相关配置
2 调度器属性配置
调度器配置就是用来定义scheduler的相关属性,该类配置项定义时的前缀为org.quartz.scheduler.
2.1 相关属性名
- instanceName,调度器实例名称,不配置时默认为QuartzScheduler
- instanceId,调度器实例id,不配置时默认为NON_CLUSTERED,可以设置为Auto自动生成
- 集群时为了保证id唯一,可以设置为Auto自动生成
- instanceIdGenerator.class,调度器实例id的生成方式,只有在调度器示例id设置为Auto自动生成时有效,缺省值org.quartz.simpl.SimpleInstanceIdGenerator
- threadName,调度器的线程名称,默认使用instanceName+’_QuartzSchedulerThread’
- makeSchedulerThreadDaemon,是否将schedule主线程设置为守护线程,默认false
- threadsInheritContextClassLoaderOfInitializer,Quartz生成的线程是否继承初始化线程的上下文类加载器,默认false
- idleWaitTime,在调度程序空闲时,重复查询是否有可用触发器的等待时间,默认30000
- dbFailureRetryInterval,连接超时重试连接的间隔,默认15000
- classLoadHelper.class,类加载帮助类,默认org.quartz.simpl.CascadingClassLoadHelper
- jobFactory.class, 指定JobFactory的类(接口)名称,负责实例化jobClass,默认值为org.quartz.simpl.PropertySettingJobFactory
- wrapJobExecutionInUserTransaction,是否在Quartz执行一个job前使用UserTransaction,默认false
- userTransactionURL,设置Quartz能够加载UserTransaction的JNDI的 URL,默认java:comp/UserTransaction
- skipUpdateCheck,在程序运行前检查quartz是否有版本更新,默认false
- batchTriggerAcquisitionMaxCount,允许调度程序一次性触发的触发器数量,默认值1
- 值越大表示允许触发的任务越多
- 如果值大于1时,需要设置org.quartz.jobStore.acquireTriggersWithinLock属性为true,以避免多个触发器产生的数据混乱
- batchTriggerAcquisitionFireAheadTimeWindow,允许触发器被获取并在其预定的触发时间之前触发的数量,默认数量为0
2.2 常用属性
调度器相关的属性配置基本都有默认值,如果没有必要不需要对默认配置进行修改,常用到需要自定义配置的主要有实例名称和实例id生成方法几项。
# 调度器实例名称
org.quartz.scheduler.instanceName = Scheduler
# 调度器实例编号自动生成
org.quartz.scheduler.instanceId = AUTO
3. 数据源类型相关配置
quartz框架中数据源相关的配置属性的统一前缀为:org.quartz.jobStore.
3.1 具体属性名称
- class,job的存储方式,可以选择存储在内存中或者持久化数据库中,默认为null
- org.quartz.simpl.RAMJobStore 即存储在内存中,不适用配置文件时默认值
- org.quartz.impl.jdbcjobstore.JobStoreTX 表示选择JDBC存储方式,自己管理事务
- org.quartz.impl.jdbcjobstore.JobStoreCMT也表示JDBC,但是由全局JTA管理事务
- driverDelegateClass,用于处理不同数据库之间差异的实现类,默认null
- 使用mysql jdbc数据存储时设置为为org.quartz.impl.jdbcjobstore.StdJDBCDelegate
- dataSource,配置数据源的名称,默认null
- 如果不配置数据源名称,可以使用spring配置文件中的数据源,并在scheduler创建时注入
- 如果此处配置了数据源的名称,可以进一步在quartz文件中配置数据源信息
# 配置数据源名称:`dataSoruce=dataSourceName` org.quartz.dataSource.dataSourceName.driver org.quartz.dataSource.dataSourceName.URL org.quartz.dataSource.dataSourceName.user org.quartz.dataSource.dataSourceName.password org.quartz.dataSource.dataSourceName.maxConnections - tablePrefix,表示quartz定时任务持久化时对应的数据表前缀,默认值
QRTZ_ - misfireThreshold,最大能忍受的触发超时时间,默认值60000,超时则认为失误
- useProperties,使用key-value的形式存储JobDataMap,默认true
- 指示JDBCJobStore所有的JobDataMaps中的值都是字符串,并且能以“名字-值”对的方式存储而不是以复杂对象的序列化形式存储在BLOB字段中,应该设置为true
- isClustered,是否以集群方式运行,默认false
- 如果多个quartz实例使用同一个数据库,则需要设置为true,否则会报错
- clusterCheckinInterval,检入到数据库中的频率,默认20000
- maxMisfiresToHandleAtATime,JobStore处理未按时触发的Job数量,默认20
- dontSetAutoCommitFalse,事务是否自动提交,默认false
- selectWithLockSQL,配置加锁的SQL语句,默认false,需要配置时默认语句是:
SELECT * FROM [tableName] LOCKS WHERE LOCK_NAME = ? FOR UPDATE
- txIsolationLevelSerializable,是否使用事务隔离级别中的可序列化,默认false
- acquireTriggersWithinLock,触发事务前是否需要拥有锁,默认true
- lockHandler.class,用于管理数据库中相关锁机制的类名,默认null
3.2 常用属性
对于quartz的数据源类型配置就比较重要了,如果想要定时任务存储在数据库中以保证持久化,就需要对数据源进行相应的配置。
#持久化方式配置 使用jkdbc存储在mysql数据库
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
#持久化方式配置数据驱动,mysql数据库
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#分布式部署
org.quartz.jobStore.isClustered = true
#分布式节点有效性检查时间间隔
org.quartz.jobStore.clusterCheckinInterval = 10000
# quartz相关数据表前缀名
org.quartz.jobStore.tablePrefix = quartz_
# JobDataMaps内容是否以key-value形式存储
org.quartz.jobStore.useProperties = false
3. 线程池相关配置
quartz框架配置文件中线程池相关的属性前缀为org.quartz.threadPool.。
3.1 具体属性名称
- class,线程池的实现类,一般默认使用
org.quartz.simpl.SimpleThreadPool实例 - threadCount,线程池中的线程数量,默认10
- threadPriority,线程的优先级,默认5
- makethreadsdaemons,是否设置为守护线程,默认false
- threadsInheritContextClassLoaderOfInitializingThread,加载任务代码的ClassLoader是否从外部继承,默认true
- 配置自动加载数据库中的任务信息
- threadsinheritgroupofinitializingthread,默认false
- threadnameprefix,线程默认的前缀,默认Worker
3.2 常用属性
quartz使用配置文件时,配置了默认值,如果有需要,可以改成合适的属性值。
#线程池实现类
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
#执行最大并发线程数量
org.quartz.threadPool.threadCount = 20
#线程优先级
org.quartz.threadPool.threadPriority = 5
#配置是否启动自动加载数据库内的定时任务
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
4. 监听器配置
quartz中的监听器使用较少,且其相关的配置也比较少
监听器相关属性前缀(prefix ):org.quartz.triggerListener.NAME.
- class,全局触发器监听器实现类,默认null