news 2026/4/16 13:02:44

go定时任务使用xxl-job?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
go定时任务使用xxl-job?

Go 语言完全可以接入 XXL-JOB,而且有官方支持的 Go 执行器 SDK。以下是详细方案:

方案概述

XXL-JOB 采用中心化调度 + 分布式执行架构:

  • 调度中心(Admin):Java 开发,负责任务管理、调度策略

  • 执行器(Executor):Go 应用通过 SDK 接入,接收调度指令执行任务

https://www.xuxueli.com/doc/static/xxl-job/xxl-job-executor-go/architecture.png


1. 官方 Go 执行器 SDK

GitHub:github.com/xxl-job/xxl-job-executor-go

核心特性:

  • 动态注册- 自动向 XXL-JOB Admin 注册执行器

  • 任务执行- 支持同步/异步任务执行

  • 分片广播- 支持分片任务、广播任务

  • 任务取消- 支持 Kill 信号处理

  • 中间件机制- 支持日志、监控、鉴权等切面

  • 自定义日志- 可在 Admin 查看 Go 执行日志

  • Gin 集成- 可与现有 Web 服务共用端口


2. 快速接入示例

步骤 1:安装依赖

bash

复制

go get github.com/xxl-job/xxl-job-executor-go

步骤 2:编写执行器代码

go

复制

