说明:
由于产品策略调整, 分布式任务调度(TCT)将于北京时间2025年12月30日正式下线。为避免影响用户的业务运行,本文提供 TCT 任务迁移至同类开源工具 XXL-JOB 的通用指引,协助用户完成过渡。
背景
分布式任务调度(TCT)在公有云下架,协助客户完成下架迁移至替代开源产品 XXL-JOB 。
TCT 和 XXL-JOB 功能清单
TCT 模块 | 功能点 | XXL-JOB | 说明 |
任务管理 | 新建/编辑/删除/启用/停用 | ✓ | - |
任务触发 | 手动触发任务执行一次 | ✓ | - |
| 周期触发 | ✓ | - |
| 定时触发 | ✓ | - |
| 工作流触发 | × | - |
任务调度/执行 | Java类型任务 | ✓ | - |
| 随机单节点执行 | ✓ | - |
| 广播执行 | ✓ | - |
| 分片执行 | ✓ | XXL-JOB 不支持配置分片数 |
| 任务超时设定 | ✓ | - |
| 失败重试 | ✓ | - |
| 任务参数传递 | ✓ | - |
| 分片任务参数传递 | ✓ | - |
| 分片任务单机并发控制 | × | - |
| 手动重新执行失败任务 | × | - |
| 停止任务 | ✓ | - |
| 分片子任务失败断点续跑 | × | - |
工作流管理 | 新建/编辑/删除/启用/停用 | × | XXL-JOB 可通过父子任务实现简单任务编排 |
执行记录 | 搜索/查看任务执行记录 | ✓ | - |
| 搜索/查看工作流执行记录 | × | - |
| 执行记录过期自动清理 | × | XXL-JOB 支持手动批量清理 |
执行日志 | 查看任务执行日志 | ✓ | - |
监控告警 | 任务失败告警 | ✓ | - |
| 工作流失败告警 | × | - |
认证鉴权 | 执行器注册 Token 认证 | ✓ | - |
| 用户登录认证 | ✓ | - |
| 用户资源鉴权 | ✓ | XXL-JOB 仅支持执行器资源维度鉴权 |
注意:
XXL-JOB 支持父子任务,对于不涉及原 TCT 工作流逻辑节点的简单工作流可以在 XXL-JOB 中通过父子任务实现简单任务编排
迁移步骤
部署 XXL-JOB 调度中心
资源清单(推荐):
模块 | 副本数 | 节点规格 | 部署模式 |
调度中心 | 2 | 4c8g | 集群部署 |
数据库MySQL | 2 | 4c8g | 主从部署 |
CLB | - | - | - |
部署架构(推荐):

