SpringBoot与MyBatis实现动态初始化定时任务
首先需要添加以下依赖:
<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 著作权归作者所有。请勿转载和采集!