package main import ( "context" "fmt" "log" xxl "github.com/xxl-job/xxl-job-executor-go" ) func main() { // 1. 初始化执行器 exec := xxl.NewExecutor( xxl.ServerAddr("http://localhost:8080/xxl-job-admin"), // Admin 地址 xxl.AccessToken("default_token"), // 接入令牌 xxl.ExecutorPort("9999"), // 执行器端口 xxl.RegistryKey("go-executor-demo"), // 执行器名称 xxl.SetLogger(&customLogger{}), // 自定义日志 ) // 2. 初始化(启动 HTTP 服务接收调度请求) exec.Init() // 3. 注册中间件(可选:日志、监控、鉴权) exec.Use(customMiddleware) // 4. 设置日志查看 Handler(可选) exec.LogHandler(customLogHandle) // 5. 注册任务处理器 exec.RegTask("task.test", taskTest) // 普通任务 exec.RegTask("task.sharding", taskSharding) // 分片任务 // 6. 启动执行器 log.Fatal(exec.Run()) } // ========== 任务实现 ========== // 普通任务 func taskTest(ctx context.Context, param *xxl.RunReq) string { fmt.Printf("执行任务: %s, 参数: %s, 日志ID: %d\n", param.ExecutorHandler, param.ExecutorParams, param.LogID) // 模拟业务逻辑 select { case <-ctx.Done(): return "任务被取消" // 支持 Kill 信号 case <-time.After(2 * time.Second): return "执行成功" } } // 分片广播任务 func taskSharding(ctx context.Context, param *xxl.RunReq) string { // 分片参数:当前分片序号、总分片数 shardIndex := param.BroadcastIndex shardTotal := param.BroadcastTotal fmt.Printf("分片任务: 当前分片 %d / 总分片 %d\n", shardIndex, shardTotal) // 业务逻辑:根据分片处理对应数据 return fmt.Sprintf("分片 %d 执行完成", shardIndex) } // ========== 中间件 & 日志 ========== // 自定义中间件(AOP 切面) func customMiddleware(tf xxl.TaskFunc) xxl.TaskFunc { return func(ctx context.Context, param *xxl.RunReq) string { log.Println("【中间件】任务开始:", param.ExecutorHandler) start := time.Now() res := tf(ctx, param) // 执行实际任务 log.Printf("【中间件】任务结束,耗时: %v, 结果: %s", time.Since(start), res) return res } } // 自定义日志查看(Admin 页面查看日志时调用) func customLogHandle(req *xxl.LogReq) *xxl.LogRes { // 实际应从日志文件/ES 查询 return &xxl.LogRes{ Code: xxl.SuccessCode, Msg: "", Content: xxl.LogResContent{ FromLineNum: req.FromLineNum, ToLineNum: 100, LogContent: "这里是自定义日志内容...", IsEnd: true, }, } } // 自定义 Logger 实现 type customLogger struct{} func (l *customLogger) Info(format string, a ...interface{}) { fmt.Printf("[INFO] "+format+"\n", a...) } func (l *customLogger) Error(format string, a ...interface{}) { fmt.Printf("[ERROR] "+format+"\n", a...) }

3. 与 Gin 框架集成(共用端口)

如果已有 Gin Web 服务,可将 XXL-JOB 执行器作为中间件集成:

go

复制

package main import ( "github.com/gin-gonic/gin" xxl "github.com/xxl-job/xxl-job-executor-go" ) func main() { r := gin.Default() // 初始化 XXL-JOB 执行器 exec := xxl.NewExecutor( xxl.ServerAddr("http://xxl-job-admin:8080/xxl-job-admin"), xxl.AccessToken("token"), xxl.ExecutorPort("8080"), // 与 Gin 共用端口 xxl.RegistryKey("gin-executor"), ) exec.Init() exec.RegTask("api.job", handleJob) // 注册 XXL-JOB 中间件(处理 /xxl-job/* 路径) r.Use(xxlMiddleware(exec)) // 业务路由 r.GET("/api/hello", func(c *gin.Context) { c.JSON(200, gin.H{"msg": "hello"}) }) r.Run(":8080") } func xxlMiddleware(exec *xxl.Executor) gin.HandlerFunc { return func(c *gin.Context) { // 判断是否为 XXL-JOB 调度请求 if strings.HasPrefix(c.Request.URL.Path, "/xxl-job/") { // 交由 XXL-JOB 执行器处理 exec.ServeHTTP(c.Writer, c.Request) c.Abort() return } c.Next() } }

4. 阿里云 MSE XXL-JOB 托管版

如果使用阿里云 MSE XXL-JOB(托管服务),Go 接入方式相同:

go

复制

exec := xxl.NewExecutor( xxl.ServerAddr("http://xxljob-xxxx.schedulerx.mse.aliyuncs.com"), // 阿里云控制台获取 xxl.AccessToken("your-token"), // 阿里云控制台获取 xxl.RegistryKey("your-app-name"), xxl.ExecutorPort("9999"), )

5. 数据库表结构(XXL-JOB Admin 自带)

Go 执行器无需关心表结构,所有数据由 Java 版 Admin 管理。核心表包括:

表格

复制

表名说明
xxl_job_info任务配置(Cron、执行器、路由策略)
xxl_job_log任务执行日志(调度时间、执行结果、日志)
xxl_job_registry执行器注册信息(心跳维护)
xxl_job_group执行器分组管理
xxl_job_user控制台用户权限

Go 执行器作为无状态服务,只通过 HTTP 接口与 Admin 交互,不直接操作数据库。


6. 对比:Go 原生框架 vs XXL-JOB

表格

复制

特性Go 原生框架(如 gocron)XXL-JOB Go 执行器
架构单机/分布式需自建中心化调度,成熟稳定
管理界面需自建或没有开箱即用的 Web 控制台
多语言Go onlyJava/Go/Python/Shell 统一调度
运维成本低(嵌入应用)中(需部署 Admin)
适用场景纯 Go 微服务内部调度异构系统统一调度中心

选型建议:

  • 已有 XXL-JOB 基础设施 →使用 Go 执行器接入

  • 纯 Go 生态、轻量级需求 →使用 gocron 或 go-pg-scheduler

  • 复杂工作流、Saga 事务 →使用 Temporal

需要我提供Docker Compose 部署 XXL-JOB Admin + Go 执行器的完整示例吗?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 12:35:01

IndexTTS-2-LLM工具推荐:最适合开发者的TTS镜像

IndexTTS-2-LLM工具推荐&#xff1a;最适合开发者的TTS镜像 1. 为什么开发者需要一个“开箱即用”的TTS镜像&#xff1f; 你有没有遇到过这样的情况&#xff1a;项目里突然需要加一段语音播报&#xff0c;比如给用户读操作提示、生成教学音频、或者做智能客服的应答音效&…

作者头像 李华
网站建设 2026/4/15 22:15:11

bge-large-zh-v1.5镜像免配置实践:一键生成Swagger API文档与测试用例

bge-large-zh-v1.5镜像免配置实践&#xff1a;一键生成Swagger API文档与测试用例 你有没有遇到过这样的情况&#xff1a;手头有一份API接口定义&#xff0c;但要手动写文档、写测试用例&#xff0c;光是整理字段就花掉半天&#xff1f;更别说后续还要同步更新、维护版本。如果…

作者头像 李华
网站建设 2026/4/16 11:15:48

3D Face HRN模型在Ubuntu服务器上的生产环境部署

3D Face HRN模型在Ubuntu服务器上的生产环境部署 1. 为什么需要生产级部署 最近有好几位做数字人和虚拟形象的朋友问我&#xff1a;HRN模型在本地笔记本上跑得挺顺&#xff0c;但一放到服务器上就各种报错&#xff0c;GPU显存占用忽高忽低&#xff0c;多人同时请求时直接崩掉…

作者头像 李华
网站建设 2026/4/16 12:44:04

BEYOND REALITY Z-Image广告应用:智能广告模特生成系统

BEYOND REALITY Z-Image广告应用&#xff1a;智能广告模特生成系统 每次看到电商平台上那些琳琅满目的商品&#xff0c;你有没有想过一个问题&#xff1a;那些看起来光鲜亮丽的模特图&#xff0c;背后到底要花多少钱&#xff1f;请真人模特、租摄影棚、后期修图&#xff0c;一…

作者头像 李华