一、简介:
1、cron包
cron包:"github.com/robfig/cron/v3"
文档:
2、表达式,go cron使用的和 Linux 定制网站一样的表达式
# 定制网站文件格式說明
# ┌──分鐘(0 - 59)
# │ ┌──小時(0 - 23)
# │ │ ┌──日(1 - 31)
# │ │ │ ┌─月(1 - 12)
# │ │ │ │ ┌─星期(0 - 6,定制网站表示从周日到周六)
# │ │ │ │ │
# * * * * * 定制网站被執行的命令
3、新老版本区别
老版本的最大区别在于如果需要秒级定义,需要额外传入参数,并且可以自由配置参数
c := cron.New(cron.WithSeconds()) // 秒级操作cron.WithSeconds()
代码示例
- package main
-
- import (
- "fmt"
- "github.com/robfig/cron/v3"
- "log"
- "os"
- )
-
- func RunCron() {
- 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()
- select()
- }
- func main() {
- RunCron()
- }
多任务 AddJob
- package main
-
- import (
- "fmt"
- "github.com/robfig/cron/v3"
- )
-
- 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 RunCron() {
- 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()
- select()
- }
- func main() {
- RunCron()
- }
二、项目实操
数据统计系统 statsys 每天凌晨定时统计前一天运营数据
1、启动daemon 守护进程
- package main
-
- import (
- "github.com/robfig/cron/v3"
- logger "github.com/sirupsen/logrus"
- "statsys/scheduler/crob_job" // 这里引入你的任务
- )
-
-
-
- func printLog(crobJob string, err error) {
- if err != nil {
- logger.Errorf("Start %s Error, err: %v", crobJob, err)
- } else {
- logger.Infof("Start %s Successful!", crobJob)
- }
- }
-
- func RunCron() {
- c := cron.New()
-
- // 收入数据统计 定时任务(每天凌晨00:01:00)执行
- _, err := c.AddJob("1 0 * * *", &crob_job.DeliveryIncomeStatJob)
- printLog("IncomeStatJob", err)
-
- // 支出数据统计 定时任务(每天凌晨00:03:00)执行
- _, err = c.AddJob("3 0 * * *", &crob_job.PaymentStatJob)
- printLog("PaymentStatJob", err)
-
-
-
- // 启动一个新的 goroutine 做循环检测
- c.Start()
- select {}
- }
-
- func main() {
- RunCron()
- }
2、统计任务
- // 支出数据统计定时任务
- package crob_job
-
-
- type paymentStatJob struct {
- amountStatDataBase *amount_stat.AmountDataBase
- }
-
- // 单利
- var (
- PaymentStatJob = paymentStatJob{}
- )
-
- func (this *paymentStatJob) Run() {
- logger.Warningln(">>>>>>>>>>>>> Start paymentStat")
-
- startTime := "2022-01-02"
- endTime := "2022-01-01"
- // 查询统计数据
- dataList, code := brawn.StationAccountSrv.GetPaymentDate(startTime, endTime)
- if code != ecode.SUCC {
- logger.Errorf("支出数据统计定时任务 errCode: %v", code)
- return
- }
-
- if len(dataList) <= 0 {
- logger.Warningln(" >>>>>>>> 暂无 支出数据 <<<<<<<<")
- return
- }
-
- // 保存支付统计数据
- this.amountStatDao.SavePaymentStatData(dataList...)
-
- logger.Warningln("<<<<<<<<<<<<< End paymentStat")
- }
... 具体你的项目多个任务
执行结果