package crontask import ( "errors" "github.com/robfig/cron" "strings" "sync" ) var DefaultCronTask *CronTask type CronMap map[string]*cron.Cron type CronTask struct { sync.RWMutex tasks CronMap } func NewCronTask() *CronTask { return &CronTask{ sync.RWMutex{}, make(CronMap), } } // 新增定时任务,如果name存在,则添加失败 // name 任务名称 // spec crontab时间格式定义 可定义多个时间\n分隔 func (cronTask *CronTask) Add(name string, spec string, cmd cron.FuncJob) (err error) { if name == "" || spec == "" || cmd == nil { return errors.New("参数不完整") } if cronTask.IsExist(name) { return errors.New("任务已存在") } spec = strings.TrimSpace(spec) cronTask.Lock() defer cronTask.Unlock() cronTask.tasks[name] = cron.New() specs := strings.Split(spec, "|||") for _, item := range specs { _, err = cron.Parse(item) if err != nil { return err } } for _, item := range specs { err = cronTask.tasks[name].AddFunc(item, cmd) } cronTask.tasks[name].Start() return err } // 任务不存在则新增,任务已存在则删除后新增 func (cronTask *CronTask) AddOrReplace(name string, spec string, cmd cron.FuncJob) error { if cronTask.IsExist(name) { cronTask.Delete(name) } return cronTask.Add(name, spec, cmd) } // 判断任务是否存在 func (cronTask *CronTask) IsExist(name string) bool { cronTask.RLock() defer cronTask.RUnlock() _, ok := cronTask.tasks[name] return ok } // 停止任务 func (cronTask *CronTask) Stop(name string) { if cronTask.IsExist(name) { cronTask.tasks[name].Stop() } } // 删除任务 func (cronTask *CronTask) Delete(name string) { cronTask.Stop(name) cronTask.Lock() defer cronTask.Unlock() delete(cronTask.tasks, name) }