当前位置: 首页 > news >正文

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 执行器的完整示例吗?

http://www.jsqmd.com/news/357990/

相关文章:

  • 双馈永磁风电机组与永磁同步机并网仿真模型:开启风电仿真新体验
  • GLM-Image多场景落地:短视频封面生成、小红书配图、微信公众号头图案例
  • 如何利用jQuery实现大文件的分片上传和断点续传?
  • 基于大模型技术的春联生成模型架构解析
  • Qwen-Image-Edit衍生模型AnythingtoRealCharacters2511参数详解与提示词优化指南
  • IndexTTS-2-LLM工具推荐:最适合开发者的TTS镜像
  • Ollama部署本地大模型|translategemma-12b-it技术文档截图翻译效果展示
  • Qwen2-VL-2B-Instruct快速部署:Docker镜像免配置方案(附requirements.txt)
  • BHH德耀真营养原装实力品牌排名情况如何 - 工业设备
  • Qwen3-ASR-0.6B数据库集成:MySQL语音日志分析平台
  • PowerPaint-V1镜像免配置亮点:一键启动含日志监控+错误自动重试机制
  • nomic-embed-text-v2-moe效果展示:法律条文中英文条款语义等价性验证
  • Pi0机器人控制中心镜像免配置:Docker一键拉起Gradio Web终端
  • 2026年伸缩悬臂货架口碑好的品牌推荐排名 - myqiye
  • 从零开始部署LongCat-Image-Edit V2:Linux环境保姆级教程
  • Qwen-Image-2512-SDNQ Web服务效果实测:复杂材质(丝绸/金属/玻璃)反射表现
  • 开源可部署|translategemma-27b-it支持中文→阿拉伯语/希伯来语等RTL语言翻译
  • 烟台隐形车衣店怎么选择,靠谱推荐带你少走弯路 - 工业品网
  • Token高效管理:浦语灵笔2.5-7B长文本处理技巧
  • Qwen3-ASR-0.6B效果实测:复杂噪声环境识别对比
  • DamoFD人脸检测模型快速上手:3分钟启动conda环境并运行推理脚本
  • HY-Motion 1.0多场景应用:单模型支撑虚拟偶像、数字员工、AI教练三类终端
  • FLUX.1-dev-fp8-dit教育应用:Java学习路线图可视化生成
  • 思看科技技术实力如何?180项专利含71项发明铸就行业标杆 - 匠言榜单
  • GPEN镜像性能压测报告:单节点QPS达17,P99延迟<3200ms
  • DeepSeek-R1-Distill-Qwen-1.5B惊艳效果:同一数学题不同解法路径的思维链并行生成
  • DeepSeek-OCR-2云原生部署:Kubernetes集群方案
  • 2026年福建靠谱的拉拉裤堆垛机厂家排名,肯能机械榜上有名 - mypinpai
  • GLM-Image优化技巧:使用Typora管理AI生成内容文档
  • AI净界RMBG-1.4与Docker容器化部署方案