您好,登錄后才能下訂單哦!
本篇文章為大家展示了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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。