186 lines
6.4 KiB
Java
186 lines
6.4 KiB
Java
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<String, ScheduledFuture<?>> 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<String, TaskReminderConfig.Schedule> 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<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.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<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);
|
|
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();
|
|
}
|
|
}
|