打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Quartz框架的分布式集群支持与数据库初始化表说明

Quartz是一个非常热门的开源任务调度框架,完全由Java编写。可以说它是Java定时任务领域的领导者或参考标准。现在我们来介绍一下Quartz框架。

1.1 Quartz是什么

QuartzOpenSymphony开源组织在作业调度领域的又一个开源项目。它是一个完全由Java开发的任务日程管理系统,也可以称为"任务进度管理器"。它在预定的时间到达时负责执行或通知其他软件组件。它的功能类似于java.util.Timer,但相比之下,Quartz增加了许多功能。作为一个优秀的开源调度框架,Quartz具有以下特点:

调度功能,支持多种调度方法,能够满足各种常规和特殊需求。

灵活的应用方式,支持多种存储方式来存储调度数据。

支持分布式和集群能力。

1.2 存储方式

下面是RAMJobStoreJDBCJobStore两种存储方式的对比:

根据前面的介绍,要实现分布式集群,必须使用JDBCJobStore,并且需要依赖MySQL数据库。你可以下载数据库初始化表的SQL文件:tables。下面是表的描述说明:

2Spring 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中运行。下图展示了组件的结构:

以上就是我今天的分享啦,希望对你有帮助哦。如果你也喜欢我今天的分享的话,那不如就把这篇文章分享给你的朋友们吧!

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
只会用 xxl-job?更强大的新一代分布式任务调度框架来了!
分布式定时任务调度框架实践
大数据“分布式调度框架”大集合
定时任务的分布式调度
SpringBoot数据源配置原理
Spring Boot JDBC:加载DataSource过程的源码分析及yml中DataSource的配置
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服