写了三年定时任务还在手改 Cron 表达式?这个 GoFrame 后台框架帮你全闭环了

25 阅读3分钟

写了三年定时任务还在手改 Cron 表达式?这个 GoFrame 后台框架帮你全闭环了

定时任务这东西,每个后端都写过。从最初 time.Ticker + goroutine,到自己搭个调度表,再到上 robfig/cron 库——功能是能跑了,但运维痛点一直在:改个执行周期要改代码重新部署;想知道任务有没有跑、跑没跑崩,得去翻日志文件;加个新任务要改配置、改代码、再发版,一套下来十分钟起步。

用了 XYGo Admin 之后,这块终于不用自己轮了。

注册一个任务,三行代码

internal/crons/ 下建一个文件,实现 GetName()Execute() 两个方法就行:

// internal/crons/example.go
package crons

import (
    "context"
    "xygo/internal/library/cron"
)

func init() {
    cron.Register(&ExampleTask{})
}

type ExampleTask struct{}

func (t *ExampleTask) GetName() string {
    return "example_task"
}

func (t *ExampleTask) Execute(ctx context.Context, params []string) (string, error) {
    // 你的业务逻辑
    g.Log().Info(ctx, "定时任务执行中...")
    return "执行完成", nil
}

Execute 的返回值会写进执行日志,不用再拼日志格式去 grep。比 robfig/cron 的 cron.AddFunc("*/5 * * * *", fn) 多了一层抽象,好处是:任务代码和执行周期完全解耦

后台直接改周期,不用重新部署

代码注册完只是第一步——任务不会自动跑。需要在后台「系统管理 → 定时任务」里手动添加并启用。这一步才是真正把控制权交到运维手里:

  • 新增任务:从已注册的任务标识里选一个(下拉列表直接来自代码中的 GetName()),配置 Cron 表达式
  • 启用/禁用:开关控制,不需要注释代码
  • 手动触发:测试时可以直接点「在线执行」,立即跑一次看结果
  • 执行日志:每次调度的结果和耗时都记录在案,哪次挂了、执行了多久一目了然

Cron 表达式是标准的 6 位格式(秒 分 时 日 月 周),每天凌晨 2 点清日志就是 0 0 2 * * *,工作日 9:30 跑报表就是 0 30 9 * * 1-5。不用像某些框架那样额外学一套 DSL。

扩展模块也能独立注册定时任务

如果你在用 XYGo Admin 的扩展体系(比如商城模块 shop),定时任务的隔离做得也很干净:

// server/addons/shop/crons/order_timeout.go
package crons

import (
    "context"
    cronlib "xygo/internal/library/cron"
)

func init() {
    cronlib.Register(&OrderTimeoutTask{})
}

type OrderTimeoutTask struct{}

func (t *OrderTimeoutTask) GetName() string {
    return "shop.order_timeout" // 扩展名.任务描述
}

func (t *OrderTimeoutTask) Execute(ctx context.Context, params []string) (string, error) {
    // 取消超时未支付订单
    return "取消了 5 个超时订单", nil
}

扩展的任务名建议用 扩展名.任务描述 格式,避免和主包任务撞名。module.go 里用空导入 _ "xygo/addons/shop/crons" 触发 init() 注册即可,和主包的 main.go 空导入 _ "xygo/internal/crons" 是同一套机制。

为什么比裸用 robfig/cron 舒服

裸用 robfig/cron 的时候常见流程是:写个 cron.go → 在 main.gogo runCron() → 改周期改代码 → 重新部署。一旦任务多了(十几个是常态),管理起来就是目录里一堆文件 + 注释开关 + 日志散落各处。

XYGo Admin 这套把三件事合到了一起:代码只管业务逻辑周期在 UI 里配日志统一入库可查。搭配 GoFrame 的上下文传递,任务里拿 ctx 就能用 g.Log()g.DB() 等全套设施,不用自己传参绕弯。

小结

对于 GoFrame 技术栈的团队,XYGo Admin 的定时任务体系不用额外集成,开箱就是一套从注册到调度到日志追踪的完整链路。改 Cron 不需要发版,手动触发方便调试,执行日志统一可查——这三个点,自己从头搭的话各要半天,加起来一天起步,但它直接给好了。

XYGo Admin 开发文档 里有定时任务和扩展开发的完整示例,拉下来就能跑。