Files
x_admin/server/core/corn.go
T
2025-12-21 18:18:26 +08:00

81 lines
1.9 KiB
Go

package core
import (
"fmt"
"sync"
"github.com/robfig/cron/v3"
)
// CronManager 任务管理器
type CronManager struct {
cron *cron.Cron
taskIDs map[string]cron.EntryID // 通过字符串ID映射到cron的内部任务ID
mutex sync.RWMutex
}
// NewTaskManager 创建一个新的任务管理器
func NewCronManager() *CronManager {
return &CronManager{
cron: cron.New(cron.WithSeconds()), // 启用秒级别的调度
taskIDs: make(map[string]cron.EntryID),
}
}
// RemoveTask 删除任务
func (tm *CronManager) RemoveTask(taskID string) {
tm.mutex.Lock()
defer tm.mutex.Unlock()
if id, exists := tm.taskIDs[taskID]; exists {
tm.cron.Remove(id)
delete(tm.taskIDs, taskID)
fmt.Printf("任务 '%s' 已移除\n", taskID)
} else {
fmt.Printf("任务 '%s' 不存在\n", taskID)
}
}
// AddTask 添加、更新任务
func (tm *CronManager) AddTask(taskID, spec string, cmd func()) error {
tm.mutex.Lock()
defer tm.mutex.Unlock()
// 如果任务已存在,先移除
if id, exists := tm.taskIDs[taskID]; exists {
tm.cron.Remove(id)
}
// 添加新任务
id, err := tm.cron.AddFunc(spec, cmd)
if err != nil {
return fmt.Errorf("添加任务失败: %w", err)
}
tm.taskIDs[taskID] = id
fmt.Printf("任务 '%s' 已添加/更新\n", taskID)
return nil
}
// 批量添加、更新任务,不存在的任务会添加,存在的任务会更新
// func (tm *CronManager) AddTasks(tasks []*TaskInfo) error {
// for _, task := range tasks {
// if task.TaskId == "" || task.CronExpr == "" || task.TaskFunc == nil {
// return fmt.Errorf("任务ID、Cron表达式或任务函数不能为空")
// }
// if err := tm.AddTask(task.TaskId, task.CronExpr, task.TaskFunc); err != nil {
// return err
// }
// }
// return nil
// }
// Start 启动任务调度器
func (tm *CronManager) Start() {
tm.cron.Start()
}
// Stop 停止任务调度器
func (tm *CronManager) Stop() {
tm.cron.Stop()
}