项目依赖
首先,您需要在项目中添加Hutool库的依赖。可以在pom.xml
中添加以下内容:
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.25</version>
</dependency>
在实现动态定时任务之前,假设我们有一个名为Cron
的实体类,包含以下字段:
id
:IDcronExpression
:Cron表达式
@Data
public class Cron {
private Long id;
private String cronExpression;
// 其他字段
}
接下来,假定一个Mapper接口,用于从数据库中获取定时任务配置:
public interface CronMapper {
List<Cron> list();
}
服务层
在服务层中,实现动态定时任务的创建、更新和管理。首先,创建一个CronService
类:
package com.test.cron;
import cn.hutool.cron.CronUtil;
import cn.hutool.cron.task.Task;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 定时任务服务类
*/
@Service
public class CronService {
@Resource
private CronMapper cronMapper;
private final Map<String, Cron> cronTaskMap = new HashMap<>();
@PostConstruct
public void initCronTasks() {
List<Cron> cronList = cronMapper.list();
for (Cron cron : cronList) {
String taskId = String.valueOf(cron.getId());
String cronExpression = cron.getCronExpression();
cronTaskMap.put(taskId, cron);
// 创建并注册定时任务
CronUtil.schedule(taskId, cronExpression, new Task() {
@Override
public void execute() {
// 从cronTaskMap中获取对应的Cron实体类
Cron taskCron = cronTaskMap.get(taskId);
if (taskCron != null) {
executeTask(taskCron);
}
}
});
}
// 秒级别定时任务
CronUtil.setMatchSecond(true);
// 启动定时任务调度器
CronUtil.start();
}
public void updateCronTask(Cron updatedCron) {
String taskId = String.valueOf(cron.getId());
String newCronExpression = updatedCron.getCronExpression();
cronTaskMap.put(taskId, updatedCron);
// 取消旧的定时任务
CronUtil.remove(taskId);
// 重新创建并注册新的定时任务
CronUtil.schedule(taskId, newCronExpression, new Task() {
@Override
public void execute() {
// 从cronTaskMap中获取对应的Cron实体类
Cron taskCron = cronTaskMap.get(taskId);
if (taskCron != null) {
executeTask(taskCron);
}
}
});
}
private void executeTask(Cron cron) {
// 这里是你需要执行的任务逻辑
System.out.println("执行任务: " + cron.getId());
// 在这里可以使用传入的cron实体类进行进一步的操作
}
}
初始化定时任务
在initCronTasks
方法中,我们从数据库中读取所有定时任务配置,然后为每个任务创建并注册定时任务:
@PostConstruct
public void initCronTasks() {
List<Cron> cronList = cronMapper.list();
for (Cron cron : cronList) {
String taskId = cron.getId();
String cronExpression = cron.getCronExpression();
cronTaskMap.put(taskId, cron);
// 创建并注册定时任务
CronUtil.schedule(taskId, cronExpression, new Task() {
@Override
public void execute() {
// 从cronTaskMap中获取对应的Cron实体类
Cron taskCron = cronTaskMap.get(taskId);
if (taskCron != null) {
executeTask(taskCron);
}
}
});
}
// 启动定时任务调度器
CronUtil.start();
}
更新定时任务
当需要更新定时任务时,可以调用updateCronTask
方法:
public void updateCronTask(Cron updatedCron) {
String taskId = updatedCron.getId();
String newCronExpression = updatedCron.getCronExpression();
cronTaskMap.put(taskId, updatedCron);
// 取消旧的定时任务
CronUtil.remove(taskId);
// 重新创建并注册新的定时任务
CronUtil.schedule(taskId, newCronExpression, new Task() {
@Override
public void execute() {
// 从cronTaskMap中获取对应的Cron实体类
Cron taskCron = cronTaskMap.get(taskId);
if (taskCron != null) {
executeTask(taskCron);
}
}
});
}
执行任务
在executeTask
方法中,我们定义了需要执行的任务逻辑:
private void executeTask(Cron cron) {
// 这里是你需要执行的任务逻辑
System.out.println("执行任务: " + cron.getId());
}
标签:Cron,taskCron,Hutool,cron,taskId,定时,动态,cronTaskMap
From: https://blog.csdn.net/Nicov_/article/details/140294872