CLB 可选,执行器可直连多个调度器节点。部署完成后,访问 XXL-JOB 控制台页面验证部署成功。
TCT 任务改造
TCT 以 Java 类为单位开发任务,在新建/编辑任务时输入完整类名识别任务。
XXL-JOB 同时支持类任务和方法任务,因此在我们既可以 TCT 任务类改造为 XXL-JOB 任务,也可以将其改造为任务方法。
我们保持 TCT 任务使用习惯以一个例子来说明 TCT 任务类改造为 XXL-JOB 任务类流程(用户也可参考 XXL-JOB 官方文档将其改造为方法),一个典型的 TCT 任务实现如下:
/*** 模拟简单的任务, 执行时间在10s ~ 15s之间, 可以终止。*/@Componentpublic class SimpleLogExecutableTask implements ExecutableTask, TerminableTask {@Overridepublic ProcessResult execute(ExecutableTaskData taskData) {ProcessResult result = new ProcessResult();try {LogReporter.log(taskData, "start to execute SimpleLogExecutableTask...");LogReporter.log(taskData, "hello, this is a demo for SimpleLogExecutableTask");long sleepTime = RandomUtils.nextLong(10000, 15000);Thread.sleep(sleepTime);result.setResultCode(ProcessResultCode.SUCCESS);} catch (InterruptedException e) {result.setResultCode(ProcessResultCode.TERMINATED);LogReporter.log(taskData, "task is terminated... ");} catch (Throwable t) {result.setResultCode(ProcessResultCode.FAIL);}return result;}@Overridepublic TerminateResult cancel(TaskExecuteFuture future, ExecutableTaskData taskData) {LogReporter.log(taskData, "task start to cancel");future.cancel(true);LogReporter.log(taskData, "task cancel success");return TerminateResult.newTerminateSuccessResult();}}
以 Maven 项目为例,在 POM 中引入 xxl-job-core 依赖:
<dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>3.1.0</version></dependency>
修改 TCT 任务实现为 XXL-JOB 的实现, 将其中实现 ExecutableTask 的方式修改为继承 自"com.xxl.job.core.handler.IJobHandler"的JobHandler类,实现 execute 方法。
public class SimpleLogExecutableTask extends IJobHandler {public void execute() {try {String param = XxlJobHelper.getJobParam();XxlJobHelper.log("xxl job param: {}", param);XxlJobHelper.log("start to execute SimpleLogExecutableTask...");XxlJobHelper.log("hello, this is a demo for SimpleLogExecutableTask");long sleepTime = RandomUtils.nextLong(10000, 15000);Thread.sleep(sleepTime);} catch (InterruptedException e) {XxlJobHelper.log("task is terminated... ");} catch (Throwable t) {XxlJobHelper.log("task is failed... ");}}}
手动通过如下方式注入到执行器容器:
@PostConstructpublic void registerJobHandlers() {XxlJobExecutor.registJobHandler("SimpleLogExecutableTask", new SimpleLogExecutableTask());}
注意:
在实现任务终止时,TCT 任务提供了 cancel 接口接收任务终止指令,但是 XXL-JOB 中没有类似接口,XXL-JOB 任务终止指令是向任务执行线程发送 interrupt 信号,如果 XXL-JOB 任务内部未捕获该异常或是 catch 到了该异常并消化掉的话, 任务终止功能将不可用。
测试
执行器部署
执行器配置如下:
### 调度中心部署根地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin### 调度中心通讯TOKEN [选填]:非空时启用;xxl.job.admin.accessToken=default_token### 调度中心通讯超时时间[选填],单位秒;默认3s;xxl.job.admin.timeout=3### 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册xxl.job.executor.appname=xxl-job-executor-sample### 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。xxl.job.executor.address=### 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯使用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";xxl.job.executor.ip=### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;xxl.job.executor.port=9999### 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler### 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;xxl.job.executor.logretentiondays=30
关键配置说明:
配置项 | 说明 |
xxl.job.admin.addresses | 调度中心地址,如果使用了 LB 则填入 LB 地址。 |
xxl.job.admin.accessToken | 需要和服务端保持一致。调度中心和执行器,如果需要正常通讯,只有两种设置: 设置一:调度中心和执行器,均不设置 AccessToken,关闭安全性校验; 设置二:调度中心和执行器,设置了相同的 AccessToken。 |
xxl.job.executor.appname | 分组依据。相同 appname 的执行器视为同一个分组,限定了分片/广播任务调度时作用域。类似 TCT 部署组概念。 |
xxl.job.executor.address | 执行器 HTTP 服务地址,用于接收调度中心请求。 |
xxl.job.executor.port | 执行器 HTTP 服务端口,用于接收调度中心请求。 |
创建 XXL-JOB 任务
登录 XXL-JOB 控制台,默认账号 admin/123456,新建 XXL-JOB 任务与如下 TCT 任务有相同配置:


验证任务可以成功执行:


TCT 任务迁移
按照以上步骤改造完成后,可灰度迁移。以迁移 TSF 部署组 A 下所有任务和执行器为例,步骤如下:
1. 按照以上步骤改造 TSF 部署组A下 TCT 执行器为 XXL-JOB 类型执行器并部署注册;
2. 新建 XXL-JOB 任务(注意与原 TCT 任务同名同配置)并停用;
3. 手动测试验证 XXL-JOB 任务正常执行;
4. 启用 XXL-JOB任务,停用 TCT 任务;
5. 业务观察一段时间(比如一周),如无问题,可删除所有 TCT 任务,并下线 TSF 部署组A下所有执行器。