package com.example.taskscheduler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@Service
public class TaskSchedulerService {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
// Redis 存储任务的前缀
private static final String TASK_KEY = "tasks";
// 定期检查任务的时间间隔(每 1 分钟检查一次)
@Scheduled(fixedRate = 60000)
public void checkTasks() {
redisTemplate.opsForHash().keys(TASK_KEY).forEach(key -> {
String keyStr = key.toString();
// 只处理以 ":time" 结尾的键
if (keyStr.endsWith(":time")) {
String taskId = keyStr.substring(0, keyStr.length() - 5); // 提取 taskId
String taskTimeStr = (String) redisTemplate.opsForHash().get(TASK_KEY, taskId + ":time");
if (taskTimeStr != null) {
// 解析用户设定的时间,支持时分秒
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime taskTime = LocalDateTime.parse(taskTimeStr, formatter);
LocalDateTime now = LocalDateTime.now();
// 如果任务时间已经到达或超过当前时间,立即执行任务
if (!taskTime.isAfter(now)) {
executeTask(taskId);
} else {
// 如果任务时间尚未到达,跳过任务
System.out.println("Task " + taskId + " scheduled for " + taskTime + " is not yet due.");
}
}
}
});
}
// 执行任务的逻辑
private void executeTask(String taskId) {
System.out.println("Executing task with ID: " + taskId + " at " + LocalDateTime.now());
// 这里可以加入实际的任务执行代码
}
// 存储任务的时间到 Redis
public void saveTaskTime(String taskId, String taskTime) {
redisTemplate.opsForHash().put(TASK_KEY, taskId + ":time", taskTime);
}
// 修改已有任务的时间
public void updateTaskTime(String taskId, String newTaskTime) {
// 检查任务是否存在
if (redisTemplate.opsForHash().hasKey(TASK_KEY, taskId + ":time")) {
redisTemplate.opsForHash().put(TASK_KEY, taskId + ":time", newTaskTime);
System.out.println("Task " + taskId + " time updated to: " + newTaskTime);
} else {
System.out.println("Task " + taskId + " does not exist.");
}
}
}