返回顶部
首页 > 资讯 > 后端开发 > GO >golang定时任务cron项目实操指南
  • 349
分享到

golang定时任务cron项目实操指南

golang定时任务调度golang定时任务golang定时任务cron 2022-12-26 12:12:31 349人浏览 独家记忆
摘要

目录一、简介:1、cron包2、表达式,Go cron使用的和 linux crontab 一样的表达式3、新老版本区别二、项目实操1、启动daemon 守护进程2、统计任务总结一、

一、简介:

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内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: golang定时任务cron项目实操指南

本文链接: https://lsjlt.com/news/175812.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作