SpringBoot + mybatis-plus 结合数据库动态执行定时任务
1.添加依赖
<properties>
<java.version>1.8</java.version>
<mybatis-generator.version>1.3.7</mybatis-generator.version>
<mysql-connector.version>8.0.15</mysql-connector.version>
<mybatisplus.version>3.3.0</mybatisplus.version>
<druid.version>1.1.20</druid.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- MyBatis 生成器 -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>${mybatis-generator.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>${mybatisplus.version}</version>
</dependency>
<!--mybatis-plus 需要 freemarker依赖生成 mapper.xml-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<!-- druid连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatisplus.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.10</version>
</dependency>
</dependencies>
2.添加数据库记录
DROP DATABASE IF EXISTS `localhost`;
CREATE DATABASE `localhost`;
USE `localhost`;
DROP TABLE IF EXISTS `schedule_setting`;
CREATE TABLE `schedule_setting` (
`id` varchar(30),
`cron` varchar(30)
);
INSERT INTO `schedule_setting` VALUES ('1', '0/5 * * * * ?');
3.环境配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/localhost?useSSL=false&serverTimezone=Hongkong&allowPublicKeyRetrieval=true
username: root
password: root
mybatis-plus:
mapper-locations: classpath:/mapper/**/*.xml #指定mapper.xml路径
global-config:
db-config:
id-type: auto #全局默认主键类型设置为自增
configuration:
auto-mapping-behavior: partial #只对非嵌套的 resultMap 进行自动映射
map-underscore-to-camel-case: true #开启自动驼峰命名规则映射
cache-enabled: false #禁用缓存
4.创建定时任务(主要核心代码,其他实现)
@Service
public class ScheduleConfigServiceImpl extends ServiceImpl<ScheduleConfigMapper, ScheduleConfig> implements ScheduleConfigService, SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
scheduledTaskRegistrar.addTriggerTask(
//1.任务要执行的内容(Runnable)
() -> System.out.println("执行定时任务逻辑: " + LocalDateTime.now().toLocalTime()),
//2.设置执行周期(Trigger)
triggerContext -> {
//2.1 从数据库获取执行周期
ScheduleConfig schedule = list().get(0);
String cron = schedule.getCron();
System.out.println("cron" + schedule.getCron());
//2.2 合法性校验.
if (StringUtils.isEmpty(cron)) {
System.out.println("=====表达式为空====");
}
//2.3 返回执行周期(Date)
return new CronTrigger(cron).nextExecutionTime(triggerContext);
}
);
}