mysql动态管理任务
先来建立一个定时任务表并插入需要的定时任务记录
/* Navicat Premium Data Transfer Source Server : localhost Source Server Type : MySQL Source Server Version : 50722 Source Host : localhost:3306 Source Schema : sprin_security Target Server Type : MySQL Target Server Version : 50722 File Encoding : 65001 Date: 07/03/2022 16:52:20 */ SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for spring_scheduled_cron -- ---------------------------- DROP TABLE IF EXISTS `spring_scheduled_cron`; CREATE TABLE `spring_scheduled_cron` ( `cron_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id', `cron_expression` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'cron表达式', `task_explain` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '任务描述', `status` tinyint(4) NOT NULL DEFAULT 1 COMMENT '状态,1:正常;2:停用', PRIMARY KEY (`cron_id`) USING BTREE, UNIQUE INDEX `cron_key`(`cron_key`) USING BTREE, UNIQUE INDEX `cron_key_unique_idx`(`cron_key`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '定时任务表' ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of spring_scheduled_cron -- ---------------------------- INSERT INTO `spring_scheduled_cron` VALUES (1, '*/5 * * * * ?', '定时任务描述', 1); SET FOREIGN_KEY_CHECKS = 1;
在项目application.yml中配置好数据源
#application.yml 配置如下: spring: datasource: url: jdbc:mysql://localhost:3306/sprin_security?useSSL=false
username: root
password: 123456
实现SchedulingConfigurer并重写configureTasks方法,注意是否加上@EnableScheduling
我们编写定时任务,注意这里添加的是TriggerTask,目的是循环读取我们在数据库设置好的执行周期,以及执行相关定时任务的内容。具体代码如下:
@Configuration @EnableScheduling public class CompleteScheduleConfig implements SchedulingConfigurer { @Autowired TaskCronMapper taskCronMapper; /** * 执行定时任务. */ @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.addTriggerTask( //1.添加任务内容(Runnable) () -> { System.out.println("执行定时任务: " + LocalDateTime.now().toLocalTime()); System.out.println(taskCronMapper.selectList(null)); }, //2.设置执行周期(Trigger) triggerContext -> { //2.1 从数据库获取执行周期 String cron = taskCronMapper.selectById(1).getCron(); //2.2 合法性校验. if (StringUtils.isEmpty(cron)) { // Omitted Code .. } //2.3 返回执行周期(Date) return new CronTrigger(cron).nextExecutionTime(triggerContext); } ); } }
现在可以查看控制台,发现执行已经出现代码中打印的内容,测试环境上可以直接修改数据库,线上环境则写上一个controller接口即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)