robfig/cron使用小结

robfig/cron/v3 是一个 Golang 的定时任务库,支持 cron 表达式。其源码值得一读, 低耦合高内聚体现地淋漓尽致,其中涉及的装饰器模式,并发处理等都很值得学习。

如果是 0 30 * * * *, 那就是每个 xx:00 和 xx:30 执行

而如果是@every 10m, 则是从当前时间起(服务启动时间),每30分钟执行一次,未必是xx:00,xx:30时刻执行

参考一不留神就掉坑, 可利用在线工具查看具体执行时间




cron.SkipIfStillRunning干什么用的


cron.SkipIfStillRunning 是 Go 语言的一个 cron 库(定时任务库)中的函数,用于在一个定时任务执行期间,避免在上一个任务还未完成时,重复触发新的任务。

当多个定时任务被同时触发时,如果其中一个任务的执行时间比较长,可能会导致这个任务的多次重复执行,从而出现问题。这时可以使用 SkipIfStillRunning 函数来避免这种情况的发生。

SkipIfStillRunning 函数的作用是,当一个任务正在执行时,如果定时器再次触发该任务,它会检查上一个任务是否已经完成,如果没有完成,则会跳过这个任务,等待上一个任务完成后再次触发。这样可以确保同一个任务在同一时间只有一个实例在执行,避免重复执行和数据竞争等问题。

SkipIfStillRunning 函数的原型为:

1
func SkipIfStillRunning(ctx context.Context, job func() error) error

其中,参数 ctx 是一个 context.Context 类型的变量,用于控制任务的生命周期,参数 job 是一个函数类型的变量,用于定义需要执行的任务。函数会返回一个 error 类型的值,表示任务执行过程中可能出现的错误。

1
2
3
4
_, err = t.c.AddJob("@every 1m", cron.NewChain(cron.SkipIfStillRunning(cron.DefaultLogger)).Then(&deleteXxxxxLog{}))
if err != nil {
return fmt.Errorf("清理xxx日志定时启动失败: %s", err.Error())
}

在另一个文件里定义一个结构体

1
2
3
4
5
6
7
8
9
10

type deleteXxxxxLog struct {
}

func (s deleteXxxxxLog) Run() {
logger.Log().Infof("开始定时执行shuang66666")

time.Sleep(1e9)
defer logger.Log().Infof("结束定时执行shuang66666")




其相关源码,可参考:


Golang 定时任务 github/robfig/cron/v3 使用与源码解析

Golang crontab定时执行任务(github.com/robfig/cron)

cron表达式解析 + robfig/cron 源码剖析