Quartz是一个非常热门的开源任务调度框架,完全由Java编写。可以说它是Java定时任务领域的领导者或参考标准。现在我们来介绍一下Quartz框架。
1.1 Quartz是什么
Quartz是OpenSymphony开源组织在作业调度领域的又一个开源项目。它是一个完全由Java开发的任务日程管理系统,也可以称为"任务进度管理器"。它在预定的时间到达时负责执行或通知其他软件组件。它的功能类似于java.util.Timer,但相比之下,Quartz增加了许多功能。作为一个优秀的开源调度框架,Quartz具有以下特点:
调度功能,支持多种调度方法,能够满足各种常规和特殊需求。
灵活的应用方式,支持多种存储方式来存储调度数据。
支持分布式和集群能力。
1.2 存储方式
下面是RAMJobStore和JDBCJobStore两种存储方式的对比:
根据前面的介绍,要实现分布式集群,必须使用JDBCJobStore,并且需要依赖MySQL数据库。你可以下载数据库初始化表的SQL文件:tables。下面是表的描述说明:
2、Spring Boot整合示例
在Spring Boot中,将Quartz框架整合进来非常简单。在这个示例中,我们将演示如何配置Quartz框架的集群模式,因此我们将使用JDBCJobStore作为存储方式。下面是相关的依赖:
在创建任务之前,我们需要先执行上述的SQL语句。这里的表可以与业务数据库在同一个库中,也可以单独放在一个数据库中。如果选择单独建库建表,那么业务服务就会涉及到多数据源,需要重新封装数据源连接。下面是多数据源的配置示例:
@Configuration
public class DataSourceConfiguration {
/**
* 创建 user 数据源的配置对象
*/
@Primary
@Bean(name = "userDataSourceProperties")
@ConfigurationProperties(prefix = "spring.datasource.user") // 读取 spring.datasource.user 配置到 DataSourceProperties 对象
public DataSourceProperties userDataSourceProperties() {
return new DataSourceProperties();
}
/**
* 创建 user 数据源
*/
@Primary
@Bean(name = "userDataSource")
@ConfigurationProperties(prefix = "spring.datasource.user.hikari") //读取spring.datasource.user 配置到 HikariDataSource 对象
public DataSource userDataSource() {
// 获得DataSourceProperties 对象
DataSourceProperties properties = this.userDataSourceProperties();
// 创建HikariDataSource 对象
return createHikariDataSource(properties);
}
/**
* 创建 quartz 数据源的配置对象
*/
@Bean(name = "quartzDataSourceProperties")
@ConfigurationProperties(prefix = "spring.datasource.quartz") // 读取 spring.datasource.quartz 配置到 DataSourceProperties 对象
public DataSourceProperties quartzDataSourceProperties() {
return new DataSourceProperties();
}
/**
* 创建 quartz 数据源
*/
@Bean(name = "quartzDataSource")
@ConfigurationProperties(prefix = "spring.datasource.quartz.hikari")
@QuartzDataSource
public DataSource quartzDataSource() {
// 获得DataSourceProperties 对象
DataSourceProperties properties = this.quartzDataSourceProperties();
// 创建HikariDataSource 对象
return createHikariDataSource(properties);
}
private static HikariDataSource createHikariDataSource(DataSourceProperties properties) {
// 创建HikariDataSource 对象
HikariDataSource dataSource = properties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
// 设置线程池名
if (StringUtils.hasText(properties.getName())) {
dataSource.setPoolName(properties.getName());
}
return dataSource;
}
}
3、实现原理
Quartz框架通过调度器Scheduler来进行任务的操作。它可以将任务的JobDetail和触发器Trigger添加到任务池中,也可以删除任务或停止任务。调度器将这些任务和触发器存放在一个JobStore中,JobStore可以是内存形式的,也可以是持久化形式的。当然,也可以自定义扩展成独立的服务。
Quartz内部通过一个调度线程QuartzSchedulerThread不断从JobStore中找出下次需要执行的任务,并将这些任务封装后放入一个线程池ThreadPool中运行。下图展示了组件的结构:
以上就是我今天的分享啦,希望对你有帮助哦。如果你也喜欢我今天的分享的话,那不如就把这篇文章分享给你的朋友们吧!
联系客服