在 Go 中使用 github.com/robfig/cron/v3
实现每周执行一次的任务,可以通过以下两种方式配置:
方法1:使用标准 Cron 表达式
package main
import (
"fmt"
"github.com/robfig/cron/v3"
"time"
)
func main() {
c := cron.New()
// 每周一上午9:00执行(0=周日,1=周一)
_, err := c.AddFunc("0 0 9 * * 1", func() { // 格式:秒 分 时 日 月 星期
fmt.Println("Weekly task executed at:", time.Now())
})
if err != nil {
panic(err)
}
c.Start()
defer c.Stop()
select {} // 阻塞主线程
}
Cron表达式说明:
0 0 9 * * 1
含义:秒(0) 分(0) 时(9) 日(*) 月(*) 星期(1=周一)
即:每周一上午9:00:00执行。
方法2:使用预定义宏(更简洁)
_, err := c.AddFunc("@weekly", func() { // @weekly = 每周日零点(等同 "0 */5")
fmt.Println("Weekly task (Sunday midnight) executed at:", time.Now())
})
常用预定义宏:
宏 | Cron等效 | 说明 |
---|---|---|
@weekly |
"0 */5" |
每周日零点执行 |
@monthly |
"0 */30" |
每月1日零点执行 |
关键注意事项
时区问题
默认使用服务器本地时区。如需指定时区:location, _ := time.LoadLocation("Asia/Shanghai") c := cron.New(cron.WithLocation(location))
任务可靠性
如果任务可能崩溃,建议添加恢复逻辑:_, err := c.AddFunc("@weekly", func() { defer func() { if r := recover(); r != nil { log.Println("Task panic recovered:", r) } }() // Your task logic here })
日志监控
启用日志记录任务执行情况:c := cron.New( cron.WithLogger( cron.PrintfLogger(log.New(os.Stdout, "CRON: ", log.LstdFlags)), ) )
完整示例代码
package main
import (
"fmt"
"log"
"os"
"time"
"github.com/robfig/cron/v3"
)
func main() {
c := cron.New(
cron.WithSeconds(), // (可选)启用秒级精度
cron.WithLocation(time.Local), // (可选)设置时区
cron.WithLogger(cron.PrintfLogger(log.New(os.Stdout, "[CRON] ", log.LstdFlags))),
)
id, err := c.AddFunc("@weekly", weeklyJob)
if err != nil {
log.Fatal("Failed to add job:", err)
}
log.Println("Scheduled job ID:", id)
c.Start()
defer c.Stop()
select {}
}
func weeklyJob() {
fmt.Println("Weekly job started at:", time.Now().Format(time.RFC3339))
}
运行后会输出类似:
[CRON] Started job ID:1 schedule="@weekly"
[CRON] Triggered job ID:1 run_at="2023-09-10T00:00:00+08:00"
Weekly job started at:2023-09-10T00:00:00+08:00
内容由零声教学AI助手提供,问题来源于学员提问