竹简文档
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

字段说明

字段类型说明
SpecstringCron 表达式,支持两种格式:标准 5 位表达式(如 */5 * * * *)和 @every 语法(如 @every 1m@hourly
Funcany任务函数,支持两种签名: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)

工作原理

  1. 检查 fn 的类型
  2. 如果是 func(),包装为调用 func(context.Context)
  3. 如果是 func(context.Context),直接使用
  4. 其他类型返回错误

使用示例

// 创建无参数任务
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() {
    // ... 其他初始化代码
}

On this page