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

目录
  • 一、简介:
    • 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内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Golang Cron 定时任务的实现示例

    开门见山写一个 package main import ( "fmt" "github.com/robfig/cron" "log" "strings" "time" ) func CronTask() { log.Println("******** ******* *******") } func CronTest() { log.Println("Starting Cron

  • Golang cron 定时器和定时任务的使用场景

    目录 Golang cron 定时器和定时任务 timer和ticker的区别 Timer Ticker cron 定时任务 参考链接: Golang cron 定时器和定时任务 Golang中time包有两个定时器,分别为 ticker 和 timer.两者都可以实现定时功能,但各自都有自己的使用场景. timer和ticker的区别 ticker定时器表示每隔一段时间就执行一次,一般可执行多次. timer定时器表示在一段时间后执行,默认情况下只执行一次,如果想再次执行的话,每次都需要调用

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

    目录 一.简介: 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 一样的表达式 # 文件格

  • jQuery实现简易商城系统项目实操

    目录 一.效果图 二.body 三.jQuery 四.css 五.小结 一.效果图 二.body <body> <table border="1" cellpadding="0" cellspacing="0"> <tr> <th><input type='checkbox' name="c1"/>全选</th> <th>商品信息</th

  • JAVA生成pdf文件的实操指南

    目录 一.简介 二.实操 三.原理解析 1.是什么? 1.1.关键技术 2.怎么做?为什么? 3.参考 总结 一.简介 PDF文件格式可以将文字.字型.格式.颜色及独立于设备和分辨率的图形图像等封装在一个文件中.本文实现将html页面转PDF. 二.实操 生成pdf文件成功,但是文字对不上.当修改”GetHtmlContent“部分的编码之后,再次执行生成PDF文件即可完成正确的实现. Edit Configurations 三.原理解析 从这几点深入剖析和总结这个小项目: 1.是什么? 该项目

  • Python对Excel进行处理的实操指南

    xlrd.xlwt和openpyxl模块的比较: 区别: 模块 Excel格式支持 xls xlsx xlrd √ √ xlwt √ × openpyxl × √ 效率: 两种包对小文件的读写速度差别不大,而面对较大文件,xlrd/xlwt速度明显优于openpyxl,但因为xlwt无法生成xlsx是个硬伤,所以想要尽量提高效率又不影响结果时,可以考虑用xlrd读取,用openpyxl写入. 一.xlrd:对xls.xlsx文件进行读操作 1.获取工作簿对象:xlrd.open_workbook

  • 一文详解Golang 定时任务库 gron 设计和原理

    目录 cron 简介 gron 定时参数 源码解析 Cron Entry 按照时间排序 新增定时任务 启动和停止 Schedule 扩展性 经典写法-控制退出 结语 cron 简介 在 Unix-like 操作系统中,有一个大家都很熟悉的 cli 工具,它能够来处理定时任务,周期性任务,这就是: cron. 你只需要简单的语法控制就能实现任意[定时]的语义.用法上可以参考一下这个Crontab Guru Editor,做的非常精巧. 简单说,每一个位都代表了一个时间维度,* 代表全集,所以,上面

  • Goland支持泛型了(上机实操)

    事情出因 一大早上被一篇公众号的推文震惊了,Goland竟然支持go的泛型了.据我所知: Go的泛型不是还在设计草图吗?最乐观估计也要2021年8月份.你说Go语言现在都没开发好泛型,你支持这个特性有什么用呢? 带着好奇心点开推文,没发现对泛型的说明,只看到一个Goland对泛型的使用的说明链接: https://blog.jetbrains.com/go/2020/11/24/experimenting-with-go-type-parameters-generics-in-goland/,心

  • python函数超时自动退出的实操方法

    本章给大家在项目使用时候,常见的一种情况解决案例,即是当我们调用多个线程,使用了同一个函数去处理数据的时候,有些用函数已经处理完成,但是有些还没有,这就需要我们将任务进行分割,然后当一小部分任务执行后,退出来,另外没有执行的完成超时的就继续去执行,下面就针对遇到这些问题的小伙伴,给大家提供解决参考. 安装timeout-decorator库: pip3 install timeout-decorator 编写异常语句: @timeout_decorator.timeout(5, timeout_

  • 实操Python爬取觅知网素材图片示例

    目录 [一.项目背景] [二.项目目标] [三.涉及的库和网站] [四.项目分析] [五.项目实施] [六.效果展示] [七.总结] [一.项目背景]    在素材网想找到合适图片需要一页一页往下翻,现在学会python就可以用程序把所有图片保存下来,慢慢挑选合适的图片. [二.项目目标] 1.根据给定的网址获取网页源代码. 2.利用正则表达式把源代码中的图片地址过滤出来. 3.过滤出来的图片地址下载素材图片. [三.涉及的库和网站] 1.网址如下: https://www.51miz.com/

  • Mybatis-plus多租户项目实战进阶指南

    在基于Mybatis-plus实现多租户架构中,介绍了在多租户项目中如果要开启一个子线程,那么需要手动进行RequestAttributes的子线程共享.如果应用场景较少的话可能也不是特复杂,但是如果场景数量上来了,还是很容易忘记的,在测试的时候才会发现疏忽了这一块.所以想了半天,决定抽取一个公共方法,用来执行这些特定的子线程. 既然要复用这类线程的执行方式,线程池是个不错的选择.这里省略创建线程池的步骤,选择直接使用spring内已经初始化好的线程池ThreadPoolTaskExecutor

  • Spring整合Mybatis实操分享

    目录 Mybatis的基本工作原理 分析需要解决的问题 Spring中Bean的产生过程 解决问题 总结 在介绍Spring整合Mybatis原理之前,我们得先来稍微介绍Mybatis的工作原理. Mybatis的基本工作原理 在Mybatis中,我们可以使用一个接口去定义要执行sql,简化代码如下: 定义一个接口,@Select表示要执行查询sql语句. public interface UserMapper { @Select("select * from user where id = #

随机推荐