由网络副手--寻路人于2022.08.11 18:01:00发布在Go语言 go 计划任务robfig/cron 使用 阅读1505 评论0 喜欢0 ## 一、前言: 今天看了下系统中使用的计划任务,用了自己实现的一套,缺陷是时间不是按照时间秒 00 开始计算的, 而是根据服务启动来算时间的,这样不是很合适。 从Github 上调研了新的计划任务组件:robfig/cron ,这个组件实现的还是不错,无侵入式,提供的 addJob 和 addFunc 非常棒的可以支持业务非侵入式实现。 缺点: 虽然次计划任务是按照每一分钟的00 开始算秒,但是在下一分钟的时候,会按照00 算。什么意思呢? 比如: */8 * * * * * ,这个时间设置,每8秒执行一次,但是60秒里面只满足执行 7 次 也就是到56秒,那第8次 实在下一分钟 00 就会执行,也就意味着,最后一次执行只隔了4秒。 ## 二、文档 ``` #github https://github.com/robfig/cron/ #文档 https://pkg.go.dev/github.com/robfig/cron#hdr-Usage ``` Field name | Mandatory? | Allowed values | Allowed special characters ---------- | ---------- | -------------- | -------------------------- Seconds | Yes | 0-59 | * / , - Minutes | Yes | 0-59 | * / , - Hours | Yes | 0-23 | * / , - Day of month | Yes | 1-31 | * / , - ? Month | Yes | 1-12 or JAN-DEC | * / , - Day of week | Yes | 0-6 or SUN-SAT | * / , - ? Entry | Description | Equivalent To ----- | ----------- | ------------- @yearly (or @annually) | Run once a year, midnight, Jan. 1st | 0 0 0 1 1 * @monthly | Run once a month, midnight, first of month | 0 0 0 1 * * @weekly | Run once a week, midnight between Sat/Sun | 0 0 0 * * 0 @daily (or @midnight) | Run once a day, midnight | 0 0 0 * * * @hourly | Run once an hour, beginning of hour | 0 0 * * * * ## 三、使用 ### 3.1 组件安装 ``` go get github.com/robfig/cron/v3@v3.0.0 ``` ### 3.2 业务使用 main.go ``` func main() { env := os.Getenv("APP_ENV") if env != "dev" { //微信分享 service.GetTicket() jobCli := service.JobInitConf() service.AddJobLists(jobCli) jobCli.Start() defer jobCli.Stop() } } ``` ### 3.3 业务中 service/system_job_lists.go ``` package service import ( "github.com/robfig/cron/v3" "github.com/sirupsen/logrus" ) func JobInitConf() *cron.Cron { secondParser := cron.NewParser(cron.Second | cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.DowOptional | cron.Descriptor) return cron.New(cron.WithParser(secondParser), cron.WithChain()) } func AddJobLists(c *cron.Cron) { _, err := c.AddFunc("0 */5 * * * *", func() { CronUpdateEve5Min() }) if err != nil { logger.AppLog.WithFields(logrus.Fields{ "err": err, }).Error("计划任务-获取分钟线数据-异常") } } ``` 赞 0 分享 赏 您可以选择一种方式赞助本站 支付宝扫码赞助 BraveDu 署名: 网络副手~寻路人