news 2026/3/5 2:32:46

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/3/4 0:38:09

Qwen3-TTS-Tokenizer-12Hz开源大模型:Apache 2.0协议商用友好无授权风险

Qwen3-TTS-Tokenizer-12Hz开源大模型&#xff1a;Apache 2.0协议商用友好无授权风险 你是否遇到过这样的问题&#xff1a;想在语音产品中嵌入高质量音频压缩能力&#xff0c;却卡在授权模糊、商用受限、部署复杂这三座大山前&#xff1f;Qwen3-TTS-Tokenizer-12Hz来了——它不…

作者头像 李华
网站建设 2026/3/4 0:59:02

GTE模型与Kubernetes集成指南:构建高可用文本处理服务

GTE模型与Kubernetes集成指南&#xff1a;构建高可用文本处理服务 1. 为什么需要把GTE模型放进Kubernetes 你可能已经用过GTE模型做文本向量化&#xff0c;比如计算两句话的相似度&#xff0c;或者为RAG系统准备文档向量。但当业务规模上来后&#xff0c;问题就来了&#xff…

作者头像 李华
网站建设 2026/3/4 3:30:04

Qwen3-Reranker-0.6B部署教程:适配昇腾/寒武纪等国产AI芯片环境方案

Qwen3-Reranker-0.6B部署教程&#xff1a;适配昇腾/寒武纪等国产AI芯片环境方案 1. 为什么你需要一个轻量又靠谱的重排序模型 你是不是也遇到过这样的问题&#xff1a;RAG系统里&#xff0c;检索模块返回了10个文档&#xff0c;但真正有用的可能只有前2个&#xff1b;后8个要…

作者头像 李华
网站建设 2026/3/4 5:58:36

Qwen3-ASR-0.6B在Python数据分析中的语音控制应用

Qwen3-ASR-0.6B在Python数据分析中的语音控制应用 1. 当键盘和鼠标都“累了”的时候 你有没有过这样的时刻&#xff1a;正埋头处理一份复杂的销售数据&#xff0c;手指在键盘上敲得发酸&#xff0c;眼睛盯着屏幕上的Excel表格和Jupyter Notebook&#xff0c;突然想换个方式—…

作者头像 李华
网站建设 2026/3/4 0:59:14

大厂在用的低代码工具!只需配置json即可快速生成前端界面的

&#x1f482; 个人网站: IT知识小屋&#x1f91f; 版权: 本文由【IT学习日记】原创、在CSDN首发、需要转载请联系博主&#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 文章目录简介技术栈实现原理快速上手开源地址&使用手册写在最后简介 …

作者头像 李华