springBoot2.x设置quartz的overwriteExistingJobs参数

本文解决SpringBoot集成Quartz时,修改任务无法生效的问题。通过设置overwriteExistingJobs参数为true,确保任务更新时,新的配置能正确覆盖原有任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景
springBoot2.x中集成了quartz的自动配置类(QuartzAutoConfiguration),但是springBoot提供的配置属性中并没有提供overwriteExistingJobs这个属性的设置。

导致的问题
假如我们使用quartz自带的数据库对任务进行了持久化且系统并没有提供对任务的界面化操作。当我们需要对任务进行修改时,更改了代码或者配置文件中的信息,如参数、corn表达式等,会发现新的表达式并没有生效(原因是我们没有设置overwriteExistingJobs参数)

解决方案
在quartz自动初始化之后,我们获取SchedulerFactory,设置overwriteExistingJobs参数,然后获得Scheduler,通过Scheduler重新设置所有Trigger.

代码实现

package com.koolyun.eas.account.scheduler.config;

import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;

import javax.annotation.PostConstruct;
import java.util.List;

/**
 * @author bozheng
 * @date 2018/10/10 15:48
 */
@Configuration
@AutoConfigureAfter(QuartzAutoConfiguration.class)
public class QuartzSupportConfig{

    @Autowired(required = false)
    private List<Trigger> triggers ;

    @Autowired
    SchedulerFactoryBean schedulerFactoryBean;

    @PostConstruct
    public void quartzScheduler() throws SchedulerException {
        schedulerFactoryBean.setOverwriteExistingJobs(true);
        if (triggers != null){
            Scheduler scheduler = schedulerFactoryBean.getScheduler();
            for (Trigger trigger : triggers){
                scheduler.rescheduleJob(trigger.getKey(),trigger);
            }
        }
    }

}

转载于:https://my.oschina.net/u/2312080/blog/2245854

### Spring Boot 3.x 中使用 Quartz 和 MySQL 实现动态任务调度 在 Spring Boot 3.x 中实现基于 Quartz 的动态任务调度并结合 MySQL 存储任务数据是一个常见的需求。以下是详细的解决方案: #### 配置依赖项 为了支持 Quartz 调度功能以及与 MySQL 数据库集成,需要引入以下 Maven 或 Gradle 依赖项。 对于 Maven: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> ``` 对于 Gradle: ```gradle implementation 'org.springframework.boot:spring-boot-starter-quartz' implementation 'mysql:mysql-connector-java' ``` --- #### 配置 Quartz 使用 MySQL Quartz 支持通过数据库存储其元数据(如任务定义、触发器等)。为此,需创建相应的表结构并将这些表初始化到 MySQL 数据库中。可以通过运行官方提供的 SQL 文件来完成此操作[^2]。 配置 `application.properties` 或 `application.yml` 来启用 Quartz 并连接至 MySQL 数据源: ```properties # DataSource Configuration spring.datasource.url=jdbc:mysql://localhost:3306/quartz_db?useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=password # Quartz Configuration spring.quartz.job-store-type=jdbc 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.tablePrefix=QRTZ_ spring.quartz.properties.org.quartz.jobStore.isClustered=true spring.quartz.properties.org.quartz.threadPool.threadCount=10 ``` 上述配置指定了 Quartz 将使用 JDBC Job Store,并设置了线程池大小和其他必要属性。 --- #### 创建动态任务管理接口 可以封装一个服务类用于动态添加、修改或删除任务。下面展示了一个简单的例子: ```java import org.quartz.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.quartz.SchedulerFactoryBean; import org.springframework.stereotype.Service; @Service public class DynamicTaskService { @Autowired private Scheduler scheduler; /** * 添加新任务 */ public void addJob(String jobName, String jobGroup, Class<? extends Job> jobClass, Trigger trigger) throws SchedulerException { JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroup).build(); scheduler.scheduleJob(jobDetail, trigger); } /** * 删除现有任务 */ public boolean deleteJob(String jobName, String jobGroup) throws SchedulerException { return scheduler.deleteJob(JobKey.jobKey(jobName, jobGroup)); } /** * 暂停任务 */ public void pauseJob(String jobName, String jobGroup) throws SchedulerException { scheduler.pauseJob(JobKey.jobKey(jobName, jobGroup)); } /** * 恢复任务 */ public void resumeJob(String jobName, String jobGroup) throws SchedulerException { scheduler.resumeJob(JobKey.jobKey(jobName, jobGroup)); } } ``` 该服务提供了基本的任务管理方法,包括新增、暂停、恢复和移除任务等功能。 --- #### 示例:动态添加定时任务 假设有一个自定义任务类如下所示: ```java import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class SampleJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("Sample Job Executed at " + new java.util.Date()); } } ``` 调用 `DynamicTaskService.addJob()` 方法即可动态注册这个任务: ```java Trigger trigger = TriggerBuilder.newTrigger() .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever()) .build(); dynamicTaskService.addJob("sampleJob", "group1", SampleJob.class, trigger); ``` 这会每五秒执行一次指定的任务逻辑。 --- #### 处理常见错误 如果遇到类似于 `Public Key Retrieval is not allowed` 的异常,则可能是由于 MySQL 连接设置不正确引起的。解决办法是在 URL 参数中显式禁用公钥检索功能[^3]: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/quartz_db?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC ``` --- #### 总结 以上介绍了如何在 Spring Boot 3.x 环境下利用 Quartz 和 MySQL 构建动态任务调度系统。整个过程涉及依赖导入、数据库配置、任务管理和具体实现等多个方面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值