package com.zeodao.reminder.scheduler; import com.zeodao.reminder.config.TaskReminderConfig; import com.zeodao.reminder.service.EnabledCheckService; import com.zeodao.reminder.service.TaskReminderService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.TaskScheduler; import org.springframework.scheduling.support.CronTrigger; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ScheduledFuture; /** * 动态任务调度器 * 根据配置文件动态创建定时任务 * * @author Zeodao * @version 2.0.0 */ @Component public class DynamicTaskScheduler { private static final Logger logger = LoggerFactory.getLogger(DynamicTaskScheduler.class); @Autowired private TaskReminderConfig taskReminderConfig; @Autowired private TaskReminderService taskReminderService; @Autowired private EnabledCheckService enabledCheckService; @Autowired private TaskScheduler taskScheduler; private final Map> scheduledTasks = new HashMap<>(); @PostConstruct public void initScheduledTasks() { logger.info("=== 初始化动态定时任务 ==="); for (TaskReminderConfig.Group group : taskReminderConfig.getGroups()) { createSchedulesForGroup(group); } logger.info("=== 动态定时任务初始化完成,共创建 {} 个任务 ===", scheduledTasks.size()); } /** * 为指定群组创建定时任务 */ private void createSchedulesForGroup(TaskReminderConfig.Group group) { logger.info("为群组 {} 创建定时任务", group.getName()); for (Map.Entry entry : group.getSchedules().entrySet()) { String scheduleType = entry.getKey(); TaskReminderConfig.Schedule schedule = entry.getValue(); // 检查该提醒类型是否启用 if (!enabledCheckService.isReminderEnabled(group, scheduleType)) { logger.debug("跳过禁用的提醒类型: {} - {}", group.getName(), scheduleType); continue; } String taskKey = group.getId() + "-" + scheduleType; try { CronTrigger cronTrigger = new CronTrigger(schedule.getTime()); Runnable task = () -> { try { logger.info("=== 执行定时任务: {} - {} ===", group.getName(), scheduleType); taskReminderService.sendReminder(group.getId(), scheduleType); } catch (Exception e) { logger.error("定时任务执行失败: {} - {}", group.getName(), scheduleType, e); } }; ScheduledFuture scheduledFuture = taskScheduler.schedule(task, cronTrigger); scheduledTasks.put(taskKey, scheduledFuture); logger.info("创建定时任务成功: {} - {} ({})", group.getName(), scheduleType, schedule.getTime()); } catch (Exception e) { logger.error("创建定时任务失败: {} - {} ({})", group.getName(), scheduleType, schedule.getTime(), e); } } } /** * 重新加载所有定时任务 */ public void reloadScheduledTasks() { logger.info("=== 重新加载定时任务 ==="); // 取消所有现有任务 cancelAllTasks(); // 重新创建任务 initScheduledTasks(); } /** * 取消所有定时任务 */ private void cancelAllTasks() { logger.info("取消所有现有定时任务"); for (Map.Entry> entry : scheduledTasks.entrySet()) { String taskKey = entry.getKey(); ScheduledFuture future = entry.getValue(); if (future != null && !future.isCancelled()) { future.cancel(false); logger.debug("取消定时任务: {}", taskKey); } } scheduledTasks.clear(); } /** * 获取当前活跃的任务数量 */ public int getActiveTaskCount() { return (int) scheduledTasks.values().stream() .filter(future -> future != null && !future.isCancelled()) .count(); } /** * 获取任务状态信息 */ public String getTaskStatusInfo() { StringBuilder info = new StringBuilder(); info.append("=== 定时任务状态 ===\n"); info.append("总任务数: ").append(scheduledTasks.size()).append("\n"); info.append("活跃任务数: ").append(getActiveTaskCount()).append("\n"); info.append("配置群组数: ").append(taskReminderConfig.getGroups().size()).append("\n\n"); info.append("=== 群组配置详情 ===\n"); for (TaskReminderConfig.Group group : taskReminderConfig.getGroups()) { info.append("群组: ").append(group.getName()).append(" (").append(group.getId()).append(")\n"); info.append("任务系统: ").append(group.getTaskSystem()).append("\n"); info.append("定时任务:\n"); for (Map.Entry entry : group.getSchedules().entrySet()) { String scheduleType = entry.getKey(); TaskReminderConfig.Schedule schedule = entry.getValue(); String taskKey = group.getId() + "-" + scheduleType; ScheduledFuture future = scheduledTasks.get(taskKey); boolean isEnabled = enabledCheckService.isReminderEnabled(group, scheduleType); String status; if (!isEnabled) { status = "已禁用"; } else if (future != null && !future.isCancelled()) { status = "运行中"; } else { status = "已停止"; } info.append(" - ").append(scheduleType).append(": ").append(schedule.getTime()) .append(" (").append(status).append(")\n"); } info.append("\n"); } return info.toString(); } @PreDestroy public void destroy() { logger.info("=== 销毁动态定时任务调度器 ==="); cancelAllTasks(); } }