Cron 定时任务
Job 定义与适配
定义定时任务结构和函数适配器
Job 定义与适配
Job 结构体用于定义定时任务的基本信息,包括 Cron 表达式和任务函数。
结构体定义
// Job 定义定时任务结构
type Job struct {
Spec string // cron 表达式,如 "*/5 * * * *" 或 "@every 1m"
Func any // 支持 func() 或 func(context.Context)
}
// NewJob 创建定时任务
func NewJob(spec string, fn any) Job字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
Spec | string | Cron 表达式,支持两种格式:标准 5 位表达式(如 */5 * * * *)和 @every 语法(如 @every 1m、 @hourly) |
Func | any | 任务函数,支持两种签名:func() 或 func(context.Context) |
Cron 表达式格式
标准 5 位表达式
* * * * * *
│ │ │ │ │
│ │ │ │ │
└─ 星期几 (0-6, 分钟 (0-59) 小时 (0-23) 日 (1-31) 月 (1-12)常用示例:
| 表达式 | 说明 |
|---|---|
*/5 * * * * | 每 5 分钟执行 |
0 * * * * | 每小时整点执行 |
0 0 * * * | 每天午夜执行 |
0 0 0 * * | 每月 1 日午夜执行 |
@every 语法
@every <duration>常用示例:
| 表达式 | 说明 |
|---|---|
@every 1m | 每 1 分钟执行 |
@every 5m | 每 5 分钟执行 |
@every 1h | 每 1 小时执行 |
@every 24h | 每 24 小时执行 |
函数签名
无参数签名
func() {
// 无需上下文,执行简单任务
}吺Context签名
func(ctx context.Context) {
// 可以访问上下文中的资源(如数据库、Redis)
db := xCtxUtil.MustGetDB(ctx)
// 执行需要上下文的任务
}AdaptJob 函数适配器
AdaptJob 函数用于将不同签名的函数适配为统一的 func(context.Context) 格式。
// AdaptJob 适配任务函数,支持多种签名
func AdaptJob(fn any) (jobFunc, error)工作原理
- 检查
fn的类型 - 如果是
func(),包装为调用func(context.Context) - 如果是
func(context.Context),直接使用 - 其他类型返回错误
使用示例
// 创建无参数任务
job1 := xCron.NewJob("@every 1m", func() {
log.Println("每分钟执行一次")
})
// 创建带上下文的任务
job2 := xCron.NewJob("*/5 * * * *", func(ctx context.Context) {
db := xCtxUtil.MustGetDB(ctx)
// 执行数据库清理
db.Where("expired_at < ?", time.Now()).Delete(&models.Data{})
})
// 手动适配函数
adaptedFunc, err := xCron.AdaptJob(func() {
log.Println("手动适配的任务")
})
if err != nil {
log.Fatalf("适配失败: %v", err)
}完整示例
package main
import (
xCron "github.com/xiaolfeng/bamboo-base/plugins/cron"
xCronRunner "github.com/xiaolfeng/bamboo-base/plugins/cron/runner"
)
// 定义任务列表
var jobs = []xCron.Job{
xCron.NewJob("@every 1m", func() {
log.Println("[CRON] 每分钟任务执行")
}),
xCron.NewJob("0 * * * *", func(ctx context.Context) {
db := xCtxUtil.MustGetDB(ctx)
db.Where("created_at < ?", time.Now().AddDate(-24 * time.Hour).Delete(&models.Log{})
}),
}
func main() {
// ... 其他初始化代码
}