任意时间定时任务+借助redis

发布于:2024-12-08 ⋅ 阅读:(116) ⋅ 点赞:(0)

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.");
        }
    }
}