# lts-springboot **Repository Path**: kennylee/lts-springboot ## Basic Information - **Project Name**: lts-springboot - **Description**: springboot+lts+gradle使用例子。lts详细见 http://git.oschina.net/hugui/light-task-scheduler - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 8 - **Forks**: 3 - **Created**: 2017-01-10 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # lts-springboot 实践 [LTS(light-task-scheduler)](http://git.oschina.net/hugui/light-task-scheduler) 时用的项目,由于官方例子的一些使用习惯和自己的一些开发习惯有点差别,所以便有了此项目,SpringBoot+Lts+Gradle。 ## 关于使用LTS的一些问题 ### 1、环境 * 安装zookeeper,mysql。 * JobTracker应用 * TaskTracker应用(用多少部署多少,至少1个好吧) * Admin后台 其中,mysql需要建立一个名为 `lts` 的数据库(默认情况下),至于表什么的就不用了,因为程序自动创建。 `Monitor` 和 `JobClient` 通常使用上可以忽略,因为两者都被admin后台包含在内。`JobClient` 可在admin后台创建 `提交节点组`,也可以自由创建任务。 ### 2、TaskTracker(业务逻辑实现) 是用来编写具体业务逻辑的,具体做法是实现 `com.github.ltsopensource.tasktracker.runner.JobRunner`接口 一个TaskTracker,对应有一个NodeGroup的名字,而这个名字可以通过将作为执行调度程序的重要标识。所以,若要创建多个调度任务的时候是否需要建立多个TaskTracker?开始看LTS的时候是这么认为的,但也是比较奇怪,因为这样比较浪费资源啊。官网上虽然写着一个TaskTracker,可以有多个任务(`JobRunner`),但很容易就理解成是一次执行一连串任务了。最后才发现,其实TaskTracker中执行一连串或者一个其实可以自己控制(可参考 [lts-tasktracker](http://git.oschina.net/kennylee/lts-springboot/tree/master/lts-tasktracker) 的`com.github.ltsopensource.example.springboot.JobRunnerDispatcher`)。 例如,当用户想执行某个任务的时候,只要先指定 `NodeGroup` ,然后加上特定的过滤条件,例如 `name`,并且绑定对应的调度任务(`JobRunner`)。当然,这个 `name` 的标识其实可以很灵活的,例如用配置文件映射中文名什么的都是可以的。但暂时不搞那么复杂先了。 然后,通过 `lts-admin` 可以根据目前业务需求进行发布任务,当想指定使用TaskTracker中某个任务的时候,记得传入下面参数。 ```json {"name":"任务A"} ``` 具体界面参考如下: ![](http://o9z7obv49.bkt.clouddn.com/2017-01-13-14842889083256.jpg) 在这个使用上,我其实是比较有保留意见的,因为让使用者输入 `json` ...这个体验比较差了。 同样的,想要一次执行 `TaskTracker` 其中的几个也是可以的。 #### 2.1、编写TaskTracker 编写TaskTracker,比较简单,只要实现 `com.github.ltsopensource.tasktracker.runner.JobRunner`接口即可,当然,还要把实例放到spring上下文中,所以也需要增加 `@Component` 注解在类上。请参考下图: ```java @Component class JobRunnerA implements JobRunner { private static final Logger LOGGER = LoggerFactory.getLogger(JobRunnerA.class); @Override public Result run(JobContext jobContext) throws Throwable { try { Job job = jobContext.getJob(); // 获取用户传入的参数 String type = job.getParam("name"); LOGGER.debug("我是: " + type); BizLogger bizLogger = jobContext.getBizLogger(); // TODO 业务逻辑 LOGGER.info("我是JobRunnerA,我要执行:" + jobContext); // 会发送到 LTS (JobTracker上) bizLogger.info("测试,业务日志啊啊啊啊啊"); } catch (Exception e) { LOGGER.info("Run job failed!", e); return new Result(Action.EXECUTE_FAILED, e.getMessage()); } return new Result(Action.EXECUTE_SUCCESS, "执行成功了,哈哈"); } } ``` run方法体类,编写自己的业务代码,再通过返回 `Result` 来告知业务执行情况即可,最简单的情况下,也可以把 `Result` 看作是 `Boolean` 。 获取用户传入的参数: ```java jobContext.getJob().getParam("name"); ``` 通过以上方法,可以获取用户执行任务时传入的业务参数,更多的API和使用方法可查看[LTS官方代码和文档](http://git.oschina.net/hugui/light-task-scheduler) #### 2.2、配置说明 配置文件见 `src/main/resources/application.yml` 默认内容如下: ```yml lts: tasktracker: cluster-name: default_cluster registry-address: zookeeper://192.168.3.232:5181 node-group: foo_trade_TaskTracker configs: job: fail: store: mapdb bind-ip: 192.168.3.206 --- lts: tasktracker: jobrunner: mapper: - "JobRunnerA" : "任务A" - "JobRunnerB" : "任务B" ``` 详细的配置信息参考官方的[参数说明](https://qq254963746.gitbooks.io/lts/content/use/config-name.html) 。但提醒注意以下配置: * bind-ip 配置 `TaskTracker` 部署的机器IP,内网或者外网IP都可以,只要确保可以跟 `jobtracker` 等部署的节点机器**互相访问**即可。 * mapper 配置编写的 `TaskTracker` 的别名,供用户在admin管理系统指定tasktracker时使用,为了方便用户使用。key为编写的 `TaskTracker` 的类名,值为别名,可任意填写。 可不写,默认别名跟类名一直。 ## 操作命令 ``` # 调试启用tasktracker gradle :lts-tasktracker:bootRun # 调试启用jobtracker gradle :lts-jobtracker:bootRun # 打包 gradle :lts-tasktracker:build -x test gradle :lts-jobtracker:build -x test ```