开发一个简单的 Java 任务

最近更新时间: 2026-06-30 15:06:00

任务开发

Maven 配置

找到 Maven 所使用的配置文件 settings.xml,一般为 ~/.m2/settings.xml,添加 TCT Maven 地址。


<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">

  <pluginGroups></pluginGroups>
  <proxies></proxies>
  <servers></servers>
  <mirrors></mirrors>

  <profiles>
      <profile>
        <id>nexus</id>
        <repositories>
            <repository>
                <id>central</id>
                <url>http://repo1.maven.org/maven2</url>
                <releases>
                    <enabled>true</enabled>
                </releases>
                <snapshots>
                    <enabled>true</enabled>
                </snapshots>
            </repository>
        </repositories>
        <pluginRepositories>
            <pluginRepository>
                <id>central</id>
                <url>http://repo1.maven.org/maven2</url>
                <releases>
                    <enabled>true</enabled>
                </releases>
                <snapshots>
                    <enabled>true</enabled>
                </snapshots>
            </pluginRepository>
        </pluginRepositories>
    </profile>
    <profile>
        <id>tct</id>
        <repositories>
            <repository>
                <id>tct</id>
                <name>tct</name>
                <url>https://mirrors.cloud.tencent.com/nexus/repository/maven-public/</url>
                <releases>
                    <enabled>true</enabled>
                </releases>
                <snapshots>
                    <enabled>true</enabled>
                </snapshots>
            </repository>
        </repositories>
    </profile>
  </profiles>
  
  <activeProfiles>
    <activeProfile>nexus</activeProfile>
    <activeProfile>tct</activeProfile>
 </activeProfiles>
 
</settings>

POM 依赖配置

在 pom.xml 文件中添加 TCT 依赖:

<dependency>
    <groupId>com.tencent.cloud</groupId>
    <artifactId>tct-spring-boot-starter</artifactId>
    <version>2.1.0-rc8</version>
</dependency>

任务编写

通过实现分布式任务调度框架中的 ExecutableTask 及 TerminableTask 接口,编写任务。在 execute 方法中实现任务执行逻辑,在 cancel 方法中实现任务停止逻辑,示例如下:

package com.tencent.cloud.tct;

import com.tencent.cloud.task.sdk.client.LogReporter;
import com.tencent.cloud.task.sdk.client.model.ExecutableTaskData;
import com.tencent.cloud.task.sdk.client.model.ProcessResult;
import com.tencent.cloud.task.sdk.client.model.ProcessResultCode;
import com.tencent.cloud.task.sdk.client.model.TerminateResult;
import com.tencent.cloud.task.sdk.client.remoting.TaskExecuteFuture;
import com.tencent.cloud.task.sdk.client.spi.ExecutableTask;
import com.tencent.cloud.task.sdk.client.spi.TerminableTask;
import org.springframework.stereotype.Component;
import org.apache.commons.lang3.RandomUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.lang.invoke.MethodHandles;

/**
 * 模拟简单的任务, 执行时间在10s ~ 15s之间, 可以终止。
 */
 @Component
public class SimpleTask implements ExecutableTask,TerminableTask {
    private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
    @Override
    public 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");
            
            // Sleep 来模拟任务执行时间
            long sleepTime = RandomUtils.nextLong(10000, 15000);
            Thread.sleep(sleepTime);

            result.setResultCode(ProcessResultCode.SUCCESS);
            LogReporter.log(taskData, "Execute SimpleLogExecutableTask succeeded");
        } catch (InterruptedException e) {
            result.setResultCode(ProcessResultCode.TERMINATED);
            LogReporter.log(taskData, "Task is terminated... ");
        } catch (Throwable t) {
            LOG.error(t.getMessage(), t);
            result.setResultCode(ProcessResultCode.FAIL);
        }
        return  result;
    }

    @Override
    public TerminateResult cancel(TaskExecuteFuture future, ExecutableTaskData taskData) {
        LogReporter.log(taskData, "To cancel task");
        future.cancel(true);
        LogReporter.log(taskData,"Task cancel success");
        return TerminateResult.newTerminateSuccessResult();
    }
}

