golang定时任务cron项目实操指南
短信预约 -IT技能 免费直播动态提醒
一、简介:
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")
}
... 具体你的项目多个任务
执行结果
总结
到此这篇关于golang定时任务cron项目实操的文章就介绍到这了,更多相关golang定时任务cron内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341