robfig/cron 是一个用于 Go 语言的定时任务调度库,支持标准的 cron 表达式语法,允许开发者以简单的方式定义和管理周期性任务。以下是它的核心特性和使用方法的详细介绍。

0 30 * * * * 表示每小时的第 30 分钟执行。JobWrapper 实现任务执行前后的拦截逻辑(如日志、统计、超时控制)。Recover() 恢复并记录错误。go get github.com/robfig/cron/v3@v3.0.0 # v3 是最新稳定版
package main
import (
"fmt"
"github.com/robfig/cron/v3"
)
funcmain() {
c := cron.New()
// 添加任务:每分钟执行一次
_, _ = c.AddFunc("* * * * *", func() {
fmt.Println("执行任务:每分钟触发")
})
// 添加任务:每天10:30执行
_, _ = c.AddFunc("0 30 10 * * *", func() {
fmt.Println("执行任务:每天10:30")
})
c.Start() // 启动调度器
defer c.Stop() // 程序退出前停止
select{} // 阻塞主线程(或根据实际需求调整)
}
⓵ 标准格式(5 段)
分 时 日 月 星期
示例:0 30 * * * 表示每小时的第 30 分钟执行。
⓶ 扩展格式(6 段,支持秒)
秒 分 时 日 月 星期
示例:0 0 12 * * * 表示每天12:00:00执行。
c := cron.New(
cron.WithLogger(
cron.VerbosePrintfLogger(log.New(os.Stdout, "cron: ", log.LstdFlags)),
)
任务执行时的 panic 会被捕获并记录:
c := cron.New(cron.WithPanicLogger(log.Printf))
// 添加一个带超时控制的任务
c := cron.New()
chain := cron.NewChain(
cron.Recover(cron.DefaultLogger), // 捕获 panic
cron.DelayIfStillRunning(cron.DefaultLogger),
)
// 将任务包装到链中
_, _ = c.AddJob("0 0 * * * *", chain.Then(cron.FuncJob(func() {
// 执行任务
}))
// 延迟执行直到前任务完成
cron.New(
cron.WithChain(
cron.DelayIfStillRunning(logger),
)
)
// 运行时添加/删除任务
entryID := c.Schedule(cron.Every(10*time.Minute), cron.FuncJob(task))
c.Remove(entryID)
AddFunc 和 Remove⓵ 如何停止任务?
调用 c.Stop() 会等待正在执行的任务完成后再关闭调度器。
⓶ 如何动态添加/删除任务?
entryID, _ := c.AddFunc(...)c.Remove(entryID)⓷ 时区问题
默认使用本地时区,可通过 cron.WithLocation 指定:
location, _ := time.LoadLocation("Asia/Shanghai")
c := cron.New(cron.WithLocation(location))
⓸ v3 版本向后不兼容变更
github.com/robfig/cron/v3cron.WithLogger())Recover 中间件)⓹ v3 版本表达式解析调整
// 旧版(默认含秒):需显式切换解析器
parser := cron.NewParser(cron.SecondOptional | cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow)
cron.New(cron.WithParser(parser))
⓺ v1 vs v3版本差异
v3 引入了模块化设计(如 cron.WithLogger 配置)。v3 默认支持秒级精度(表达式为 6 段),而 v1 仅支持 5 段。v3 的 API 更简洁(如 cron.New() 替代 cron.NewCron())。适用场景:
优势:
对比标准库:
Go 标准库的 time.Ticker 适合简单周期性任务,而 robfig/cron 更适合需要灵活 cron 表达式控制的场景。
[1]GitHub - robfig/cron: https://github.com/robfig/cron