golang,go,博客,开源,编程

golang每日一库之/robfig/cron

Published on with 0 views and 0 comments

/robfig/cron 是 Go 语言中的一个流行的定时任务库,它实现了一个类似于 Unix/Linux 系统中的 cron 的功能,可以用来安排定时任务。该库使用 Go 的 time 包,并提供了一个非常易于使用的 API 来调度和管理任务。

安装

要使用 robfig/cron 库,你需要先安装它。你可以通过以下命令来安装:

go get github.com/robfig/cron/v3

基本用法

1. 创建一个定时任务调度器

首先,你需要创建一个新的 cron 实例,使用 cron.New() 创建一个新的定时任务调度器。然后,你可以使用 AddFuncAddJob 方法来注册任务。

示例:基础定时任务

package main

import (
	"fmt"
	"github.com/robfig/cron/v3"
	"time"
)

func main() {
	// 创建一个新的 Cron 调度器
	c := cron.New()

	// 注册一个定时任务,每 5 秒执行一次
	c.AddFunc("*/5 * * * * *", func() {
		fmt.Println("Task executed at", time.Now())
	})

	// 启动 Cron 调度器
	c.Start()

	// 防止主线程提前退出
	select {}
}

解释:

  • cron.New() 创建了一个新的调度器。
  • c.AddFunc("*/5 * * * * *", func() {...}) 是定时任务的注册,*/5 * * * * * 是一个 Cron 表达式,表示每 5 秒执行一次。
  • c.Start() 启动了调度器,开始执行定时任务。
  • select {} 保证主程序不退出,这样定时任务能够继续运行。

2. Cron 表达式

robfig/cron 库使用标准的 Cron 表达式,格式如下:

* * * * * *
- - - - - -
| | | | | |
| | | | | +-- Day of week (0 - 6) (Sunday=0)
| | | | +---- Month (1 - 12)
| | | +------ Day of month (1 - 31)
| | +-------- Hour (0 - 23)
| +---------- Minute (0 - 59)
+------------ Second (0 - 59)

常见的 Cron 表达式示例:

  • "*/5 * * * * *": 每 5 秒执行一次。
  • "0 * * * * *": 每小时的第 0 分钟(即每小时执行一次)。
  • "0 0 * * * *": 每天午夜 12 点执行。
  • "0 0 1 * * *": 每月 1 号午夜执行。

3. 添加多个任务

你可以在同一个 cron 调度器中添加多个任务,它们会根据各自的 Cron 表达式按时执行。

示例:多个定时任务

package main

import (
	"fmt"
	"github.com/robfig/cron/v3"
	"time"
)

func main() {
	// 创建一个新的 Cron 调度器
	c := cron.New()

	// 注册一个定时任务,每 10 秒执行一次
	c.AddFunc("*/10 * * * * *", func() {
		fmt.Println("Task 1 executed at", time.Now())
	})

	// 注册另一个定时任务,每 15 秒执行一次
	c.AddFunc("*/15 * * * * *", func() {
		fmt.Println("Task 2 executed at", time.Now())
	})

	// 启动 Cron 调度器
	c.Start()

	// 防止主线程提前退出
	select {}
}

4. 使用 AddJob 注册任务

除了直接注册函数,你还可以注册实现了 cron.Job 接口的对象。cron.Job 接口只有一个方法 Run(),你需要实现这个方法来定义任务逻辑。

示例:使用 AddJob 注册任务

package main

import (
	"fmt"
	"github.com/robfig/cron/v3"
	"time"
)

// 实现 cron.Job 接口
type MyJob struct{}

func (m *MyJob) Run() {
	fmt.Println("Custom job executed at", time.Now())
}

func main() {
	// 创建一个新的 Cron 调度器
	c := cron.New()

	// 注册自定义任务
	c.AddJob("*/10 * * * * *", &MyJob{})

	// 启动 Cron 调度器
	c.Start()

	// 防止主线程提前退出
	select {}
}

5. Cron 调度器的控制

你可以暂停、停止或重新启动调度器。

示例:暂停和停止 Cron 调度器

package main

import (
	"fmt"
	"github.com/robfig/cron/v3"
	"time"
)

func main() {
	// 创建一个新的 Cron 调度器
	c := cron.New()

	// 注册定时任务
	c.AddFunc("*/5 * * * * *", func() {
		fmt.Println("Task executed at", time.Now())
	})

	// 启动 Cron 调度器
	c.Start()

	// 暂停 15 秒钟
	time.Sleep(15 * time.Second)

	// 停止 Cron 调度器
	c.Stop()
	fmt.Println("Cron scheduler stopped")
}

解释:

  • c.Stop() 停止 Cron 调度器,所有任务将不再执行。

6. 使用 Cron 表达式的时间区间

你还可以使用 time 包来动态生成时间段,进而生成 Cron 表达式。

示例:根据动态条件生成 Cron 表达式

package main

import (
	"fmt"
	"github.com/robfig/cron/v3"
	"time"
)

func main() {
	// 获取当前时间
	now := time.Now()
	fmt.Println("Current time:", now)

	// 根据当前时间动态生成一个 Cron 表达式
	cronExpr := fmt.Sprintf("%d %d * * * *", now.Second(), now.Minute())

	// 创建一个新的 Cron 调度器
	c := cron.New()

	// 注册一个任务,每分钟的第 5 秒执行
	c.AddFunc(cronExpr, func() {
		fmt.Println("Dynamic task executed at", time.Now())
	})

	// 启动 Cron 调度器
	c.Start()

	// 防止主线程提前退出
	select {}
}

7. 错误处理

当定时任务出现错误时,cron 调度器会记录错误日志。你可以使用 c.AddFuncc.AddJob 来捕获错误,并进行适当的错误处理。

例外:捕获任务中的错误

package main

import (
	"fmt"
	"github.com/robfig/cron/v3"
	"log"
	"time"
)

func main() {
	// 创建一个新的 Cron 调度器
	c := cron.New()

	// 注册一个带错误处理的任务
	c.AddFunc("*/5 * * * * *", func() {
		defer func() {
			if err := recover(); err != nil {
				log.Println("Task failed:", err)
			}
		}()
		// 模拟任务错误
		panic("Something went wrong")
	})

	// 启动 Cron 调度器
	c.Start()

	// 防止主线程提前退出
	select {}
}

总结

  • robfig/cron 是 Go 中一个非常强大的定时任务调度库,支持 cron 表达式和多种任务调度方式。
  • 你可以根据自己的需求定义定时任务,支持流式任务和定时任务的管理。
  • Cron 表达式是 robfig/cron 的核心,灵活地表达任务的调度周期。

标题:golang每日一库之/robfig/cron
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/01/24/1737678756976.html
联系:scotttu@163.com