Quartz自定义配置详解
学了那么久的quartz框架,都是在基于quartz默认配置的基础上操作的,这次就来学习以下如何自定义配置quartz的相关属性。
1. 默认配置
首先看一下Quartz框架在不进行任何配置,即使用quartz默认配置项时,执行项目。
1.1 控制台输出
1.2 内容含义
//启动 Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. NOT STARTED. //还没有开始 Currently in standby mode. //待机状态 Number of jobs executed: 0 //执行任务数 //默认使用SimpleThreadPool线程池 ,线程数量是10 Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. //默认使用RAMJobStore类型,在内存中,不进行持久化,没有开启集群 Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. 复制代码
2.自定义配置
通过默认配置下的quartz信息输出可以看到,quartz默认不支持数据的持久化,且无集群支持;但是在实际项目使用中,为了保证相关数据的准确和定时任务执行稳定,通常会将定时任务的信息持久化到数据库中。
2.1 初始化数据表
在quartz官网下载quartz ,然后解压文件,找到其中的sql文件。quartz2.4.0版本的sql路径为:\quartz-2.4.0-SNAPSHOT\src\org\quartz\impl\jdbcjobstore
找到如下mysql的语句:
在对应的数据库中执行sql语句,生成数据表结构如下:
对应的表含义为:
qrtz_blob_triggers:以blob格式存放自定义trigger信息
qrtz_calendars:记录quartz任务中的日历信息
qrtz_cron_triggers:记录cronTrigger,即cron表达式相关触发器的信息
qrtz_fired_triggers:存储正在触发的定时器的信息,执行完后数据清空
qrtz_job_details:记录每个定时任务详细信息的表
qrtz_locks:分布式处理时多个节点定时任务的锁信息
qrtz_paused_triggers_grps:存储暂停的任务触发器信息
qrtz_scheduler_state:记录调度器状态的表
qrtz_simple_triggers:记录SimpleTrigger,即普通的触发器信息
qrtz_simprop_triggers:存储CalendarIntervalTrigger和DailyTimeIntervalTrigger触发器信息
qrtz_triggers:记录每个触发器详细信息的表
2.2 自定义配置内容
对于quartz框架的配置信息,可以将内容配置在quartz.properties文件中,并通过Properties读取配置内容。
# 调度器实例名称(不配置则使用默认配置:quartzScheduler) org.quartz.scheduler.instanceName = Scheduler # 调度器实例编号自动生成 org.quartz.scheduler.instanceId = AUTO #持久化方式配置 =org.quartz.simpl.RAMJobStore 即存储在内存中 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相关数据表前缀名(默认QRTZ_) org.quartz.jobStore.tablePrefix = quartz_ # JobDataMaps内容是否以key-value形式存储,默认true org.quartz.jobStore.useProperties = false #线程池实现类(不配置则使用默认配置) org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool #执行最大并发线程数量 org.quartz.threadPool.threadCount = 20 #线程优先级 org.quartz.threadPool.threadPriority = 5 #配置是否启动自动加载数据库内的定时任务,默认true org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true 复制代码
2.3 初始化配置并注入
使用quartz.properties文件配置后,还需要将配置的信息应用到定时任务调度器对象中,这就需要在Spring配置类中对quartz的属性进行初始化,并通过容器管理注入到调度器中。
@Configuration public class QuartzConfig { ... @Bean public Properties quartzProperties() throws IOException { PropertiesFactoryBean factoryBean = new PropertiesFactoryBean(); factoryBean.setLocation(new ClassPathResource("/quartz.properties")); // 在quartz.properties中的属性被读取并注入后再初始化对象 factoryBean.afterPropertiesSet(); return factoryBean.getObject(); } //创建调度器工厂对象 @Bean public SchedulerFactoryBean schedulerFactoryBean() throws IOException { SchedulerFactoryBean factoryBean = new SchedulerFactoryBean(); factoryBean.setSchedulerName("Scheduler"); factoryBean.setDataSource(dataSource); //根据配置文件生成内容来配置调度器 factoryBean.setQuartzProperties(quartzProperties()); // 设置触发器 factoryBean.setTriggers(simpleTriggerFactoryBean().getObject()); return factoryBean; } } 复制代码
2.3 自定义配置启动
数据源开启持久、集群配置后,项目运行输出内容:
如果在springboot的application.yml/properties 文件中配置quartz属性,那么quartz.properties内容不生效。
3. 总结
根据官方提供的sql语句创建定时任务表,并配置quartz的持久化方式,最后在项目执行时就会使用配置的方式来持存储定时任务数据。
数据支持持久化后,数据表中会记录需要执行的任务,这样就算系统出现了故障宕机,在恢复之后耽搁的定时任务也会恢复继续执行。
如果使用了集群配置,多个定时任务服务操作同一个数据库,quartz同样提供了锁等一系列方式来保证分布式数据的准确性。
作者:showsen
链接:https://juejin.cn/post/7024881564220260388