light-task-scheduler是一个分布式定时任务调度框架,功能上类似xxl-job。
项目地址:
github:GitHub - ltsopensource/light-task-scheduler: Distributed Scheduled Job Framework
gitee:light-task-scheduler: 分布式任务调度框架, 支持 实时任务;支持定时任务 (如:3天之后执行);CronExpression 任务(如:0 0/1 * * * ?)
Dockerfile内容如下
# 第一阶段:构建应用
FROM maven:3.6.2-jdk-8 AS builder
WORKDIR /root
# 更新APT源列表
#RUN sed -i "s@http://deb.debian.org@http://mirrors.aliyun.com@g" /etc/apt/sources.list
#RUN sed -i "s@http://deb.debian.org@http://mirrors.aliyun.com/debian-archive@g" /etc/apt/sources.list
#RUN sed -i "s@http://deb.debian.org@http://archive.debian.org@g" /etc/apt/sources.list
RUN wget -O /etc/apt/sources.list https://static.lty.fun/%E5%85%B6%E4%BB%96%E8%B5%84%E6%BA%90/SourcesList/Debian-9-archive-qcloud.list
RUN apt-get update && \
apt-get install -y --no-install-recommends zip && \
rm -rf /var/lib/apt/lists/* \
#旧版debian源参考 https://luotianyi.vc/7428.html
# 应用maven镜像配置
#COPY settings.xml /usr/share/maven/ref/
COPY settings.xml /root/.m2/
# 下载lts源码
RUN wget https://github.com/ltsopensource/light-task-scheduler/archive/refs/tags/1.7.0.tar.gz -O /root/light-task-scheduler-1.7.0.tar.gz
# 复制源代码到容器中
RUN tar -zxf light-task-scheduler-1.7.0.tar.gz
WORKDIR /root/light-task-scheduler-1.7.0
# 替换mysql jdbc驱动版本号 <mysql.version>5.1.26</mysql.version> 改成 <mysql.version>8.0.23</mysql.version>
RUN sed -i "s@<mysql.version>5.1.26</mysql.version>@<mysql.version>8.0.23</mysql.version>@g" pom.xml
# druid.version 需要从1.0.14 改成 1.2.8
RUN sed -i "s@<druid.version>1.0.14</druid.version>@<druid.version>1.2.8</druid.version>@g" pom.xml
# 执行构建命令
RUN sh build.sh
WORKDIR /root/light-task-scheduler-1.7.0/dist
# 执行构建命令
RUN unzip lts-1.7.0-bin.zip
# 第二阶段:部署到jdk8
FROM openjdk:8
WORKDIR /root
# 将lts目录放到app目录
COPY --from=builder /root/light-task-scheduler-1.7.0/dist /root
# 拷贝lts-admin配置
COPY lts-admin.cfg /root/lts-1.7.0-bin/conf
COPY lts-monitor.cfg /root/lts-1.7.0-bin/conf
# 拷贝lts-admin配置
COPY lts-admin.sh /root/lts-1.7.0-bin/bin
WORKDIR /root/lts-1.7.0-bin/bin
# 暴露80端口
EXPOSE 8081
# 启动lts-admin服务
CMD ["sh", "-c", "sh lts-admin.sh start && tail -f /dev/null"]
# Usage: lts-admin.sh {start|stop|restart}
dockerfile用到的文件
settings.xml
<?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">
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
</settings>
sources.list
# main
deb [check-valid-until=no] http://mirrors.cloud.tencent.com/debian-archive/debian/ stretch main non-free contrib
deb-src [check-valid-until=no] http://mirrors.cloud.tencent.com/debian-archive/debian/ stretch main non-free contrib
# sercurity
#deb http://mirrors.cloud.tencent.com/debian-archive/debian-security/ stretch/updates main contrib non-free
#deb-src http://mirrors.cloud.tencent.com/debian-archive/debian-security/ stretch/updates main contrib non-free
# backports
#deb [check-valid-until=no] http://mirrors.cloud.tencent.com/debian-archive/debian/ stretch-backports main non-free contrib
#deb-src [check-valid-until=no] http://mirrors.cloud.tencent.com/debian-archive/debian/ stretch-backports main non-free contrib
lts-admin.cfg
// 后台的用户名密码
console.username=admin
console.password=admin
# 注册中心地址,可以是zk,也可以是redis
registryAddress=zookeeper://127.0.0.1:2181
# registryAddress=redis://127.0.0.1:6379
# 集群名称
clusterName=test_cluster
# zk客户端,可选值 zkclient, curator
configs.zk.client=zkclient
# ------ 这个是Admin存储数据的地方,也可以和JobQueue的地址一样 ------
configs.jdbc.url=jdbc:mysql://127.0.0.1:3306/lts
configs.jdbc.username=root
configs.jdbc.password=root
# admin 数据使用mysql 默认 mysql, 可以自行扩展
jdbc.datasource.provider=mysql
# 使用 可选值 fastjson, jackson
# configs.lts.json=fastjson
# 是否在admin启动monitor服务, monitor服务也可以单独启动
lts.monitorAgent.enable=true
#======================以下相关配置是JobTracker的JobQueue和JobLogger的相关配置 要保持和JobTracker一样==========================
## (可选配置)jobT. 开头的, 因为JobTracker和Admin可能使用的数据库不是同一个
# LTS业务日志, 可选值 mysql, mongo
jobT.job.logger=mysql
# ---------以下是任务队列配置-----------
# 任务队列,可选值 mysql, mongo
jobT.job.queue=mysql
# ------ 1. 如果是mysql作为任务队列 (如果不配置,表示和Admin的在一个数据库)------
# jobT.jdbc.url=jdbc:mysql://127.0.0.1:3306/lts
# jobT.jdbc.username=root
# jobT.jdbc.password=root
# ------ 2. 如果是mongo作为任务队列 ------
# jobT.mongo.addresses=127.0.0.1:27017
# jobT.mongo.database=lts
# jobT.mongo.username=xxx #如果有的话
# jobT.mongo.password=xxx #如果有的话
# admin 数据使用mysql 默认 mysql, 可以自行扩展
# jobT.jdbc.datasource.provider=mysql
registryAddress configs.jdbc.url configs.jdbc.username configs.jdbc.password 改成自己的
lts-monitor.cfg
# 注册中心地址,可以是zk,也可以是redis
registryAddress=zookeeper://zookeeper:2181
# registryAddress=redis://127.0.0.1:6379
# 集群名称
clusterName=test_cluster
# LTS业务日志, 可选值 mysql, mongo
configs.job.logger=mysql
# zk客户端,可选值 zkclient, curator
configs.zk.client=zkclient
# ---------以下是任务队列配置-----------
# 任务队列,可选值 mysql, mongo
configs.job.queue=mysql
# ------ 1. 如果是mysql作为任务队列 ------
configs.jdbc.url=jdbc:mysql://mysql:3306/lts
configs.jdbc.username=root
configs.jdbc.password=root
# ------ 2. 如果是mongo作为任务队列 ------
configs.mongo.addresses=127.0.0.1:27017
configs.mongo.database=lts
# configs.mongo.username=xxx #如果有的话
# configs.mongo.password=xxx #如果有的话
# admin 数据使用mysql, h2 默认 h2 embedded
jdbc.datasource.provider=mysql
# 使用 可选值 fastjson, jackson
# configs.lts.json=fastjson
registryAddress configs.jdbc.url configs.jdbc.username configs.jdbc.password 改成自己的
lts-admin.sh
#!/usr/bin/env bash
# JVMFLAGS JVM参数可以在这里设置
JVMFLAGS=-Dfile.encoding=UTF-8
LTS_ADMIN_HOME="${BASH_SOURCE-$0}"
LTS_ADMIN_HOME="$(dirname "${LTS_ADMIN_HOME}")"
LTS_ADMIN_HOME="$(cd "${LTS_ADMIN_HOME}"; pwd)"
if [ "$JAVA_HOME" != "" ]; then
JAVA="$JAVA_HOME/bin/java"
else
JAVA=java
fi
#把lib下的所有jar都加入到classpath中
for i in "$LTS_ADMIN_HOME"/../war/jetty/lib/*.jar
do
CLASSPATH="$i:$CLASSPATH"
done
# echo $CLASSPATH
mkdir -p $LTS_ADMIN_HOME/../logs
mkdir -p $LTS_ADMIN_HOME/../pid
# 转化为绝对路径
CONF_HOME="$LTS_ADMIN_HOME/../."
CONF_HOME=$(cd "$(dirname "$CONF_HOME")"; pwd)
# echo $CONF_HOME
_LTS_DAEMON_OUT="$LTS_ADMIN_HOME/../logs/lts-admin.out"
LTS_MAIN="com.github.ltsopensource.startup.admin.JettyContainer"
LTS_PID_FILE="$LTS_ADMIN_HOME/../pid/lts-admin.pid"
case $1 in
start)
echo "Starting LTS LTS-Admin ... "
if [ -f "$LTS_PID_FILE" ]; then
if kill -0 `cat "$LTS_PID_FILE"` > /dev/null 2>&1; then
echo $command already running as process `cat "$LTS_PID_FILE"`.
exit 0
fi
fi
nohup "$JAVA" -Djava.io.tmpdir=/home/work/tmp -cp "$CLASSPATH" $JVMFLAGS $LTS_MAIN "$CONF_HOME" > "$_LTS_DAEMON_OUT" 2>&1 < /dev/null &
if [ $? -eq 0 ]
then
if /bin/echo -n $! > "$LTS_PID_FILE"
then
sleep 1
echo "STARTED"
else
echo "FAILED TO WRITE PID"
exit 1
fi
else
echo "LTS_ADMIN DID NOT START"
exit 1
fi
;;
restart)
sh $0 stop
sleep 3
sh $0 start
;;
stop)
echo "Stopping LTS LTS-Admin ... "
if [ ! -f "$LTS_PID_FILE" ]
then
echo "no LTS-Admin to started (could not find file $LTS_PID_FILE)"
else
kill -9 $(cat "$LTS_PID_FILE")
rm "$LTS_PID_FILE"
echo "STOPPED"
fi
exit 0
;;
*)
echo "Usage: $0 {start|stop|restart}" >&2
esac
构建命令
docker build -t lts:1.7.0 .
docker-compose配置
lts:
container_name: lts
image: 'lts:1.7.0'
ports:
- '8081:8081'
volumes:
- '${PWD}/lts/logs:/root/lts-1.7.0-bin/logs'
environment:
- TZ=Asia/Shanghai
restart: always
可以通过logs看到访问地址
如果是curl测试 需要加上-u
curl -uadmin localhost:8081/index.htm
之后按提示输入密码得到首页的返回结果
不得不说,这次配置坑太多了,踩坑如下
1.lts的打包脚本,win打包的是目录,linux打包的是zip包,最开始dockerfile照着windows写根本出不来结果
2.debian旧版镜像源配置问题,说到底还是国内企业环境用debian的少,旧版镜像的配置文章少之又少。centos的旧版源配置搜一搜就有。
3.lts的mysql驱动升级问题。旧版用的5驱动,但是现在mysql大多数升级到8了,驱动需要升级。
4.lts服务不定期挂掉问题,根据github上的issue改了sh文件里的temp目录后正常。