Quartz自定义配置详解(一)——实现自定义配置

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

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

  1. 默认配置

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

1.1 控制台输出

image-20211030224242103

1.2 内容含义

1
2
3
4
5
6
7
8
9
java复制代码//启动
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读取配置内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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的属性进行初始化,并通过容器管理注入到调度器中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
java复制代码@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内容不生效。

  1. 总结

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

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

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

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%