kra/pkg/timer/timer.go

82 lines
1.4 KiB
Go

package timer
import (
"sync"
"github.com/robfig/cron/v3"
)
// Timer 定时任务管理器
type Timer struct {
cron *cron.Cron
tasks map[string]cron.EntryID
mu sync.RWMutex
}
// NewTimer 创建定时任务管理器
func NewTimer() *Timer {
return &Timer{
cron: cron.New(cron.WithSeconds()),
tasks: make(map[string]cron.EntryID),
}
}
// Start 启动定时任务
func (t *Timer) Start() {
t.cron.Start()
}
// Stop 停止定时任务
func (t *Timer) Stop() {
t.cron.Stop()
}
// AddTask 添加定时任务
func (t *Timer) AddTask(name, spec string, cmd func()) error {
t.mu.Lock()
defer t.mu.Unlock()
// 如果任务已存在,先删除
if id, ok := t.tasks[name]; ok {
t.cron.Remove(id)
}
id, err := t.cron.AddFunc(spec, cmd)
if err != nil {
return err
}
t.tasks[name] = id
return nil
}
// RemoveTask 删除定时任务
func (t *Timer) RemoveTask(name string) {
t.mu.Lock()
defer t.mu.Unlock()
if id, ok := t.tasks[name]; ok {
t.cron.Remove(id)
delete(t.tasks, name)
}
}
// HasTask 检查任务是否存在
func (t *Timer) HasTask(name string) bool {
t.mu.RLock()
defer t.mu.RUnlock()
_, ok := t.tasks[name]
return ok
}
// ListTasks 列出所有任务
func (t *Timer) ListTasks() []string {
t.mu.RLock()
defer t.mu.RUnlock()
names := make([]string, 0, len(t.tasks))
for name := range t.tasks {
names = append(names, name)
}
return names
}