mirror of https://github.com/ouqiang/gocron
77 lines
1.5 KiB
Go
77 lines
1.5 KiB
Go
|
package utils
|
|||
|
|
|||
|
import (
|
|||
|
"github.com/robfig/cron"
|
|||
|
"errors"
|
|||
|
)
|
|||
|
|
|||
|
// todo map并发访问加锁
|
|||
|
|
|||
|
var DefaultCronTask = &CronTask{
|
|||
|
make(map[string]*cron.Cron),
|
|||
|
}
|
|||
|
|
|||
|
type CronTask struct {
|
|||
|
tasks map[string]*cron.Cron
|
|||
|
}
|
|||
|
|
|||
|
// 新增定时任务,如果name存在,则添加失败
|
|||
|
func(cronTask *CronTask) Add(name string, spec string, cmd func() ) error {
|
|||
|
if name == "" || spec == "" || cmd == nil {
|
|||
|
return errors.New("参数不完整")
|
|||
|
}
|
|||
|
if cronTask.IsExist(name) {
|
|||
|
return errors.New("任务已存在")
|
|||
|
}
|
|||
|
|
|||
|
cronTask.tasks[name] = cron.New()
|
|||
|
err := cronTask.tasks[name].AddFunc(spec, cmd)
|
|||
|
|
|||
|
return err
|
|||
|
}
|
|||
|
|
|||
|
// 任务不存在则新增,任务已存在则替换任务
|
|||
|
func(cronTask *CronTask) addOrReplace(name string, spec string, cmd func() ) error {
|
|||
|
if cronTask.IsExist(name) {
|
|||
|
cronTask.Delete(name)
|
|||
|
}
|
|||
|
|
|||
|
return cronTask.Add(name, spec, cmd)
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
// 判断任务是否存在
|
|||
|
func(cronTask *CronTask) IsExist(name string) bool {
|
|||
|
_, ok := cronTask.tasks[name]
|
|||
|
|
|||
|
return ok
|
|||
|
}
|
|||
|
|
|||
|
// 启动任务
|
|||
|
func(cronTask *CronTask) Start(name string) {
|
|||
|
if cronTask.IsExist(name) {
|
|||
|
cronTask.tasks[name].Start()
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 停止任务
|
|||
|
func(cronTask *CronTask) Stop(name string) {
|
|||
|
if cronTask.IsExist(name) {
|
|||
|
cronTask.tasks[name].Stop()
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 删除任务
|
|||
|
func(cronTask *CronTask) Delete(name string) {
|
|||
|
cronTask.Stop(name)
|
|||
|
cronTask.tasks[name] = nil
|
|||
|
delete(cronTask.tasks, name)
|
|||
|
}
|
|||
|
|
|||
|
// 运行所有任务
|
|||
|
func(cronTask *CronTask) run() {
|
|||
|
for _, cron := range cronTask.tasks {
|
|||
|
// cron内部有开启goroutine,此处不用新建
|
|||
|
cron.Start()
|
|||
|
}
|
|||
|
}
|