写了三年定时任务还在手改 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 开发文档 里有定时任务和扩展开发的完整示例,拉下来就能跑。

相关推荐
前端那点事2 小时前
Vue3自定义Hooks保姆级教程!从原理到企业级实战,告别混乱代码
前端·vue.js
前端那点事2 小时前
别再乱用Vue3响应式!ref、reactive、toRef、toRefs完整区别+企业级落地实战
前端·vue.js
閞杺哋笨小孩2 小时前
从脚手架到构建注入:Vue 多租户「入驻」工程实践
vue.js·vite
卤蛋fg63 小时前
VxeTable 实现表尾合计行并支持数据实时统计
vue.js
杨大厨wd4 小时前
Vue3 业务组件封装别只会传 props:如何设计一个真正好用的组件
vue.js
前端那点事4 小时前
Vue3 script setup 语法糖最全教程!零基础吃透+项目落地+面试满分
前端·vue.js
卷帘依旧5 小时前
Vue 响应式原理:Object.defineProperty vs Proxy 深度对比
前端·vue.js
布局呆星5 小时前
Vue3 路由守卫详解:全局守卫、路由独享守卫、组件内守卫
前端·javascript·vue.js
小李子呢02115 小时前
前端八股Vue---ref操作 DOM 元素或组件,调用子组件方法
前端·javascript·vue.js