阅读 130

Quartz自定义配置详解

学了那么久的quartz框架,都是在基于quartz默认配置的基础上操作的,这次就来学习以下如何自定义配置quartz的相关属性。

1. 默认配置

首先看一下Quartz框架在不进行任何配置,即使用quartz默认配置项时,执行项目。

1.1 控制台输出

image-20211030224242103

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的语句:

image-20211030224635071

在对应的数据库中执行sql语句,生成数据表结构如下:

image-20211030224708837

对应的表含义为:

  • 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 自定义配置启动

数据源开启持久、集群配置后,项目运行输出内容:

image-20211030224744598

如果在springboot的application.yml/properties 文件中配置quartz属性,那么quartz.properties内容不生效。

3. 总结

根据官方提供的sql语句创建定时任务表,并配置quartz的持久化方式,最后在项目执行时就会使用配置的方式来持存储定时任务数据。

数据支持持久化后,数据表中会记录需要执行的任务,这样就算系统出现了故障宕机,在恢复之后耽搁的定时任务也会恢复继续执行。

如果使用了集群配置,多个定时任务服务操作同一个数据库,quartz同样提供了锁等一系列方式来保证分布式数据的准确性。


作者:showsen
链接:https://juejin.cn/post/7024881564220260388


文章分类
后端
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