集成 robfig/cron/v3 库,实现一个定时调度器,为项目提供灵活可控的定时任务能力。
安装
安装cron最新第三方库,和老版本的最大区别在于如果需要秒级定义,需要额外传入参数,并且可以自由配置参数
go get -u github.com/robfig/cron/v3
# 文件格式說明
# ┌──分鐘(0 - 59)
# │ ┌──小時(0 - 23)
# │ │ ┌──日(1 - 31)
# │ │ │ ┌─月(1 - 12)
# │ │ │ │ ┌─星期(0 - 6,表示从周日到周六)
# │ │ │ │ │
# * * * * * 被執行的命令
基础示例
package main
import (
"fmt"
"github.com/robfig/cron/v3"
"time"
)
func TestCron() {
c := cron.New()
i := 1
EntryID, err := c.AddFunc("*/1 * * * *", func() {
fmt.Println(time.Now(), "每分钟执行一次", i)
i++
})
fmt.Println(time.Now(), EntryID, err)
c.Start() // 启动任务
time.Sleep(time.Minute * 5)
// c.Stop() // 终止任务
}
func main() {
TestCron()
}
常用部分
- 秒级操作
cron.WithSeconds()
- 函数没执行完就跳过本次函数
cron.WithChain(cron.SkipIfStillRunning(cron.DefaultLogger))
- 打印任务日志
cron.WithLogger(cron.VerbosePrintfLogger(log.New(os.Stdout, "cron: ", log.LstdFlags)))
package main
import (
"fmt"
"github.com/robfig/cron/v3"
"log"
"os"
"time"
)
func TestCron() {
c := cron.New(cron.WithSeconds(), cron.WithChain(cron.SkipIfStillRunning(cron.DefaultLogger)), cron.WithLogger(
cron.VerbosePrintfLogger(log.New(os.Stdout, "cron: ", log.LstdFlags))))
i := 1
EntryID, err := c.AddFunc("*/5 * * * * *", func() {
fmt.Println(time.Now(), "每5s一次----------------", i)
time.Sleep(time.Second *6)
i++
})
fmt.Println(time.Now(), EntryID, err)
c.Start()
time.Sleep(time.Second * 30)
}
func main() {
TestCron()
}
启动多个任务AddJob
package main
import (
"fmt"
"github.com/robfig/cron/v3"
"time"
)
type Job1 struct {
}
func (t Job1) Run() {
fmt.Println(time.Now(), "I'm Job1")
}
type Job2 struct {
}
func (t Job2) Run() {
fmt.Println(time.Now(), "I'm Job2")
}
func TestCron() {
c := cron.New(cron.WithSeconds())
EntryID, err := c.AddJob("*/5 * * * * *", Job1{})
fmt.Println(time.Now(), EntryID, err)
EntryID, err = c.AddJob("*/10 * * * * *", Job2{})
fmt.Println(time.Now(), EntryID, err)
c.Start()
time.Sleep(time.Second * 30)
}
func main() {
TestCron()
}
使用@every
每10s执行一次
package main
import (
"fmt"
"github.com/robfig/cron/v3"
"time"
)
func TestCron() {
c := cron.New()
c.AddFunc("@every 10s", func() {
fmt.Println("Every 10 Seconds")
})
c.Start()
time.Sleep(time.Minute * 5)
}
func main() {
TestCron()
}
设置时区
package main
import (
"fmt"
"github.com/robfig/cron/v3"
"time"
)
func TestCron() {
//c := cron.New()
// 上海时区早六点
nyc, _ := time.LoadLocation("Asia/Shanghai")
c := cron.New(cron.WithLocation(nyc))
c.AddFunc("@every 10s", func() {
fmt.Println(12)
})
c.Start()
time.Sleep(time.Minute * 5)
}
func main() {
TestCron()
}