今天给大家介绍一个比较小众的一个定时任务框架。由于一些历史项目,或者已经上线的项目可能会选型了这个定时任务,据说当时是阿里巴巴的大佬开源的项目,当时还是比较流行的。应该是被最近市面上面比较流行的XXL-Job,Quartz,elastic-job占领,所以这个框架并没有普及开来。我个人猜测的一些原因是:一、因为社区不够活跃,参与贡献的人比较少,二、是网上的资料不多,三、入门的资料比较少,有很多刚刚接触的人不知道从何处入手,或者说不知道如何进行部署以及验证。
但是今天我介绍的并不是以上几种。而是LTS定时任务框架,刚接手的时候也是一脸懵,这是啥框架,好像之前没有怎么听说,也没有用过,问了周围的同学有没有接触,都说只是用过,没有多大深入的了解。我查看了下源码,这个框架看Gitee上面是6年没更新,支持的是Mysql5.7+,但是现在要对这个框架进行升级到支持Mysql8+。想过转换成xxl-job框架,其实就是部署之后,转换以下现有的定时任务到xxl-job上面。但是存在多个项目,不懂后续还是需要比较多的一些工作量,后面看了下lts的源码,升级就修改对应的驱动,好像也还可以,那么只能硬着头皮来从零学习一番了,下面是记录一下学习的过程,让需要的同学少走弯路。
那么本文一起认识这个框架以及着手本地搭建环境来体验一番。
LTS 初步认识
LTS 是什么?
LTS 是啥,不知道描述的是啥,后面查询了下原来是:light-task-scheduler 的缩写。
LTS(light-task-scheduler 的缩写。) 是一个分布式任务调度框架,支持设置节点组搭建多节点集群水平拓展框架架构,提供多种任务类型包括实时任务、定时任务、corn任务的支持, 主要用于系统中的任务调度以及调度信息监控等。有较好的伸缩性,扩展性,健壮稳定性而被多家公司使用。
以下是我部署后,后台截图的节点管理的截图:
LTS 源码地址
-
github地址: https://github.com/ltsopensource/light-task-scheduler -
gitee地址: https://gitee.com/hugui/light-task-scheduler -
lts 使用例子: https://github.com/ltsopensource/lts-examples -
开发文档:https://qq254963746.gitbooks.io/lts/content/
LTS 技术架构说明
LTS目前支持四种任务:
-
实时任务:提交了之后立即就要执行的任务。 -
定时任务:在指定时间点执行的任务,譬如 今天3点执行(单次)。Cron任务: -
CronExpression,和quartz类似(但是不是使用quartz实现的)譬如 0 0/1 * ? -
Repeat任务:譬如每隔5分钟执行一次,重复50次就停止。
架构设计上,LTS框架中包含以下五种类型的节点:
-
JobClient:主要负责提交任务, 并接收任务执行反馈结果。 -
JobTracker:负责接收并分配任务,任务调度。 -
TaskTracker:负责执行任务,执行完反馈给JobTracker。 -
LTS-Monitor :主要负责收集各个节点的监控信息,包括任务监控信息,节点JVM监控信息 -
LTS-Admin:(管理后台)主要负责节点管理,任务队列管理,监控管理等。
LTS的这五种节点都是无状态的,都可以部署多个,动态扩容,来实现负载均衡,实现更大的负载量, 并且框架采用FailStore策略使LTS具有很好的容错能力。
架构图如下:
-
Registry 注册中心
LTS提供多种实现,目前支持zookeeper(推荐)和redis, 主要用于LTS的节点信息暴露和master节点选举。
-
FailStore 失败存储
主要用于在部分场景远程RPC调用失败的情况,采取现存储本地KV文件系统,待远程通信恢复的时候再进行数据补偿。
目前FailStore场景,主要有RetryJobClient提交任务失败的时候,存储FailStore;TaskTracker返回任务执行结果给JobTracker的失败 时候,FailStore;TaskTracker提交BizLogger的失败的时候,存储FailStore.
目前FailStore有四种实现:leveldb,rocksdb,berkeleydb,mapdb(当然用户也可以实现扩展接口实现自己的FailStore)
-
QueueManager:任务队列
目前提供mysql(推荐)和mongodb两种实现(同样的用户可以自己扩容展示其他的,譬如oracle等),主要存储任务数据和任务执行日志等。
-
RPC:远程RPC通信框架
目前也支持多种实现,LTS自带有netty和mina,用户可以自行选择,或者自己SPI扩展实现其他的。
-
NodeGroup:节点组
同一个节点组中的任何节点都是对等的,等效的,对外提供相同的服务。譬如TaskTracker中有10个nodeGroup都是send_msg的节点组,专门执行发送短信的任务。
每个节点组中都有一个master节点,这个master节点是由LTS动态选出来的,当一个master节点挂掉之后,LTS会立马选出另外一个master节点,框架提供API监听接口给用户。
-
ClusterName:LTS集群
LTS集群,就如上图所示,整个图就是一个集群,包含LTS的五种节点。
LTS 功能清单说明
功能 | 描述 |
---|---|
节点管理 | 节点管理,节点组管理,支持分布式,避免单点故障,支持动态扩容,容错重试,节点监控、多节点任务单一执行、故障转移 |
任务队列管理 | 支持任务添加,Cron任务,Repeat任务,查看执行任务日志,暂定任务执行,等待执行任务记录,手动加载任务日志,支持按照条件筛选,支持后台动态添加任务 Spring扩展支持,SpringBoot支持,Spring Quartz Cron任务的无缝接入支持 |
日志管理 | 日志列表,支持按照条件查询 ,节点上下线日志 |
监控报警 | JobTracker数据监控,TaskTracker数据监控,JobClient数据监控 |

