64 lines
949 B
Go
64 lines
949 B
Go
package scheduler
|
|
|
|
import (
|
|
"github.com/robfig/cron/v3"
|
|
"sync"
|
|
)
|
|
|
|
var taskList = make(chan *CronTask, 10)
|
|
var taskMap = make(map[string]*CronTask)
|
|
var lock sync.Mutex
|
|
var c = newWithSeconds()
|
|
|
|
type CronTask struct {
|
|
Name string
|
|
Spec string
|
|
Fn func()
|
|
}
|
|
|
|
func AddCronTask(task *CronTask) bool {
|
|
lock.Lock()
|
|
defer lock.Unlock()
|
|
|
|
if task == nil {
|
|
return false
|
|
}
|
|
|
|
_, exist := taskMap[task.Name]
|
|
if exist {
|
|
return false
|
|
}
|
|
|
|
taskList <- task
|
|
|
|
return true
|
|
}
|
|
|
|
func CronRun() {
|
|
go c.Start()
|
|
|
|
//监听任务列表
|
|
go func() {
|
|
defer close(taskList)
|
|
for {
|
|
select {
|
|
case task, ok := <-taskList:
|
|
{
|
|
if ok {
|
|
_, err := c.AddFunc(task.Spec, task.Fn)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}()
|
|
}
|
|
|
|
func newWithSeconds() *cron.Cron {
|
|
return cron.New(cron.WithParser(cron.NewParser(
|
|
cron.SecondOptional | cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow | cron.Descriptor,
|
|
)))
|
|
}
|