首先需要添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>

然后在'application.properties'文件中添加以下配置:

# 数据源配置
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456

# MyBatis配置
mybatis.mapper-locations=classpath:mapper/*.xml

# Quartz配置
spring.quartz.job-store-type=jdbc
spring.quartz.jdbc.initialize-schema=always

接下来在'src/main/java'目录下创建'com.example.demo'包,然后在该包下创建以下类:

'JobMapper.java'

package com.example.demo;

import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface JobMapper {
    List<Job> getAllJobs();
}

'Job.java'

package com.example.demo;

public class Job {
    private String name;
    private String group;
    private String cronExpression;
    private String className;

    // 省略getter和setter方法

    @Override
    public String toString() {
        return 'Job{' +
                "name='" + name + "'"
                + ", group='" + group + "'"
                + ", cronExpression='" + cronExpression + "'"
                + ", className='" + className + "'"
                + '}';
    }
}

'JobService.java'

package com.example.demo;

import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class JobService {
    @Autowired
    private SchedulerFactoryBean schedulerFactoryBean;

    @Autowired
    private JobMapper jobMapper;

    public void initJobs() throws SchedulerException {
        // 获取所有的Job
        List<Job> jobs = jobMapper.getAllJobs();

        // 获取Scheduler
        Scheduler scheduler = schedulerFactoryBean.getScheduler();

        // 遍历Job列表,逐个添加到Scheduler中
        for (Job job : jobs) {
            JobDetail jobDetail = JobBuilder.newJob(getClass(job.getClassName())).withIdentity(job.getName(), job.getGroup()).build();

            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression());

            CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(job.getName(), job.getGroup()).withSchedule(scheduleBuilder).build();

            scheduler.scheduleJob(jobDetail, cronTrigger);
        }
    }

    /**
     * 根据类名获取对应的Class对象
     */
    private Class<? extends Job> getClass(String className) {
        try {
            return (Class<? extends Job>) Class.forName(className);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }
}

'QuartzJob1.java'

package com.example.demo;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class QuartzJob1 implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println('QuartzJob1 executed.');
    }
}

'QuartzJob2.java'

package com.example.demo;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class QuartzJob2 implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println('QuartzJob2 executed.');
    }
}

最后,在'src/main/resources'目录下创建'mapper/JobMapper.xml'文件,用于定义查询所有Job的SQL语句:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.example.demo.JobMapper">
    <select id="getAllJobs" resultType="com.example.demo.Job">
        SELECT * FROM jobs
    </select>
</mapper>

现在,我们已经完成了所有的代码编写,可以运行程序进行测试了。

在'test'数据库中创建'jobs'表,并添加两条记录:

CREATE TABLE jobs (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50),
    group_name VARCHAR(50),
    cron_expression VARCHAR(50),
    class_name VARCHAR(50)
);

INSERT INTO jobs (name, group_name, cron_expression, class_name) VALUES ('job1', 'group1', '0/5 * * * * ?', 'com.example.demo.QuartzJob1');
INSERT INTO jobs (name, group_name, cron_expression, class_name) VALUES ('job2', 'group2', '0/10 * * * * ?', 'com.example.demo.QuartzJob2');

然后,在'DemoApplication.java'中添加以下代码:

@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) throws SchedulerException {
        SpringApplication.run(DemoApplication.class, args);

        // 初始化定时任务
        JobService jobService = ApplicationContextProvider.getBean(JobService.class);
        jobService.initJobs();
    }
}

启动应用程序,控制台输出如下信息:

QuartzJob1 executed.
QuartzJob2 executed.
QuartzJob1 executed.
QuartzJob1 executed.
QuartzJob1 executed.
QuartzJob2 executed.
QuartzJob1 executed.
QuartzJob1 executed.
QuartzJob1 executed.
QuartzJob2 executed.

这证明我们成功地从数据库中动态初始化了定时任务,并且定时任务能够正常执行。


原文地址: https://www.cveoy.top/t/topic/mOrf 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录