golang 使用cron来实现自动运行
文章目录
前言
在golang中的如何实现crontab?这个一直没有一个好的方法,毕竟不是在大厂只能自己摸索着来。写在这里用来记录自己的一些想法的步骤
提示:以下是本篇文章正文内容,下面案例可供参考
一、使用的模块是git上比较流行的robfig/cron
地址:https://github.com/robfig/cron
目前到了V3版本.
二、使用步骤
1.安装
go get github.com/robfig/cron/v3@v3.0.0
2.在项目中引用
import "github.com/robfig/cron/v3"
三、使用
1. 初始化+最简单的模式
package main
//
///main.go
//author = "Derek Tian"
//Ver = 0.0.0.1
//make time = 8/10/2022 11:04
// note =
/
/*
*/
import (
"fmt"
"github.com/robfig/cron/v3"
"time"
)
func main() {
// this is main function
c := cron.New()
aid, _ := c.AddFunc("@every 2s", func() { fmt.Println("Hi:", time.Now()) }) //这里实际上是返回一个EntryID和一个err
c.Start()
// 下面是一个示例中的死循环为了获得执行状态
for {
l := c.Entry(aid)
fmt.Printf("aid[%d]的上一次启动时间:%v,下一次启动时间:%v\n", l.ID, l.Prev, l.Next)
time.Sleep(5 * time.Second)
}
// 通过select 来实现无限循环+阻塞
select {}
}
执行结果: 可以看到在第一次尝试获取上一次执行时间时结果时时间的空值,当第二次获取状态是拿到了争取的结果
2. 初始化+封装模式,这里要感谢DaSheng1104,借鉴了他的一篇文章:https://blog.youkuaiyun.com/LoganPython/article/details/125777340
我理解的部分啊,因为这个addjob实际上是万物都可以,只要实现了Run方法的,他都可以添加进去。
package main
//
///main.go
//author = "Derek Tian"
//Ver = 0.0.0.1
//make time = 8/10/2022 11:04
// note =
/
/*
*/
import (
"fmt"
"github.com/robfig/cron/v3"
"time"
)
type aJob struct {
ab string
}
func (t *aJob) Run() {
fmt.Println(t.ab, "这是从ajob启动的 :", time.Now())
}
var (
PaymentStatJob = aJob{}
)
func main() {
// this is main function
c := cron.New()
aid, err := c.AddJob("@every 20s", &PaymentStatJob)
if err != nil {
fmt.Println(err)
}
fmt.Println("aid:", aid)
c.Start()
for {
l := c.Entry(aid)
fmt.Printf("aid[%d]的上一次启动时间:%v,下一次启动时间:%v,运行状态:%v\n", l.ID, l.Prev, l.Next, l.Valid())
time.Sleep(5 * time.Second)
}
select {}
}
这是执行结果
总结
使用起来很方便,但是无法持久化。我的思路是:
- 在mongoDB中建立一个表用来存储时间间隔和任务函数名称。
2)在cron的主程序中注册所有的函数名。
3)在cron程序启动时检查注册的内容,然后将内容分别加载job中。
4)在redis中中存入Entry的ID和上下次的运行时间。
5)在redis中存储运行状态。
6)在更新redis中运行状态和结果日志时将最后一次正确运行的时间更新到mongodb中。这样保证了即使程序重启也知道上一次的最后运行时间和状态可以接着来(这比较适合domain)的模式。