本篇文章为大家展示了Golang中怎么实现一个cron 定时器,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
crontab.go
package task import ( "sync" "github.com/pkg/errors" cron "github.com/robfig/cron/v3" ) // Crontab crontab manager type Crontab struct { inner *cron.Cron ids map[string]cron.EntryID mutex sync.Mutex } // NewCrontab new crontab func NewCrontab() *Crontab { return &Crontab{ inner: cron.New(), ids: make(map[string]cron.EntryID), } } // IDs ... func (c *Crontab) IDs() []string { c.mutex.Lock() defer c.mutex.Unlock() validIDs := make([]string, 0, len(c.ids)) invalidIDs := make([]string, 0) for sid, eid := range c.ids { if e := c.inner.Entry(eid); e.ID != eid { invalidIDs = append(invalidIDs, sid) continue } validIDs = append(validIDs, sid) } for _, id := range invalidIDs { delete(c.ids, id) } return validIDs } // Start start the crontab engine func (c *Crontab) Start() { c.inner.Start() } // Stop stop the crontab engine func (c *Crontab) Stop() { c.inner.Stop() } // DelByID remove one crontab task func (c *Crontab) DelByID(id string) { c.mutex.Lock() defer c.mutex.Unlock() eid, ok := c.ids[id] if !ok { return } c.inner.Remove(eid) delete(c.ids, id) } // AddByID add one crontab task // id is unique // spec is the crontab expression func (c *Crontab) AddByID(id string, spec string, cmd cron.Job) error { c.mutex.Lock() defer c.mutex.Unlock() if _, ok := c.ids[id]; ok { return errors.Errorf("crontab id exists") } eid, err := c.inner.AddJob(spec, cmd) if err != nil { return err } c.ids[id] = eid return nil } // AddByFunc add function as crontab task func (c *Crontab) AddByFunc(id string, spec string, f func()) error { c.mutex.Lock() defer c.mutex.Unlock() if _, ok := c.ids[id]; ok { return errors.Errorf("crontab id exists") } eid, err := c.inner.AddFunc(spec, f) if err != nil { return err } c.ids[id] = eid return nil } // IsExists check the crontab task whether existed with job id func (c *Crontab) IsExists(jid string) bool { _, exist := c.ids[jid] return exist }
crontab_test.go
package task import ( "fmt" "os" "testing" "time" ) type testTask struct { } func (t *testTask) Run() { fmt.Println("hello world1", time.Now()) } func TestCronTask(t *testing.T) { crontab := NewCrontab() // 实现接口的方式添加定时任务 task := &testTask{} //2m 一次 if err := crontab.AddByID("1", "*/2 * * * ?", task); err != nil { fmt.Printf("error to add crontab task:%s", err) os.Exit(-1) } // 添加函数作为定时任务 taskFunc := func() { fmt.Println("hello world2", time.Now()) } //而 github.com/robfig/cron 也按照操作系统进行判断,默认支持到分钟级别 ,1分钟一次 if err := crontab.AddByFunc("2", "*/1 * * * ?", taskFunc); err != nil { fmt.Printf("error to add crontab task:%s", err) os.Exit(-1) } crontab.Start() select {} }
go cron 只支持
{分} {时} {日} {月} {周} {年(可选)}
上述内容就是Golang中怎么实现一个cron 定时器,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。