注意:单纯通过 Future 的 cancel 方法,并一定能够停止正在运行中的任务,通常需要业务逻辑实现上进行配合。在上述例子中,任务线程处于 Sleep 状态,这时候 Future 的 cancel 方法给任务线程发送中断信号, 任务线程会抛出 InterruptedException 异常,上述例子中我们正确捕获了该异常以终止任务。关于如何正确开发可停止任务请参照后续【Java 开发】中相关章节。

创建部署组

注意:如果通过微服务平台(Service Framework,TSF)部署任务应用,则不需要创建部署组。
在部署组管理中,点击【新建部署组】按钮新建一个部署组。这里项目是用作权限控制,可以先任意选择一个有权限的项目。并发数配置的是该部署组下的任务应用(或者称之为执行器实例)允许多少个任务并发在上面执行,0表示不限制。

创建完成后点开部署组详情,在这里我们可以拿到部署组 ID 以及 TCT 服务端地址,后面配置任务的时候会用到。

任务配置

TCT 任务可以通过两种方式进行配置,一种是 application.yml 文件,一种是通过命令行参数,例如 -Dtct.client.groupId。
详细的配置参数说明以及如何获取,请参考后续【Java 开发】中【任务配置】章节。
这里需要重点注意的是,instanceId 表示一个应用实例的 ID,必须在部署组范围内是唯一的。

application.yml

tct:
  enabled: true
  server:
    host: 10.0.8.24
    port: 28000
  client:
    groupId: BjFnVcXkVw
    instanceId: tct-demo-ins1
    accessKey: xxx
    secretKey: xxx
    environments:
      - Java

命令行参数

java \
-Dtct.server.host=10.0.8.24 \
-Dtct.server.port=28000 \
-Dtct.client.groupId=BjFnVcXkVw \
-Dtct.client.instanceId=tct-demo-ins1 \
-Dtct.client.accessKey=xxx \
-Dtct.client.secretKey=xxx \
-jar tct-demo.jar

任务部署

TCT 并不限定任务的部署方式,任务应用可以采用任意的方式进行部署,例如虚机部署、Docker 部署,或者其他应用或服务发布平台进行部署。

TSF 部署

TCT 已经和微服务平台(Service Framework,TSF)打通,如果通过 TSF 进行部署,无需手动在 TCT 创建部署组,TCT 能够直接识别 TSF 部署进行任务调度。
前往 TSF 控制台,上传应用 jar 包,然后前往部署组管理页面部署应用即可。

虚机部署

直接启动 Java 进程,并通过命令行参数配置相关参数。

java \
-Dtct.server.host=server.shanghai.tct \
-Dtct.server.port=28000 \
-Dtct.client.groupId=BjFnVcXkVw \
-Dtct.client.instanceId=tct-demo-ins1 \
-Dtct.client.accessKey=xxx \
-Dtct.client.secretKey=xxx \
-jar tct-demo.jar

容器部署

将 Jar 包打包成镜像,并通过 Docker 进行启动:

docker run tct-demo:v0.1 java \
-Dtct.server.host=server.shanghai.tct \
-Dtct.server.port=28000 \
-Dtct.client.groupId=BjFnVcXkVw \
-Dtct.client.instanceId=tct-demo-ins1 \
-Dtct.client.accessKey=xxx \
-Dtct.client.secretKey=xxx \
-jar tct-demo.jar

查看执行器实例

任务应用成功启动后,会注册到 TCT 对应的部署组中,并且会上报该任务应用支持的任务类型以及内置的任务列表。可以在部署组详情页查看对应的执行器信息:

创建任务

创建任务时选择刚才创建的部署组,然后选中开发的 Java 预制任务 SimpleTask。
如果前面是通过 TSF 部署的任务应用,则创建任务时选择 TSF 部署组,选中对应的部署组。