概念说明
节点组
-
英文名称 NodeGroup,一个节点组等同于一个小的集群,同一个节点组中的各个节点是对等的,等效的,对外提供相同的服务。 -
每个节点组中都有一个master节点,这个master节点是由LTS动态选出来的,当一个master节点挂掉之后,LTS会立马选出另外一个master节点,框架提供API监听接口给用户。
FailStore
-
顾名思义,这个主要是用于失败了存储的,主要用于节点容错,当远程数据交互失败之后,存储在本地,等待远程通信恢复的时候,再将数据提交。
-
FailStore主要用户JobClient的任务提交,TaskTracker的任务反馈,TaskTracker的业务日志传输的场景下。
-
FailStore目前提供几种实现:leveldb,rocksdb,berkeleydb,mapdb,ltsdb,用于可以自由选择使用哪种,用户也可以采用SPI扩展使用自己的实现。
LTS架构源码目录介绍
lts-core | 核心代码,其他的模块依赖的基础包 |
lts-jobtracker | 负责接收并分配任务,任务调度。 |
lts-tasktracker | 负责执行任务,执行完反馈给JobTracker。 |
lts-jobclient | 主要负责提交任务, 并接收任务执行反馈结果 |
lts-admin | (管理后台)主要负责节点管理,任务队列管理,监控管理等。 |
lts-spring | Spring 集成 |
lts-startup | 启动脚本 |
lts-monitor | 数据监控 |
lts | maven 版本依赖 |
技术框架
框架 | 说明 | 版本 |
---|---|---|
Spring MVC | 应用开发框架 | 4.2.5.RELEASE |
MySQL | 数据库服务器 | 5.7 |
Druid | JDBC 连接池、监控组件 | 1.0.14 |
Redis | key-value 数据库 | 5.0 |
LTS 定时任务框架本地环境搭建
基础的软件:需要Java JDK,Maven,Mysql,Zookeeper/Redis,Tomcat。
Java JDK
因为LTS是使用Java语言编写的,所以必须要有个Java编译运行环境,目前LTS支持JDK1.6及以上版本。
Maven
LTS项目是基于Maven做项目依赖管理的,所以用户机器上需要配置Maven环境
Mysql/Mongodb 的安装
LTS目前支持Mysql和mongodb作为任务队列的存储引擎。用户同样的选择其中一个即可。
我这里为了不加大这个部署的难度,选择了已有的Mysql来支持。
Mysql 的安装,选择mysql5.7+,下载地址为:https://dev.mysql.com/downloads/mysql/8.0.html,这个下载后一路安装就好。
Tomcat 安装
下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/ 我目前使用的是 apache-tomcat-8.5.97 解压到对应的文件夹。
删除ROOT下的文件,用于放置lts-admin.war解压的文件。
Zookeeper/Redis 安装
因LTS目前支持Zookeeper和Redis作为注册中心,主要用于节点信息暴露、监听、master节点选举。用于选择其一即可,建议zookeeper。
这个地方安装会遇到比较多的Zookeeper安装问题吧,因为现在线上也是用了Zookeeper,所以这里着重的写一下Zookeeper安装,方便对比。
方式一:本地直接安装
1、下载地址
官方最新下载:https://archive.apache.org/dist/zookeeper/ 国内镜像:https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/ 历史版本下载:https://archive.apache.org/dist/zookeeper/ 具体版本:https://archive.apache.org/dist/zookeeper/zookeeper-3.4.5/zookeeper-3.4.5.tar.gz 我目前使用的是3.4.5版本。zookeeper-3.4.5 解压到对应的文件夹。
2、进入zookeeper文件夹
D:LenovoSoftstorezookeeperzookeeper-3.4.5conf
3、修改配置文件
修改配置文件zoo_sample.cfg 重命名 为zoo.cfg。
4、修改dataDir目录默认data放在Linux的tmp路径下,会被系统定期清理。
dataDir=/tmp/zookeeper 修改成以下配置:
dataDir=D:\LenovoSoftstore\zookeeper\apache-zookeeper-3.4.5\data
dataLogDir=D:\LenovoSoftstore\zookeeper\apache-zookeeper-3.4.5\log
admin.serverPort=8082
指定dataDir路径,需要根据你的zookeeper安装路径来决定,输入完成后保存退出
配置文件参数额外说明:
-
tickTime :ZooKeeper 使用的基本时间单位(以毫秒为单位)。它用于执行心跳,最小会话超时将是 tickTime 的两倍。 -
dataDir:顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。 -
clientPort:clientPort:客户端连接zookeeper服务器的端口,zookeeper会监听这个端口,默认2181 -
initLimit:集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数(tickTime的数量) -
syncLimit:集群中flower服务器(F)跟leader(L)服务器之间的请求和答应最多能容忍的心跳数
5、如果报JAVA_HOME未配置,需要修改 binzkEnv.cmd文件 ,配置JAVA_HOME路径。
set JAVA_HOME="D:workJavajdk1.8.0_202"
6、.启动zookeeper,在/bin目录下打开cmd窗口,并执行命令 zkServer.cmd。默认启动在8080端口
7、判断 zookeeper 是否启动成功
-
打开cmd窗口 执行jps -l -v 命令会在窗口看到有如下输出 org.apache.zookeeper.server.quorum.QuorumPeerMain,表示zookeeper启动成功 。 -
查看是不是有需要2181 端口 打开cmd窗口 执行 netstat -ano | findstr 2181 命令
方式二:docker 安装测试
docker pull zookeeper
docker run -d -e TZ="Asia/Shanghai" -p 2181:2181 -v $PWD/data:/data --name zookeeper --restart always zookeeper
lts-admin 定时任务后台安装与部署
这里有几种方式,可以方便有需要的同学选择。方式一是传统的war包部署的方式,通过maven命令行编译源码,把war包放到tomcat里面即可,适合无界面的服务器方式进行的。方式二是通过idea自带的maven插件,通过packe方式
注意开始以下方式之前,需要修改下对应的配置。
方式一:手动部署的方式,方便上服务器部署。
1、通过mvn clean install -Dmaven.test.skip=true 进行打包
2、把lts-admin-{version}.war包放到tomcat下的webapp目录的ROOT下,这个是没有访问前缀。或者将 War 包放在 Tomcat 容器的 webapps 目录下,启动 Tomcat 服务后,即可运行该项目,Tomcat 服务器能够自动识别该 War 包并自动解压出一个同名的文件夹。这个是以文件夹为前缀的访问方式。
3、也可以通过idea中的maven package 插件打包,然后复制对应的war包到tomcat进行部署即可。
4、如何解决Tomcat 控制台乱码的问题
要解决启动Tomcat控制台中文乱码解决,需要调整logging.properties配置文件里面日志的编码。参考以下步骤:
(1)、中文乱码原因基本上大家安装的windows系统本地语言都是选择中文,默认是GBK编码,而IDEA或者Tomcat日志使用的是UTF-8编码,这就导致了中文显示乱码。
(2)、启动Tomcat中文乱码解决首先:找到Tomcat日志配置文件(自己的)打开。
解决控制台3个标签页的乱码问题
1catalina.org.apache.juli.AsyncFileHandler.level = FINE
1catalina.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina.
# 1catalina.org.apache.juli.AsyncFileHandler.encoding = UTF-8
1catalina.org.apache.juli.AsyncFileHandler.encoding = GBK
2localhost.org.apache.juli.AsyncFileHandler.level = FINE
2localhost.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
2localhost.org.apache.juli.AsyncFileHandler.prefix = localhost.
# 2localhost.org.apache.juli.AsyncFileHandler.encoding = UTF-8
2localhost.org.apache.juli.AsyncFileHandler.encoding = GBK
3manager.org.apache.juli.AsyncFileHandler.level = FINE
3manager.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
3manager.org.apache.juli.AsyncFileHandler.prefix = manager.
# 3manager.org.apache.juli.AsyncFileHandler.encoding = UTF-8
3manager.org.apache.juli.AsyncFileHandler.encoding = GBK
4host-manager.org.apache.juli.AsyncFileHandler.level = FINE
4host-manager.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
4host-manager.org.apache.juli.AsyncFileHandler.prefix = host-manager.
4host-manager.org.apache.juli.AsyncFileHandler.encoding = UTF-8
java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = org.apache.juli.OneLineFormatter
# java.util.logging.ConsoleHandler.encoding = UTF-8
java.util.logging.ConsoleHandler.encoding = GBK
5、浏览器访问验证
http://localhost:8080/lts-admin/
方式二:开发环境通过IDEA,挂载tomcat,方便开发做调试。
1、克隆源码,导入Idea软件
git clone https://gitee.com/hugui/light-task-scheduler.git
2、编译,添加到tomcat进行部署。
配置idea外部tomcat插件
选择对应的war包进行部署
idea 选择对应的tomcat外部文件。
3、注意修改访问路径,选择自己设定的路径进行访问。
4、浏览器访问验证
http://localhost:8080/lts-admin/
方式三:直接通过源码配置的maven tomcat 插件进行运行,很方便。
1、源码配置位置
2、关键源码配置
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<path>/</path>
<port>8081</port>
<server>tomcat</server>
<warFile>lts-admin.war</warFile>
<uriEncoding>utf-8</uriEncoding>
</configuration>
</plugin>
</plugins>
</build>
3、运行maven tomcat 插件,然后浏览器访问即可。
http://localhost:8080/lts-admin/
lts定时任务操作
1、下载对应的客户端代码
git clone https://github.com/ltsopensource/lts-examples.git
打开idea,导入对应的源码
2、对应任务提交方式
实时任务
private static void submitRealtimeJob(JobClient jobClient) {
Job job = new Job();
job.setTaskId("t_realtime_555");
job.setParam("shopId", "1122222221");
job.setTaskTrackerNodeGroup("test_trade_TaskTracker");
job.setNeedFeedback(true);
job.setReplaceOnExist(true); // 当任务队列中存在这个任务的时候,是否替换更新
Response response = jobClient.submitJob(job);
System.out.println(response);
}
定时任务
private static void submitTriggerTimeJob(JobClient jobClient) {
Job job = new Job();
job.setTaskId("t_trigger_time_555");
job.setParam("shopId", "1122222221");
job.setTaskTrackerNodeGroup("test_trade_TaskTracker");
job.setNeedFeedback(true);
job.setReplaceOnExist(true); // 当任务队列中存在这个任务的时候,是否替换更新
job.setTriggerTime(DateUtils.addHour(new Date(), 1).getTime()); // 1 小时之后执行
Response response = jobClient.submitJob(job);
System.out.println(response);
}
Cron任务
private static void submitCronJob(JobClient jobClient) {
Job job = new Job();
job.setTaskId("t_cron_555");
job.setParam("shopId", "1122222221");
job.setTaskTrackerNodeGroup("test_trade_TaskTracker"); // 执行要执行该任务的taskTracker的节点组名称
job.setNeedFeedback(true);
job.setReplaceOnExist(true); // 当任务队列中存在这个任务的时候,是否替换更新
job.setCronExpression("0 0/1 * * * ?");
Response response = jobClient.submitJob(job);
System.out.println(response);
}
Repeat任务
private static void submitRepeatJob(JobClient jobClient) {
Job job = new Job();
job.setTaskId("t_repeat_555");
job.setParam("shopId", "1122222221");
job.setTaskTrackerNodeGroup("test_trade_TaskTracker");
job.setNeedFeedback(true);
job.setReplaceOnExist(true); // 当任务队列中存在这个任务的时候,是否替换更新
job.setRepeatCount(50); // 一共执行50次
job.setRepeatInterval(50 * 1000L); // 50s 执行一次
Response response = jobClient.submitJob(job);
System.out.println(response);
}
数据监控
JobClient数据监控
JobClient数据监控
TaskTracker数据监控
TaskTracker数据监控
JobTracker数据监控
JobTracker数据监控
很有很多地方还没有深入的去研究,这个可以运行示例来看看对应的方法,再做一下深入的。如果大家有兴趣的话,可以点赞和留言,怎么更新Mysql5.7+升级到Mysql 8+ 。
最后
一个致力于分享技术、职场技能和创业经验方面的知识和经验,内容包括但不限于Java技术、技术趋势、开源项目和技术架构公众号。持续关注互联网和科技的发展,分享人工智能和其他前沿技术的信息,陪你一起成长。
欢迎关注,星标,以及收藏,防止想用的时候没有找到。这样每次新文章推送才会第一时间出现在你的订阅列表里。 世间千变万化,我们才不会擦肩而过……
原文始发于微信公众号(souvc):开源推荐:一个支持实时,定时,Cron任务,轻量级分布式任务调度框架
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/205988.html