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

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

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

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

注册一个任务,三行代码

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

go 复制代码
// 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),定时任务的隔离做得也很干净:

go 复制代码
// 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 开发文档 里有定时任务和扩展开发的完整示例,拉下来就能跑。

相关推荐
秃头网友小李3 天前
前端难点:keep-alive 缓存什么?RouterView 的 key 为什么要带 scopeId?
前端·vue.js
徐小夕3 天前
JitWord 3.0 正式发布,高精度Word异构解析+复杂组件兼容,打造web端协同Word编辑器
前端·vue.js·算法
奋斗吧程序媛4 天前
补充一个小知识点:有关@click.native
前端·vue.js
英勇无比的消炎药4 天前
一行命令背后:TinyRobot CLI 如何重构 AI 对话接入的效率范式
vue.js·aigc
jay神4 天前
基于 FastAPI + Vue 的宠物领养管理系统
前端·vue.js·python·毕业设计·fastapi·宠物
一杯奶茶¥4 天前
水果销售网站 CRM客户信息管理系统 超市管理系 酒店管理系统 健身房管理系统 在线音乐网站 校园招聘系统
java·vue.js·spring boot·mysql·spring·java项目
英勇无比的消炎药4 天前
一站式搞定品牌风格:TinyRobot 主题定制从入门到精通
vue.js
尽欢i4 天前
Vue3 customRef 封神教程:防抖、本地存储、自动埋点一套搞定,模板干干净净
前端·javascript·vue.js
因_崔斯汀4 天前
Vue 模板编译:HTML 是怎么变成 JS 的?
前端·vue.js
英勇无比的消炎药4 天前
样式随心定制:TinyRobot 样式覆写与 CSS 变量实战解析
vue.js