ZBLOG

golang github.com/robfig/cron/v3 每周执行一次

在 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日零点执行

关键注意事项

  1. 时区问题
    默认使用服务器本地时区。如需指定时区:

    location, _ := time.LoadLocation("Asia/Shanghai")
    c := cron.New(cron.WithLocation(location))
    
  2. 任务可靠性
    如果任务可能崩溃,建议添加恢复逻辑:

    _, err := c.AddFunc("@weekly", func() {
       defer func() {
    	   if r := recover(); r != nil {
    		   log.Println("Task panic recovered:", r)
    	   }
       }()
       // Your task logic here
    })
    
  3. 日志监控
    启用日志记录任务执行情况:

    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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=23822

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?