任务开发
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 部署组,选中对应的部署组。