0

0

Spring Boot整合Quartz的分布式定时任务指南

看不見的法師

看不見的法師

发布时间:2025-07-10 20:22:02

|

665人浏览过

|

来源于php中文网

原创

spring boot整合quartz实现分布式定时任务,关键在于将quartz元数据存储在共享数据库并配置集群参数。1. 引入spring-boot-starter-quartz、spring-boot-starter-jdbc及数据库依赖;2. 配置数据源连接数据库,如h2、mysql或postgresql;3. 设置quartz属性启用jdbc存储和集群模式,确保实例名相同、id唯一;4. 创建job类并配置trigger定义执行周期;5. 启动多个应用实例连接同一数据库实现集群;6. quartz通过悲观锁和事务保证任务不重复执行;7. 使用scheduler接口动态添加、修改或删除任务;8. 通过增加线程池大小或使用注解处理并发问题;9. 可借助管理界面或自定义程序监控任务状态与执行历史。

Spring Boot整合Quartz的分布式定时任务指南

Spring Boot整合Quartz实现分布式定时任务,核心在于将Quartz的元数据存储在共享的数据库中,并合理配置集群参数,以确保任务在集群环境中正确执行,避免重复触发。

Spring Boot整合Quartz的分布式定时任务指南

解决方案

  1. 引入依赖:

    首先,在pom.xml文件中引入Spring Boot Starter Quartz依赖:

    Spring Boot整合Quartz的分布式定时任务指南
    
        org.springframework.boot
        spring-boot-starter-quartz
    
    
        org.springframework.boot
        spring-boot-starter-jdbc
    
    
        com.h2database
        h2
        runtime
    

    这里我加了个H2数据库,方便本地测试,生产环境记得换成MySQL或者PostgreSQL。

  2. 配置数据源:

    Spring Boot整合Quartz的分布式定时任务指南

    配置Spring Boot的数据源,Quartz需要使用数据库来存储任务和触发器的信息。在application.propertiesapplication.yml中配置:

    spring.datasource.url=jdbc:h2:mem:quartzdb
    spring.datasource.driverClassName=org.h2.Driver
    spring.datasource.username=sa
    spring.datasource.password=
    spring.jpa.hibernate.ddl-auto=update

    如果用MySQL,配置类似下面这样:

    spring.datasource.url=jdbc:mysql://localhost:3306/quartzdb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
    spring.datasource.username=root
    spring.datasource.password=your_password

    记得创建对应的数据库和用户。

  3. 配置Quartz:

    配置Quartz的集群属性。在application.propertiesapplication.yml中添加:

    spring.quartz.job-store-type=jdbc
    spring.quartz.properties.org.quartz.scheduler.instanceName=MyClusteredScheduler
    spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO
    spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
    spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
    spring.quartz.properties.org.quartz.jobStore.dataSource=dataSource
    spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_
    spring.quartz.properties.org.quartz.jobStore.isClustered=true
    spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
    spring.quartz.properties.org.quartz.threadPool.threadCount=10
    spring.quartz.properties.org.quartz.threadPool.threadPriority=5
    spring.quartz.properties.org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread=true
    • spring.quartz.job-store-type=jdbc: 指定使用JDBC存储任务信息。
    • org.quartz.scheduler.instanceName: 设置调度器的实例名称,集群中每个节点的实例名应该相同。
    • org.quartz.scheduler.instanceId=AUTO: 设置实例ID为自动生成,也可以手动指定,但必须保证唯一。
    • org.quartz.jobStore.isClustered=true: 启用集群模式。
    • org.quartz.jobStore.tablePrefix=QRTZ_: 指定Quartz表的前缀,默认是QRTZ_
  4. 创建Job和Trigger:

    BGremover
    BGremover

    VanceAI推出的图片背景移除工具

    下载

    创建一个Job,实现org.quartz.Job接口:

    @Component
    public class SampleJob implements Job {
    
        private static final Logger logger = LoggerFactory.getLogger(SampleJob.class);
    
        @Override
        public void execute(JobExecutionContext context) throws JobExecutionException {
            logger.info("Sample Job triggered - " + new Date());
        }
    }

    然后,创建一个配置类来定义Trigger:

    @Configuration
    public class QuartzConfig {
    
        @Bean
        public JobDetail sampleJobDetail() {
            return JobBuilder.newJob(SampleJob.class)
                    .withIdentity("sampleJob", "group1")
                    .storeDurably()
                    .build();
        }
    
        @Bean
        public Trigger sampleJobTrigger() {
            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/10 * * * * ?"); // 每10秒执行一次
            return TriggerBuilder.newTrigger()
                    .forJob(sampleJobDetail())
                    .withIdentity("sampleTrigger", "group1")
                    .withSchedule(scheduleBuilder)
                    .build();
        }
    }

    这里我用Cron表达式定义了每10秒执行一次。你可以根据实际需要调整。

  5. 启动多个实例:

    将你的Spring Boot应用打包,然后启动多个实例。确保这些实例都连接到同一个数据库。Quartz会自动处理任务的调度,避免重复执行。

如何确保Quartz集群环境下的任务不重复执行?

Quartz通过悲观锁和数据库事务来保证任务在集群中只被一个节点执行。当一个节点尝试获取任务时,它会在数据库中锁定该任务,防止其他节点同时获取。任务执行完毕后,锁会被释放。如果某个节点在执行任务的过程中崩溃,锁会超时释放,允许其他节点接管任务。

如何监控和管理Quartz集群中的任务?

可以使用Quartz提供的管理界面(Quartz Enterprise Scheduler)或者编写自定义的监控程序来监控和管理任务。监控内容包括:任务的状态、执行历史、下次执行时间等。管理操作包括:暂停、恢复、删除任务等。

Spring Boot整合Quartz时,如何处理任务的并发问题?

Quartz默认是单线程执行Job,如果Job执行时间较长,可能会阻塞其他任务的执行。可以通过配置org.quartz.threadPool.threadCount属性来增加线程池的大小,提高并发处理能力。另外,还可以考虑使用@DisallowConcurrentExecution注解来禁止同一个Job的并发执行。

如何动态添加、修改和删除Quartz定时任务?

可以通过Scheduler接口提供的方法来实现动态管理任务。例如,addJob()方法可以添加新的任务,rescheduleJob()方法可以修改任务的触发器,deleteJob()方法可以删除任务。在Spring Boot中,可以通过QuartzAutoConfiguration自动配置的Scheduler实例来操作。

@Autowired
private Scheduler scheduler;

public void addJob(JobDetail jobDetail, Trigger trigger) throws SchedulerException {
    scheduler.scheduleJob(jobDetail, trigger);
}

public void rescheduleJob(TriggerKey triggerKey, Trigger newTrigger) throws SchedulerException {
    scheduler.rescheduleJob(triggerKey, newTrigger);
}

public void deleteJob(JobKey jobKey) throws SchedulerException {
    scheduler.deleteJob(jobKey);
}

当然,别忘了处理异常,比如任务已经存在的情况。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

668

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

247

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

281

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

516

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

256

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

387

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

533

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

605

2023.08.14

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
成为PHP架构师-自制PHP框架
成为PHP架构师-自制PHP框架

共28课时 | 2.5万人学习

极致CMS零基础建站教学视频
极致CMS零基础建站教学视频

共62课时 | 5.5万人学习

WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号