本网站(662p.com)打包出售,且带程序代码数据,662p.com域名,程序内核采用TP框架开发,需要联系扣扣:2360248666 /wx:lianweikj
精品域名一口价出售:1y1m.com(350元) ,6b7b.com(400元) , 5k5j.com(380元) , yayj.com(1800元), jiongzhun.com(1000元) , niuzen.com(2800元) , zennei.com(5000元)
需要联系扣扣:2360248666 /wx:lianweikj
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()
}

image.png

二、项目实操

数据统计系统 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")
}

... 具体你的项目多个任务

执行结果

image.png


相关推荐

PHP实现部分字符隐藏

沙雕mars · 1325浏览 · 2019-04-28 09:47:56
Java中ArrayList和LinkedList区别

kenrry1992 · 908浏览 · 2019-05-08 21:14:54
Tomcat 下载及安装配置

manongba · 970浏览 · 2019-05-13 21:03:56
JAVA变量介绍

manongba · 963浏览 · 2019-05-13 21:05:52
什么是SpringBoot

iamitnan · 1087浏览 · 2019-05-14 22:20:36
加载中

0评论

评论
分类专栏
小鸟云服务器
扫码进入手机网页