golang定时任务cron项目实操指南
mylove136 · 103浏览 · 发布于2022-12-26
Go实现的cron 表达式的基本语法跟linux 中的 crontab基本是类似的,下面这篇文章主要给大家介绍了关于golang定时任务cron项目实操的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
一、简介:
1、cron包
cron包:"github.com/robfig/cron/v3"
文档:cron package - github.com/robfig/cron - Go Packages
2、表达式,go cron使用的和 Linux crontab 一样的表达式
# 文件格式說明
# ┌──分鐘(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") }
... 具体你的项目多个任务
执行结果
相关推荐
PHP实现部分字符隐藏
沙雕mars · 1325浏览 · 2019-04-28 09:47:56
Java中ArrayList和LinkedList区别
kenrry1992 · 908浏览 · 2019-05-08 21:14:54
5月语言排行榜:R 跌出前二十,Python 紧咬 C++
manongba · 689浏览 · 2019-05-09 17:27:24
Tomcat 下载及安装配置
manongba · 970浏览 · 2019-05-13 21:03:56
什么是SpringBoot
iamitnan · 1087浏览 · 2019-05-14 22:20:36
分类专栏
最新发布
最热排行
0评论