Springboot 1.x 配置动态计划任务(自带的 Schedule)

已通过实际测试有效:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;

@Configuration
@EnableScheduling // 或者在启动类中加这个注解,这样无需每个任务类都加
public class MQScheduler implements SchedulingConfigurer {
    private static final Logger logger = LoggerFactory.getLogger(MQScheduler.class);

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.addTriggerTask(                
                () -> doMyWork(),  // 想要做什么
                    triggerContext -> {                    
                    String cron = "0 0/5 * * * ?"; // 从数据库读取 Cron 表达式
                    return new CronTrigger(cron).nextExecutionTime(triggerContext);
                });
    }

    private void doMyWork() {
        // ... 
        logger.info("读取到的MQ消息:{}", "啊,大海啊,你全是水");
    }

}

 

 

 

 

### 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、付费专栏及课程。

余额充值