task-reminder/src/main/java/com/zeodao/reminder/scheduler/DynamicTaskScheduler.java
2025-05-28 10:10:37 +08:00

167 lines
5.9 KiB
Java

package com.zeodao.reminder.scheduler;
import com.zeodao.reminder.config.TaskReminderConfig;
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 TaskScheduler taskScheduler;
private final Map<String, ScheduledFuture<?>> scheduledTasks = new HashMap<>();
@PostConstruct
public void initScheduledTasks() {
logger.info("=== 初始化动态定时任务 ===");
for (TaskReminderConfig.Group group : taskReminderConfig.getEnabledGroups()) {
createSchedulesForGroup(group);
}
logger.info("=== 动态定时任务初始化完成,共创建 {} 个任务 ===", scheduledTasks.size());
}
/**
* 为指定群组创建定时任务
*/
private void createSchedulesForGroup(TaskReminderConfig.Group group) {
logger.info("为群组 {} 创建定时任务", group.getName());
for (Map.Entry<String, TaskReminderConfig.Schedule> entry : group.getSchedules().entrySet()) {
String scheduleType = entry.getKey();
TaskReminderConfig.Schedule schedule = entry.getValue();
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<String, ScheduledFuture<?>> 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.getEnabledGroups().size()).append("\n\n");
info.append("=== 群组配置详情 ===\n");
for (TaskReminderConfig.Group group : taskReminderConfig.getEnabledGroups()) {
info.append("群组: ").append(group.getName()).append(" (").append(group.getId()).append(")\n");
info.append("任务系统: ").append(group.getTaskSystem()).append("\n");
info.append("定时任务:\n");
for (Map.Entry<String, TaskReminderConfig.Schedule> entry : group.getSchedules().entrySet()) {
String scheduleType = entry.getKey();
TaskReminderConfig.Schedule schedule = entry.getValue();
String taskKey = group.getId() + "-" + scheduleType;
ScheduledFuture<?> future = scheduledTasks.get(taskKey);
String status = (future != null && !future.isCancelled()) ? "运行中" : "已停止";
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();
}
}