commit
652ec2b6ee
|
|
@ -33,3 +33,114 @@ yarn.lock
|
|||
package-lock.json
|
||||
config.gypi
|
||||
test/coverage
|
||||
/docs/zh_CN/介绍
|
||||
/docs/zh_CN/贡献代码.md
|
||||
/escheduler-common/src/main/resources/zookeeper.properties
|
||||
escheduler-alert/logs/
|
||||
escheduler-alert/src/main/resources/alert.properties_bak
|
||||
escheduler-alert/src/main/resources/logback.xml
|
||||
escheduler-server/src/main/resources/logback.xml
|
||||
escheduler-ui/dist/css/common.16ac5d9.css
|
||||
escheduler-ui/dist/css/home/index.b444b91.css
|
||||
escheduler-ui/dist/css/login/index.5866c64.css
|
||||
escheduler-ui/dist/js/0.ac94e5d.js
|
||||
escheduler-ui/dist/js/0.ac94e5d.js.map
|
||||
escheduler-ui/dist/js/1.0b043a3.js
|
||||
escheduler-ui/dist/js/1.0b043a3.js.map
|
||||
escheduler-ui/dist/js/10.1bce3dc.js
|
||||
escheduler-ui/dist/js/10.1bce3dc.js.map
|
||||
escheduler-ui/dist/js/11.79f04d8.js
|
||||
escheduler-ui/dist/js/11.79f04d8.js.map
|
||||
escheduler-ui/dist/js/12.420daa5.js
|
||||
escheduler-ui/dist/js/12.420daa5.js.map
|
||||
escheduler-ui/dist/js/13.e5bae1c.js
|
||||
escheduler-ui/dist/js/13.e5bae1c.js.map
|
||||
escheduler-ui/dist/js/14.f2a0dca.js
|
||||
escheduler-ui/dist/js/14.f2a0dca.js.map
|
||||
escheduler-ui/dist/js/15.45373e8.js
|
||||
escheduler-ui/dist/js/15.45373e8.js.map
|
||||
escheduler-ui/dist/js/16.fecb0fc.js
|
||||
escheduler-ui/dist/js/16.fecb0fc.js.map
|
||||
escheduler-ui/dist/js/17.84be279.js
|
||||
escheduler-ui/dist/js/17.84be279.js.map
|
||||
escheduler-ui/dist/js/18.307ea70.js
|
||||
escheduler-ui/dist/js/18.307ea70.js.map
|
||||
escheduler-ui/dist/js/19.144db9c.js
|
||||
escheduler-ui/dist/js/19.144db9c.js.map
|
||||
escheduler-ui/dist/js/2.8b4ef29.js
|
||||
escheduler-ui/dist/js/2.8b4ef29.js.map
|
||||
escheduler-ui/dist/js/20.4c527e9.js
|
||||
escheduler-ui/dist/js/20.4c527e9.js.map
|
||||
escheduler-ui/dist/js/21.831b2a2.js
|
||||
escheduler-ui/dist/js/21.831b2a2.js.map
|
||||
escheduler-ui/dist/js/22.2b4bb2a.js
|
||||
escheduler-ui/dist/js/22.2b4bb2a.js.map
|
||||
escheduler-ui/dist/js/23.81467ef.js
|
||||
escheduler-ui/dist/js/23.81467ef.js.map
|
||||
escheduler-ui/dist/js/24.54a00e4.js
|
||||
escheduler-ui/dist/js/24.54a00e4.js.map
|
||||
escheduler-ui/dist/js/25.8d7bd36.js
|
||||
escheduler-ui/dist/js/25.8d7bd36.js.map
|
||||
escheduler-ui/dist/js/26.2ec5e78.js
|
||||
escheduler-ui/dist/js/26.2ec5e78.js.map
|
||||
escheduler-ui/dist/js/27.3ab48c2.js
|
||||
escheduler-ui/dist/js/27.3ab48c2.js.map
|
||||
escheduler-ui/dist/js/28.363088a.js
|
||||
escheduler-ui/dist/js/28.363088a.js.map
|
||||
escheduler-ui/dist/js/29.6c5853a.js
|
||||
escheduler-ui/dist/js/29.6c5853a.js.map
|
||||
escheduler-ui/dist/js/3.a0edb5b.js
|
||||
escheduler-ui/dist/js/3.a0edb5b.js.map
|
||||
escheduler-ui/dist/js/30.940fdd3.js
|
||||
escheduler-ui/dist/js/30.940fdd3.js.map
|
||||
escheduler-ui/dist/js/31.168a460.js
|
||||
escheduler-ui/dist/js/31.168a460.js.map
|
||||
escheduler-ui/dist/js/32.8df6594.js
|
||||
escheduler-ui/dist/js/32.8df6594.js.map
|
||||
escheduler-ui/dist/js/33.4480bbe.js
|
||||
escheduler-ui/dist/js/33.4480bbe.js.map
|
||||
escheduler-ui/dist/js/34.b407fe1.js
|
||||
escheduler-ui/dist/js/34.b407fe1.js.map
|
||||
escheduler-ui/dist/js/35.f340b0a.js
|
||||
escheduler-ui/dist/js/35.f340b0a.js.map
|
||||
escheduler-ui/dist/js/36.8880c2d.js
|
||||
escheduler-ui/dist/js/36.8880c2d.js.map
|
||||
escheduler-ui/dist/js/37.ea2a25d.js
|
||||
escheduler-ui/dist/js/37.ea2a25d.js.map
|
||||
escheduler-ui/dist/js/38.98a59ee.js
|
||||
escheduler-ui/dist/js/38.98a59ee.js.map
|
||||
escheduler-ui/dist/js/39.a5e958a.js
|
||||
escheduler-ui/dist/js/39.a5e958a.js.map
|
||||
escheduler-ui/dist/js/4.4ca44db.js
|
||||
escheduler-ui/dist/js/4.4ca44db.js.map
|
||||
escheduler-ui/dist/js/40.e187b1e.js
|
||||
escheduler-ui/dist/js/40.e187b1e.js.map
|
||||
escheduler-ui/dist/js/41.0e89182.js
|
||||
escheduler-ui/dist/js/41.0e89182.js.map
|
||||
escheduler-ui/dist/js/42.341047c.js
|
||||
escheduler-ui/dist/js/42.341047c.js.map
|
||||
escheduler-ui/dist/js/43.27b8228.js
|
||||
escheduler-ui/dist/js/43.27b8228.js.map
|
||||
escheduler-ui/dist/js/44.e8869bc.js
|
||||
escheduler-ui/dist/js/44.e8869bc.js.map
|
||||
escheduler-ui/dist/js/45.8d54901.js
|
||||
escheduler-ui/dist/js/45.8d54901.js.map
|
||||
escheduler-ui/dist/js/5.e1ed7f3.js
|
||||
escheduler-ui/dist/js/5.e1ed7f3.js.map
|
||||
escheduler-ui/dist/js/6.241ba07.js
|
||||
escheduler-ui/dist/js/6.241ba07.js.map
|
||||
escheduler-ui/dist/js/7.ab2e297.js
|
||||
escheduler-ui/dist/js/7.ab2e297.js.map
|
||||
escheduler-ui/dist/js/8.83ff814.js
|
||||
escheduler-ui/dist/js/8.83ff814.js.map
|
||||
escheduler-ui/dist/js/9.39cb29f.js
|
||||
escheduler-ui/dist/js/9.39cb29f.js.map
|
||||
escheduler-ui/dist/js/common.733e342.js
|
||||
escheduler-ui/dist/js/common.733e342.js.map
|
||||
escheduler-ui/dist/js/home/index.78a5d12.js
|
||||
escheduler-ui/dist/js/home/index.78a5d12.js.map
|
||||
escheduler-ui/dist/js/login/index.291b8e3.js
|
||||
escheduler-ui/dist/js/login/index.291b8e3.js.map
|
||||
escheduler-ui/dist/lib/external/
|
||||
escheduler-ui/src/js/conf/home/pages/projects/pages/taskInstance/index.vue
|
||||
/escheduler-dao/src/main/resources/dao/data_source.properties
|
||||
|
|
|
|||
|
|
@ -0,0 +1,70 @@
|
|||
EasyScheduler提交代码流程
|
||||
=====
|
||||
* 首先从远端仓库*https://github.com/analysys/EasyScheduler.git* fork一份代码到自己的仓库中
|
||||
|
||||
* 远端仓库中目前有三个分支:
|
||||
* master 正常交付分支
|
||||
* dev 日常开发分支
|
||||
* branch-1.0.0 发布版本分支
|
||||
|
||||
* 把自己仓库clone到本地
|
||||
|
||||
`git clone https://github.com/**/EasyScheduler.git`
|
||||
|
||||
* 添加远端仓库地址,命名为upstream
|
||||
|
||||
` git remote add upstream https://github.com/analysys/EasyScheduler.git `
|
||||
|
||||
* 查看仓库:
|
||||
|
||||
` git remote -v`
|
||||
|
||||
> 此时会有两个仓库:origin(自己的仓库)和upstream(远端仓库)
|
||||
|
||||
* 获取远端仓库代码(已经是最新代码,就跳过)
|
||||
|
||||
`git fetch upstream `
|
||||
|
||||
* 更新远端仓库代码
|
||||
|
||||
```
|
||||
git checkout upstream/dev
|
||||
|
||||
git pull upstream dev
|
||||
```
|
||||
|
||||
* 同步远端仓库代码到本地仓库
|
||||
|
||||
```
|
||||
git checkout origin/dev
|
||||
git merge --no-ff upstream/dev
|
||||
|
||||
```
|
||||
|
||||
* 在本地修改代码以后,提交到自己仓库:
|
||||
|
||||
`git ca -m 'test commit'`
|
||||
`git push`
|
||||
|
||||
* 将修改提交到远端仓库
|
||||
|
||||
* 在github页面,点击New pull request.
|
||||
<p align="center">
|
||||
<img src="http://geek.analysys.cn/static/upload/221/2019-04-02/90f3abbf-70ef-4334-b8d6-9014c9cf4c7f.png" width="60%" />
|
||||
</p>
|
||||
|
||||
* 选择修改完的本地分支和要合并过去的分支,Create pull request.
|
||||
<p align="center">
|
||||
<img src="http://geek.analysys.cn/static/upload/221/2019-04-02/fe7eecfe-2720-4736-951b-b3387cf1ae41.png" width="60%" />
|
||||
</p>
|
||||
* 接下来由管理员负责将**Merge**完成此次pull request
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
#Maintin by jimmy
|
||||
#Email: zhengge2012@gmail.com
|
||||
FROM anapsix/alpine-java:8_jdk
|
||||
WORKDIR /tmp
|
||||
RUN wget http://archive.apache.org/dist/maven/maven-3/3.6.1/binaries/apache-maven-3.6.1-bin.tar.gz
|
||||
RUN tar -zxvf apache-maven-3.6.1-bin.tar.gz && rm apache-maven-3.6.1-bin.tar.gz
|
||||
RUN mv apache-maven-3.6.1 /usr/lib/mvn
|
||||
RUN chown -R root:root /usr/lib/mvn
|
||||
RUN ln -s /usr/lib/mvn/bin/mvn /usr/bin/mvn
|
||||
RUN wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
|
||||
RUN tar -zxvf zookeeper-3.4.6.tar.gz
|
||||
RUN mv zookeeper-3.4.6 /opt/zookeeper
|
||||
RUN rm -rf zookeeper-3.4.6.tar.gz
|
||||
RUN echo "export ZOOKEEPER_HOME=/opt/zookeeper" >>/etc/profile
|
||||
RUN echo "export PATH=$PATH:$ZOOKEEPER_HOME/bin" >>/etc/profile
|
||||
ADD conf/zoo.cfg /opt/zookeeper/conf/zoo.cfg
|
||||
#RUN source /etc/profile
|
||||
#RUN zkServer.sh start
|
||||
RUN apk add --no-cache git npm nginx mariadb mariadb-client mariadb-server-utils pwgen
|
||||
WORKDIR /opt
|
||||
RUN git clone https://github.com/analysys/EasyScheduler.git
|
||||
WORKDIR /opt/EasyScheduler
|
||||
RUN mvn -U clean package assembly:assembly -Dmaven.test.skip=true
|
||||
RUN mv /opt/EasyScheduler/target/escheduler-1.0.0-SNAPSHOT /opt/easyscheduler
|
||||
WORKDIR /opt/EasyScheduler/escheduler-ui
|
||||
RUN npm install
|
||||
RUN npm audit fix
|
||||
RUN npm run build
|
||||
RUN mkdir -p /opt/escheduler/front/server
|
||||
RUN cp -rfv dist/* /opt/escheduler/front/server
|
||||
WORKDIR /
|
||||
RUN rm -rf /opt/EasyScheduler
|
||||
#configure mysql server https://github.com/yobasystems/alpine-mariadb/tree/master/alpine-mariadb-amd64
|
||||
ADD conf/run.sh /scripts/run.sh
|
||||
RUN mkdir /docker-entrypoint-initdb.d && \
|
||||
mkdir /scripts/pre-exec.d && \
|
||||
mkdir /scripts/pre-init.d && \
|
||||
chmod -R 755 /scripts
|
||||
RUN rm -rf /var/cache/apk/*
|
||||
EXPOSE 8888
|
||||
ENTRYPOINT ["/scripts/run.sh"]
|
||||
14
README.md
14
README.md
|
|
@ -45,12 +45,24 @@ Easy Scheduler
|
|||
|
||||
更多文档请参考 <a href="https://analysys.github.io/easyscheduler_docs_cn/" target="_blank">easyscheduler中文在线文档</a>
|
||||
|
||||
|
||||
### 近期研发计划
|
||||
|
||||
EasyScheduler的工作计划:<a href="https://github.com/analysys/EasyScheduler/projects/1" target="_blank">研发计划</a> ,其中 In Develop卡片下是1.0.2版本的功能,TODO卡片是待做事项(包括 feature ideas)
|
||||
|
||||
### 贡献代码
|
||||
|
||||
非常欢迎大家来参与贡献代码,提交代码流程请参考:
|
||||
https://github.com/analysys/EasyScheduler/blob/master/CONTRIBUTING.md
|
||||
|
||||
|
||||
### 感谢
|
||||
|
||||
- Easy Scheduler使用了很多优秀的开源项目,比如google的guava、guice、grpc,netty,ali的bonecp,quartz,以及apache的众多开源项目等等,
|
||||
Easy Scheduler使用了很多优秀的开源项目,比如google的guava、guice、grpc,netty,ali的bonecp,quartz,以及apache的众多开源项目等等,
|
||||
正是由于站在这些开源项目的肩膀上,才有Easy Scheduler的诞生的可能。对此我们对使用的所有开源软件表示非常的感谢!我们也希望自己不仅是开源的受益者,也能成为开源的
|
||||
贡献者,于是我们决定把易调度贡献出来,并承诺长期维护。也希望对开源有同样热情和信念的伙伴加入进来,一起为开源献出一份力!
|
||||
|
||||
|
||||
### 帮助
|
||||
The fastest way to get response from our developers is to submit issues, or add our wechat : 510570367
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,31 @@
|
|||
server {
|
||||
listen 8888;# 访问端口
|
||||
server_name localhost;
|
||||
#charset koi8-r;
|
||||
#access_log /var/log/nginx/host.access.log main;
|
||||
location / {
|
||||
root /opt/escheduler/front/server; # 静态文件目录
|
||||
index index.html index.html;
|
||||
}
|
||||
location /escheduler {
|
||||
proxy_pass http://127.0.0.1:12345; # 接口地址
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header x_real_ipP $remote_addr;
|
||||
proxy_set_header remote_addr $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_http_version 1.1;
|
||||
proxy_connect_timeout 4s;
|
||||
proxy_read_timeout 30s;
|
||||
proxy_send_timeout 12s;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
}
|
||||
#error_page 404 /404.html;
|
||||
# redirect server error pages to the static page /50x.html
|
||||
#
|
||||
error_page 500 502 503 504 /50x.html;
|
||||
location = /50x.html {
|
||||
root /usr/share/nginx/html;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,310 @@
|
|||
#!/bin/sh
|
||||
|
||||
workDir=`/opt/easyscheduler`
|
||||
workDir=`cd ${workDir};pwd`
|
||||
|
||||
#To be compatible with MacOS and Linux
|
||||
txt=""
|
||||
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||
# Mac OSX
|
||||
txt="''"
|
||||
elif [[ "$OSTYPE" == "linux-gnu" ]]; then
|
||||
# linux
|
||||
txt=""
|
||||
elif [[ "$OSTYPE" == "cygwin" ]]; then
|
||||
# POSIX compatibility layer and Linux environment emulation for Windows
|
||||
echo "Easy Scheduler not support Windows operating system"
|
||||
exit 1
|
||||
elif [[ "$OSTYPE" == "msys" ]]; then
|
||||
# Lightweight shell and GNU utilities compiled for Windows (part of MinGW)
|
||||
echo "Easy Scheduler not support Windows operating system"
|
||||
exit 1
|
||||
elif [[ "$OSTYPE" == "win32" ]]; then
|
||||
echo "Easy Scheduler not support Windows operating system"
|
||||
exit 1
|
||||
elif [[ "$OSTYPE" == "freebsd"* ]]; then
|
||||
# ...
|
||||
txt=""
|
||||
else
|
||||
# Unknown.
|
||||
echo "Operating system unknown, please tell us(submit issue) for better service"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
source ${workDir}/conf/config/run_config.conf
|
||||
source ${workDir}/conf/config/install_config.conf
|
||||
|
||||
# mysql配置
|
||||
# mysql 地址,端口
|
||||
mysqlHost="127.0.0.1:3306"
|
||||
|
||||
# mysql 数据库名称
|
||||
mysqlDb="easyscheduler"
|
||||
|
||||
# mysql 用户名
|
||||
mysqlUserName="easyscheduler"
|
||||
|
||||
# mysql 密码
|
||||
mysqlPassword="easyschedulereasyscheduler"
|
||||
|
||||
# conf/config/install_config.conf配置
|
||||
# 安装路径,不要当前路径(pwd)一样
|
||||
installPath="/opt/easyscheduler"
|
||||
|
||||
# 部署用户
|
||||
deployUser="escheduler"
|
||||
|
||||
# zk集群
|
||||
zkQuorum="192.168.xx.xx:2181,192.168.xx.xx:2181,192.168.xx.xx:2181"
|
||||
|
||||
# 安装hosts
|
||||
ips="ark0,ark1,ark2,ark3,ark4"
|
||||
|
||||
# conf/config/run_config.conf配置
|
||||
# 运行Master的机器
|
||||
masters="ark0,ark1"
|
||||
|
||||
# 运行Worker的机器
|
||||
workers="ark2,ark3,ark4"
|
||||
|
||||
# 运行Alert的机器
|
||||
alertServer="ark3"
|
||||
|
||||
# 运行Api的机器
|
||||
apiServers="ark1"
|
||||
|
||||
# alert配置
|
||||
# 邮件协议
|
||||
mailProtocol="SMTP"
|
||||
|
||||
# 邮件服务host
|
||||
mailServerHost="smtp.exmail.qq.com"
|
||||
|
||||
# 邮件服务端口
|
||||
mailServerPort="25"
|
||||
|
||||
# 发送人
|
||||
mailSender="xxxxxxxxxx"
|
||||
|
||||
# 发送人密码
|
||||
mailPassword="xxxxxxxxxx"
|
||||
|
||||
# 下载Excel路径
|
||||
xlsFilePath="/tmp/xls"
|
||||
|
||||
|
||||
# hadoop 配置
|
||||
# 是否启动hdfs,如果启动则为true,需要配置以下hadoop相关参数;
|
||||
# 不启动设置为false,如果为false,以下配置不需要修改
|
||||
hdfsStartupSate="false"
|
||||
|
||||
# namenode地址,支持HA,需要将core-site.xml和hdfs-site.xml放到conf目录下
|
||||
namenodeFs="hdfs://mycluster:8020"
|
||||
|
||||
# resourcemanager HA配置,如果是单resourcemanager,这里为空即可
|
||||
yarnHaIps="192.168.xx.xx,192.168.xx.xx"
|
||||
|
||||
# 如果是单 resourcemanager,只需要配置一个主机名称,如果是resourcemanager HA,则默认配置就好
|
||||
singleYarnIp="ark1"
|
||||
|
||||
# hdfs根路径,根路径的owner必须是部署用户
|
||||
hdfsPath="/escheduler"
|
||||
|
||||
# common 配置
|
||||
# 程序路径
|
||||
programPath="/tmp/escheduler"
|
||||
|
||||
#下载路径
|
||||
downloadPath="/tmp/escheduler/download"
|
||||
|
||||
# 任务执行路径
|
||||
execPath="/tmp/escheduler/exec"
|
||||
|
||||
# SHELL环境变量路径
|
||||
shellEnvPath="$installPath/conf/env/.escheduler_env.sh"
|
||||
|
||||
# Python换将变量路径
|
||||
pythonEnvPath="$installPath/conf/env/escheduler_env.py"
|
||||
|
||||
# 资源文件的后缀
|
||||
resSuffixs="txt,log,sh,conf,cfg,py,java,sql,hql,xml"
|
||||
|
||||
# 开发状态,如果是true,对于SHELL脚本可以在execPath目录下查看封装后的SHELL脚本,如果是false则执行完成直接删除
|
||||
devState="true"
|
||||
|
||||
# zk 配置
|
||||
# zk根目录
|
||||
zkRoot="/escheduler"
|
||||
|
||||
# 用来记录挂掉机器的zk目录
|
||||
zkDeadServers="/escheduler/dead-servers"
|
||||
|
||||
# masters目录
|
||||
zkMasters="/escheduler/masters"
|
||||
|
||||
# workers目录
|
||||
zkWorkers="/escheduler/workers"
|
||||
|
||||
# zk master分布式锁
|
||||
mastersLock="/escheduler/lock/masters"
|
||||
|
||||
# zk worker分布式锁
|
||||
workersLock="/escheduler/lock/workers"
|
||||
|
||||
# zk master容错分布式锁
|
||||
mastersFailover="/escheduler/lock/failover/masters"
|
||||
|
||||
# zk worker容错分布式锁
|
||||
workersFailover="/escheduler/lock/failover/masters"
|
||||
|
||||
# zk session 超时
|
||||
zkSessionTimeout="300"
|
||||
|
||||
# zk 连接超时
|
||||
zkConnectionTimeout="300"
|
||||
|
||||
# zk 重试间隔
|
||||
zkRetrySleep="100"
|
||||
|
||||
# zk重试最大次数
|
||||
zkRetryMaxtime="5"
|
||||
|
||||
|
||||
# master 配置
|
||||
# master执行线程最大数,流程实例的最大并行度
|
||||
masterExecThreads="100"
|
||||
|
||||
# master任务执行线程最大数,每一个流程实例的最大并行度
|
||||
masterExecTaskNum="20"
|
||||
|
||||
# master心跳间隔
|
||||
masterHeartbeatInterval="10"
|
||||
|
||||
# master任务提交重试次数
|
||||
masterTaskCommitRetryTimes="5"
|
||||
|
||||
# master任务提交重试时间间隔
|
||||
masterTaskCommitInterval="100"
|
||||
|
||||
# master最大cpu平均负载,用来判断master是否还有执行能力
|
||||
masterMaxCupLoadAvg="10"
|
||||
|
||||
# master预留内存,用来判断master是否还有执行能力
|
||||
masterReservedMemory="1"
|
||||
|
||||
|
||||
# worker 配置
|
||||
# worker执行线程
|
||||
workerExecThreads="100"
|
||||
|
||||
# worker心跳间隔
|
||||
workerHeartbeatInterval="10"
|
||||
|
||||
# worker一次抓取任务数
|
||||
workerFetchTaskNum="10"
|
||||
|
||||
# worker最大cpu平均负载,用来判断master是否还有执行能力
|
||||
workerMaxCupLoadAvg="10"
|
||||
|
||||
# worker预留内存,用来判断master是否还有执行能力
|
||||
workerReservedMemory="1"
|
||||
|
||||
# api 配置
|
||||
# api 服务端口
|
||||
apiServerPort="12345"
|
||||
|
||||
# api session 超时
|
||||
apiServerSessionTimeout="7200"
|
||||
|
||||
# api 上下文路径
|
||||
apiServerContextPath="/escheduler/"
|
||||
|
||||
# spring 最大文件大小
|
||||
springMaxFileSize="1024MB"
|
||||
|
||||
# spring 最大请求文件大小
|
||||
springMaxRequestSize="1024MB"
|
||||
|
||||
# api 最大post请求大小
|
||||
apiMaxHttpPostSize="5000000"
|
||||
|
||||
# 1,替换文件
|
||||
echo "1,替换文件"
|
||||
sed -i ${txt} "s#spring.datasource.url.*#spring.datasource.url=jdbc:mysql://${mysqlHost}/${mysqlDb}?characterEncoding=UTF-8#g" conf/dao/data_source.properties
|
||||
sed -i ${txt} "s#spring.datasource.username.*#spring.datasource.username=${mysqlUserName}#g" conf/dao/data_source.properties
|
||||
sed -i ${txt} "s#spring.datasource.password.*#spring.datasource.password=${mysqlPassword}#g" conf/dao/data_source.properties
|
||||
|
||||
sed -i ${txt} "s#org.quartz.dataSource.myDs.URL.*#org.quartz.dataSource.myDs.URL=jdbc:mysql://${mysqlHost}/${mysqlDb}?characterEncoding=UTF-8#g" conf/quartz.properties
|
||||
sed -i ${txt} "s#org.quartz.dataSource.myDs.user.*#org.quartz.dataSource.myDs.user=${mysqlUserName}#g" conf/quartz.properties
|
||||
sed -i ${txt} "s#org.quartz.dataSource.myDs.password.*#org.quartz.dataSource.myDs.password=${mysqlPassword}#g" conf/quartz.properties
|
||||
|
||||
|
||||
sed -i ${txt} "s#fs.defaultFS.*#fs.defaultFS=${namenodeFs}#g" conf/common/hadoop/hadoop.properties
|
||||
sed -i ${txt} "s#yarn.resourcemanager.ha.rm.ids.*#yarn.resourcemanager.ha.rm.ids=${yarnHaIps}#g" conf/common/hadoop/hadoop.properties
|
||||
sed -i ${txt} "s#yarn.application.status.address.*#yarn.application.status.address=http://${singleYarnIp}:8088/ws/v1/cluster/apps/%s#g" conf/common/hadoop/hadoop.properties
|
||||
|
||||
sed -i ${txt} "s#data.basedir.path.*#data.basedir.path=${programPath}#g" conf/common/common.properties
|
||||
sed -i ${txt} "s#data.download.basedir.path.*#data.download.basedir.path=${downloadPath}#g" conf/common/common.properties
|
||||
sed -i ${txt} "s#process.exec.basepath.*#process.exec.basepath=${execPath}#g" conf/common/common.properties
|
||||
sed -i ${txt} "s#data.store2hdfs.basepath.*#data.store2hdfs.basepath=${hdfsPath}#g" conf/common/common.properties
|
||||
sed -i ${txt} "s#hdfs.startup.state.*#hdfs.startup.state=${hdfsStartupSate}#g" conf/common/common.properties
|
||||
sed -i ${txt} "s#escheduler.env.path.*#escheduler.env.path=${shellEnvPath}#g" conf/common/common.properties
|
||||
sed -i ${txt} "s#escheduler.env.py.*#escheduler.env.py=${pythonEnvPath}#g" conf/common/common.properties
|
||||
sed -i ${txt} "s#resource.view.suffixs.*#resource.view.suffixs=${resSuffixs}#g" conf/common/common.properties
|
||||
sed -i ${txt} "s#development.state.*#development.state=${devState}#g" conf/common/common.properties
|
||||
|
||||
sed -i ${txt} "s#zookeeper.quorum.*#zookeeper.quorum=${zkQuorum}#g" conf/zookeeper.properties
|
||||
sed -i ${txt} "s#zookeeper.escheduler.root.*#zookeeper.escheduler.root=${zkRoot}#g" conf/zookeeper.properties
|
||||
sed -i ${txt} "s#zookeeper.escheduler.dead.servers.*#zookeeper.escheduler.dead.servers=${zkDeadServers}#g" conf/zookeeper.properties
|
||||
sed -i ${txt} "s#zookeeper.escheduler.masters.*#zookeeper.escheduler.masters=${zkMasters}#g" conf/zookeeper.properties
|
||||
sed -i ${txt} "s#zookeeper.escheduler.workers.*#zookeeper.escheduler.workers=${zkWorkers}#g" conf/zookeeper.properties
|
||||
sed -i ${txt} "s#zookeeper.escheduler.lock.masters.*#zookeeper.escheduler.lock.masters=${mastersLock}#g" conf/zookeeper.properties
|
||||
sed -i ${txt} "s#zookeeper.escheduler.lock.workers.*#zookeeper.escheduler.lock.workers=${workersLock}#g" conf/zookeeper.properties
|
||||
sed -i ${txt} "s#zookeeper.escheduler.lock.failover.masters.*#zookeeper.escheduler.lock.failover.masters=${mastersFailover}#g" conf/zookeeper.properties
|
||||
sed -i ${txt} "s#zookeeper.escheduler.lock.failover.workers.*#zookeeper.escheduler.lock.failover.workers=${workersFailover}#g" conf/zookeeper.properties
|
||||
sed -i ${txt} "s#zookeeper.session.timeout.*#zookeeper.session.timeout=${zkSessionTimeout}#g" conf/zookeeper.properties
|
||||
sed -i ${txt} "s#zookeeper.connection.timeout.*#zookeeper.connection.timeout=${zkConnectionTimeout}#g" conf/zookeeper.properties
|
||||
sed -i ${txt} "s#zookeeper.retry.sleep.*#zookeeper.retry.sleep=${zkRetrySleep}#g" conf/zookeeper.properties
|
||||
sed -i ${txt} "s#zookeeper.retry.maxtime.*#zookeeper.retry.maxtime=${zkRetryMaxtime}#g" conf/zookeeper.properties
|
||||
|
||||
sed -i ${txt} "s#master.exec.threads.*#master.exec.threads=${masterExecThreads}#g" conf/master.properties
|
||||
sed -i ${txt} "s#master.exec.task.number.*#master.exec.task.number=${masterExecTaskNum}#g" conf/master.properties
|
||||
sed -i ${txt} "s#master.heartbeat.interval.*#master.heartbeat.interval=${masterHeartbeatInterval}#g" conf/master.properties
|
||||
sed -i ${txt} "s#master.task.commit.retryTimes.*#master.task.commit.retryTimes=${masterTaskCommitRetryTimes}#g" conf/master.properties
|
||||
sed -i ${txt} "s#master.task.commit.interval.*#master.task.commit.interval=${masterTaskCommitInterval}#g" conf/master.properties
|
||||
sed -i ${txt} "s#master.max.cpuload.avg.*#master.max.cpuload.avg=${masterMaxCupLoadAvg}#g" conf/master.properties
|
||||
sed -i ${txt} "s#master.reserved.memory.*#master.reserved.memory=${masterReservedMemory}#g" conf/master.properties
|
||||
|
||||
|
||||
sed -i ${txt} "s#worker.exec.threads.*#worker.exec.threads=${workerExecThreads}#g" conf/worker.properties
|
||||
sed -i ${txt} "s#worker.heartbeat.interval.*#worker.heartbeat.interval=${workerHeartbeatInterval}#g" conf/worker.properties
|
||||
sed -i ${txt} "s#worker.fetch.task.num.*#worker.fetch.task.num=${workerFetchTaskNum}#g" conf/worker.properties
|
||||
sed -i ${txt} "s#worker.max.cpuload.avg.*#worker.max.cpuload.avg=${workerMaxCupLoadAvg}#g" conf/worker.properties
|
||||
sed -i ${txt} "s#worker.reserved.memory.*#worker.reserved.memory=${workerReservedMemory}#g" conf/worker.properties
|
||||
|
||||
|
||||
sed -i ${txt} "s#server.port.*#server.port=${apiServerPort}#g" conf/application.properties
|
||||
sed -i ${txt} "s#server.session.timeout.*#server.session.timeout=${apiServerSessionTimeout}#g" conf/application.properties
|
||||
sed -i ${txt} "s#server.context-path.*#server.context-path=${apiServerContextPath}#g" conf/application.properties
|
||||
sed -i ${txt} "s#spring.http.multipart.max-file-size.*#spring.http.multipart.max-file-size=${springMaxFileSize}#g" conf/application.properties
|
||||
sed -i ${txt} "s#spring.http.multipart.max-request-size.*#spring.http.multipart.max-request-size=${springMaxRequestSize}#g" conf/application.properties
|
||||
sed -i ${txt} "s#server.max-http-post-size.*#server.max-http-post-size=${apiMaxHttpPostSize}#g" conf/application.properties
|
||||
|
||||
|
||||
sed -i ${txt} "s#mail.protocol.*#mail.protocol=${mailProtocol}#g" conf/alert.properties
|
||||
sed -i ${txt} "s#mail.server.host.*#mail.server.host=${mailServerHost}#g" conf/alert.properties
|
||||
sed -i ${txt} "s#mail.server.port.*#mail.server.port=${mailServerPort}#g" conf/alert.properties
|
||||
sed -i ${txt} "s#mail.sender.*#mail.sender=${mailSender}#g" conf/alert.properties
|
||||
sed -i ${txt} "s#mail.passwd.*#mail.passwd=${mailPassword}#g" conf/alert.properties
|
||||
sed -i ${txt} "s#xls.file.path.*#xls.file.path=${xlsFilePath}#g" conf/alert.properties
|
||||
|
||||
|
||||
sed -i ${txt} "s#installPath.*#installPath=${installPath}#g" conf/config/install_config.conf
|
||||
sed -i ${txt} "s#deployUser.*#deployUser=${deployUser}#g" conf/config/install_config.conf
|
||||
sed -i ${txt} "s#ips.*#ips=${ips}#g" conf/config/install_config.conf
|
||||
|
||||
|
||||
sed -i ${txt} "s#masters.*#masters=${masters}#g" conf/config/run_config.conf
|
||||
sed -i ${txt} "s#workers.*#workers=${workers}#g" conf/config/run_config.conf
|
||||
sed -i ${txt} "s#alertServer.*#alertServer=${alertServer}#g" conf/config/run_config.conf
|
||||
sed -i ${txt} "s#apiServers.*#apiServers=${apiServers}#g" conf/config/run_config.conf
|
||||
|
|
@ -0,0 +1,105 @@
|
|||
#!/bin/sh
|
||||
|
||||
# execute any pre-init scripts
|
||||
for i in /scripts/pre-init.d/*sh
|
||||
do
|
||||
if [ -e "${i}" ]; then
|
||||
echo "[i] pre-init.d - processing $i"
|
||||
. "${i}"
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -d "/run/mysqld" ]; then
|
||||
echo "[i] mysqld already present, skipping creation"
|
||||
chown -R mysql:mysql /run/mysqld
|
||||
else
|
||||
echo "[i] mysqld not found, creating...."
|
||||
mkdir -p /run/mysqld
|
||||
chown -R mysql:mysql /run/mysqld
|
||||
fi
|
||||
|
||||
if [ -d /var/lib/mysql/mysql ]; then
|
||||
echo "[i] MySQL directory already present, skipping creation"
|
||||
chown -R mysql:mysql /var/lib/mysql
|
||||
else
|
||||
echo "[i] MySQL data directory not found, creating initial DBs"
|
||||
|
||||
chown -R mysql:mysql /var/lib/mysql
|
||||
|
||||
mysql_install_db --user=mysql --ldata=/var/lib/mysql > /dev/null
|
||||
|
||||
if [ "$MYSQL_ROOT_PASSWORD" = "" ]; then
|
||||
MYSQL_ROOT_PASSWORD=`pwgen 16 1`
|
||||
echo "[i] MySQL root Password: $MYSQL_ROOT_PASSWORD"
|
||||
fi
|
||||
|
||||
MYSQL_DATABASE="easyscheduler"
|
||||
MYSQL_USER="easyscheduler"
|
||||
MYSQL_PASSWORD="easyschedulereasyscheduler"
|
||||
|
||||
tfile=`mktemp`
|
||||
if [ ! -f "$tfile" ]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
cat << EOF > $tfile
|
||||
USE mysql;
|
||||
FLUSH PRIVILEGES ;
|
||||
GRANT ALL ON *.* TO 'root'@'%' identified by '$MYSQL_ROOT_PASSWORD' WITH GRANT OPTION ;
|
||||
GRANT ALL ON *.* TO 'root'@'localhost' identified by '$MYSQL_ROOT_PASSWORD' WITH GRANT OPTION ;
|
||||
SET PASSWORD FOR 'root'@'localhost'=PASSWORD('${MYSQL_ROOT_PASSWORD}') ;
|
||||
DROP DATABASE IF EXISTS test ;
|
||||
FLUSH PRIVILEGES ;
|
||||
EOF
|
||||
|
||||
if [ "$MYSQL_DATABASE" != "" ]; then
|
||||
echo "[i] Creating database: $MYSQL_DATABASE"
|
||||
echo "CREATE DATABASE IF NOT EXISTS \`$MYSQL_DATABASE\` CHARACTER SET utf8 COLLATE utf8_general_ci;" >> $tfile
|
||||
|
||||
if [ "$MYSQL_USER" != "" ]; then
|
||||
echo "[i] Creating user: $MYSQL_USER with password $MYSQL_PASSWORD"
|
||||
echo "GRANT ALL ON \`$MYSQL_DATABASE\`.* to '$MYSQL_USER'@'%' IDENTIFIED BY '$MYSQL_PASSWORD';" >> $tfile
|
||||
fi
|
||||
fi
|
||||
|
||||
/usr/bin/mysqld --user=mysql --bootstrap --verbose=0 --skip-name-resolve --skip-networking=0 < $tfile
|
||||
rm -f $tfile
|
||||
|
||||
for f in /docker-entrypoint-initdb.d/*; do
|
||||
case "$f" in
|
||||
*.sql) echo "$0: running $f"; /usr/bin/mysqld --user=mysql --bootstrap --verbose=0 --skip-name-resolve --skip-networking=0 < "$f"; echo ;;
|
||||
*.sql.gz) echo "$0: running $f"; gunzip -c "$f" | /usr/bin/mysqld --user=mysql --bootstrap --verbose=0 --skip-name-resolve --skip-networking=0 < "$f"; echo ;;
|
||||
*) echo "$0: ignoring or entrypoint initdb empty $f" ;;
|
||||
esac
|
||||
echo
|
||||
done
|
||||
|
||||
echo
|
||||
echo 'MySQL init process done. Ready for start up.'
|
||||
echo
|
||||
|
||||
echo "exec /usr/bin/mysqld --user=mysql --console --skip-name-resolve --skip-networking=0" "$@"
|
||||
fi
|
||||
|
||||
# execute any pre-exec scripts
|
||||
for i in /scripts/pre-exec.d/*sh
|
||||
do
|
||||
if [ -e "${i}" ]; then
|
||||
echo "[i] pre-exec.d - processing $i"
|
||||
. ${i}
|
||||
fi
|
||||
done
|
||||
|
||||
mysql -ueasyscheduler -peasyschedulereasyscheduler --one-database easyscheduler -h127.0.0.1 < /opt/easyscheduler/sql/escheduler.sql
|
||||
mysql -ueasyscheduler -peasyschedulereasyscheduler --one-database easyscheduler -h127.0.0.1 < /opt/easyscheduler/sql/quartz.sql
|
||||
source /etc/profile
|
||||
zkServer.sh start
|
||||
cd /opt/easyscheduler
|
||||
rm -rf /etc/nginx/conf.d/default.conf
|
||||
sh ./bin/escheduler-daemon.sh start master-server
|
||||
sh ./bin/escheduler-daemon.sh start worker-server
|
||||
sh ./bin/escheduler-daemon.sh start api-server
|
||||
sh ./bin/escheduler-daemon.sh start logger-server
|
||||
sh ./bin/escheduler-daemon.sh start alert-server
|
||||
nginx -c /etc/nginx/nginx.conf
|
||||
exec /usr/bin/mysqld --user=mysql --console --skip-name-resolve --skip-networking=0 $@
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
# The number of milliseconds of each tick
|
||||
tickTime=2000
|
||||
# The number of ticks that the initial
|
||||
# synchronization phase can take
|
||||
initLimit=10
|
||||
# The number of ticks that can pass between
|
||||
# sending a request and getting an acknowledgement
|
||||
syncLimit=5
|
||||
# the directory where the snapshot is stored.
|
||||
# do not use /tmp for storage, /tmp here is just
|
||||
# example sakes.
|
||||
dataDir=/tmp/zookeeper
|
||||
# the port at which the clients will connect
|
||||
clientPort=2181
|
||||
# the maximum number of client connections.
|
||||
# increase this if you need to handle more clients
|
||||
#maxClientCnxns=60
|
||||
#
|
||||
# Be sure to read the maintenance section of the
|
||||
# administrator guide before turning on autopurge.
|
||||
#
|
||||
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
|
||||
#
|
||||
# The number of snapshots to retain in dataDir
|
||||
#autopurge.snapRetainCount=3
|
||||
# Purge task interval in hours
|
||||
# Set to "0" to disable auto purge feature
|
||||
#autopurge.purgeInterval=1
|
||||
dataDir=/opt/zookeeper/data
|
||||
dataLogDir=/opt/zookeeper/logs
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
Easy Scheduler Release 1.0.1
|
||||
===
|
||||
Easy Scheduler 1.0.2是1.x系列中的第二个版本。更新内容具体如下:
|
||||
|
||||
- 1,outlook TSL 发邮件支持
|
||||
- 2,servlet 和 protobuf jar冲突解决
|
||||
- 3,创建租户同时建立linux用户
|
||||
- 4,重跑时间负数
|
||||
- 5,单机和集群都可以使用install.sh一键部署
|
||||
- 6,队列支持界面添加
|
||||
- 7,escheduler.t_escheduler_queue 增加了create_time和update_time字段
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
Easy Scheduler Release 1.0.2
|
||||
===
|
||||
Easy Scheduler 1.0.2是1.x系列中的第三个版本。此版本增加了调度开放接口、worker分组(指定任务运行的机器组)、任务流程及服务监控以及对oracle、clickhouse等支持,具体如下:
|
||||
|
||||
新特性:
|
||||
===
|
||||
- [[EasyScheduler-79](https://github.com/analysys/EasyScheduler/issues/79)] 调度通过token方式对外开放接口,可以通过api进行操作
|
||||
- [[EasyScheduler-138](https://github.com/analysys/EasyScheduler/issues/138)] 可以指定任务运行的机器(组)
|
||||
- [[EasyScheduler-139](https://github.com/analysys/EasyScheduler/issues/139)] 任务流程监控及Master、Worker、Zookeeper运行状态监控
|
||||
- [[EasyScheduler-140](https://github.com/analysys/EasyScheduler/issues/140)] 工作流定义—增加流程超时报警
|
||||
- [[EasyScheduler-134](https://github.com/analysys/EasyScheduler/issues/134)] 任务类型支持Oracle、CLICKHOUSE、SQLSERVER、IMPALA
|
||||
- [[EasyScheduler-136](https://github.com/analysys/EasyScheduler/issues/136)] Sql任务节点可以独立选取抄送邮件用户
|
||||
- [[EasyScheduler-141](https://github.com/analysys/EasyScheduler/issues/141)] 用户管理—用户可以绑定队列,用户队列级别高于租户队列级别,如果用户队列为空,则寻找租户队列
|
||||
|
||||
|
||||
|
||||
增强:
|
||||
===
|
||||
- [[EasyScheduler-154](https://github.com/analysys/EasyScheduler/issues/154)] 租户编码允许纯数字或者下划线这种的编码
|
||||
|
||||
|
||||
修复:
|
||||
===
|
||||
- [[EasyScheduler-135](https://github.com/analysys/EasyScheduler/issues/135)] Python任务可以指定python版本
|
||||
|
||||
- [[EasyScheduler-125](https://github.com/analysys/EasyScheduler/issues/125)] 用户账号中手机号无法识别联通最新号码166开头
|
||||
|
||||
- [[EasyScheduler-178](https://github.com/analysys/EasyScheduler/issues/178)] 修复ProcessDao里细微的拼写错误
|
||||
|
||||
- [[EasyScheduler-129](https://github.com/analysys/EasyScheduler/issues/129)] 租户管理中,租户编码带下划线等特殊字符无法通过校验
|
||||
|
||||
|
||||
感谢:
|
||||
===
|
||||
最后但最重要的是,没有以下伙伴的贡献就没有新版本的诞生:
|
||||
|
||||
Baoqi , chubbyjiang , coreychen , chgxtony, cmdares , datuzi , dingchao, fanguanqun , 风清扬, gaojun416 , googlechorme, hyperknob , hujiang75277381 , huanzui , kinssun, ivivi727 ,jimmy, jiangzhx , kevin5210 , lidongdai , lshmouse , lenboo, lyf198972 , lgcareer , lzy305 , moranrr , millionfor , mazhong8808, programlief, qiaozhanwei , roy110 , swxchappy , sherlock111 , samz406 , swxchappy, qq389401879 , lzy305, vkingnew, William-GuoWei , woniulinux, yyl861, zhangxin1988, yangjiajun2014, yangqinlong, yangjiajun2014, zhzhenqin, zhangluck, zhanghaicheng1, zhuyizhizhi
|
||||
|
||||
以及微信群里众多的热心伙伴!在此非常感谢!
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -2,17 +2,16 @@
|
|||
|
||||
* [Easyscheduler简介](README.md)
|
||||
* 前端部署文档
|
||||
* [环境搭建](前端部署文档.md#前端项目环境构建及编译)
|
||||
* [安装及配置](前端部署文档.md#安装及配置)
|
||||
* [项目生产环境Nginx配置](前端部署文档.md#项目生产环境配置)
|
||||
* [前端项目发布](前端部署文档.md#前端项目发布)
|
||||
* [问题](前端部署文档.md#问题)
|
||||
* [准备工作](前端部署文档.md#1、准备工作)
|
||||
* [部署](前端部署文档.md#2、部署)
|
||||
* [常见问题](前端部署文档.md#前端常见问题)
|
||||
* 后端部署文档
|
||||
* [后端部署文档](后端部署文档.md#部署文档)
|
||||
* [准备工作](后端部署文档.md#1、准备工作)
|
||||
* [部署](后端部署文档.md#2、部署)
|
||||
* [系统使用手册](系统使用手册.md#使用手册)
|
||||
* [系统架构设计](系统架构设计.md#系统架构设计)
|
||||
* 前端开发文档
|
||||
* [开发环境搭建](前端部署文档.md)
|
||||
* [开发环境搭建](前端开发文档.md#开发环境搭建)
|
||||
* [项目目录结构](前端开发文档.md#项目目录结构)
|
||||
* [系统功能模块](前端开发文档.md#系统功能模块)
|
||||
* [路由和状态管理](前端开发文档.md#路由和状态管理)
|
||||
|
|
@ -20,6 +19,13 @@
|
|||
* [接口](前端开发文档.md#接口)
|
||||
* [扩展开发](前端开发文档.md#扩展开发)
|
||||
* 后端开发文档
|
||||
* [开发环境搭建](后端开发文档.md#项目编译)
|
||||
* [自定义任务插件文档](任务插件开发.md#任务插件开发)
|
||||
|
||||
* 历次版本发布内容
|
||||
* [1.0.2 release](1.0.2-release.md)
|
||||
* [1.0.1 release](1.0.1-release.md)
|
||||
* [1.0.0 release 正式开源]
|
||||
|
||||
|
||||
|
||||
|
|
@ -15,6 +15,87 @@ Jsplumb 连线插件库
|
|||
Lodash 高性能的 JavaScript 实用工具库
|
||||
```
|
||||
|
||||
|
||||
### 开发环境搭建
|
||||
|
||||
- #### Node安装
|
||||
Node包下载 (注意版本 8.9.4) `https://nodejs.org/download/release/v8.9.4/`
|
||||
|
||||
|
||||
- #### 前端项目构建
|
||||
用命令行模式 `cd` 进入 `escheduler-ui`项目目录并执行 `npm install` 拉取项目依赖包
|
||||
|
||||
> 如果 `npm install` 速度非常慢
|
||||
|
||||
> 可以转淘宝镜像命令行输入 `npm install -g cnpm --registry=https://registry.npm.taobao.org`
|
||||
|
||||
> 运行 `cnpm install`
|
||||
|
||||
|
||||
- 新建一个`.env`文件,用于跟后端交互的接口
|
||||
|
||||
在`escheduler-ui`目录下新建一个`.env`文件,在文件里添加后端服务的ip地址和端口,用于跟后端交互,`.env`文件内容如下:
|
||||
```
|
||||
# 代理的接口地址(自行修改)
|
||||
API_BASE = http://192.168.xx.xx:12345
|
||||
|
||||
# 如果您需要用ip访问项目可以把 "#" 号去掉(例)
|
||||
#DEV_HOST = 192.168.xx.xx
|
||||
```
|
||||
|
||||
> ##### !!!这里特别注意 项目如果在拉取依赖包的过程中报 " node-sass error " 错误,请在执行完后再次执行以下命令
|
||||
```
|
||||
npm install node-sass --unsafe-perm //单独安装node-sass依赖
|
||||
```
|
||||
|
||||
- #### 开发环境运行
|
||||
- `npm start` 项目开发环境 (启动后访问地址 http://localhost:8888/#/)
|
||||
|
||||
|
||||
#### 前端项目发布
|
||||
|
||||
- `npm run build` 项目打包 (打包后根目录会创建一个名为dist文件夹,用于发布线上Nginx)
|
||||
|
||||
运行 `npm run build` 命令,生成打包文件(dist)包
|
||||
|
||||
再拷贝到服务器对应的目录下(前端服务静态页面存放目录)
|
||||
|
||||
|
||||
访问地址 `http://localhost:8888/#/`
|
||||
|
||||
|
||||
#### Liunx下使用node启动并且守护进程
|
||||
|
||||
安装pm2 `npm install -g pm2`
|
||||
|
||||
在项目`escheduler-ui`根目录执行 `pm2 start npm -- run dev` 启动项目
|
||||
|
||||
#### 命令
|
||||
|
||||
- 启用 `pm2 start npm -- run dev`
|
||||
|
||||
- 停止 `pm2 stop npm`
|
||||
|
||||
- 删除 `pm2 delete npm`
|
||||
|
||||
- 状态 `pm2 list`
|
||||
|
||||
```
|
||||
|
||||
[root@localhost escheduler-ui]# pm2 start npm -- run dev
|
||||
[PM2] Applying action restartProcessId on app [npm](ids: 0)
|
||||
[PM2] [npm](0) ✓
|
||||
[PM2] Process successfully started
|
||||
┌──────────┬────┬─────────┬──────┬──────┬────────┬─────────┬────────┬─────┬──────────┬──────┬──────────┐
|
||||
│ App name │ id │ version │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │
|
||||
├──────────┼────┼─────────┼──────┼──────┼────────┼─────────┼────────┼─────┼──────────┼──────┼──────────┤
|
||||
│ npm │ 0 │ N/A │ fork │ 6168 │ online │ 31 │ 0s │ 0% │ 5.6 MB │ root │ disabled │
|
||||
└──────────┴────┴─────────┴──────┴──────┴────────┴─────────┴────────┴─────┴──────────┴──────┴──────────┘
|
||||
Use `pm2 show <id|name>` to get more details about an app
|
||||
|
||||
```
|
||||
|
||||
|
||||
### 项目目录结构
|
||||
|
||||
`build` 打包及开发环境项目的一些webpack配置
|
||||
|
|
@ -65,74 +146,6 @@ Lodash 高性能的 JavaScript 实用工具库
|
|||
`util` => 工具
|
||||
|
||||
|
||||
### 开发环境搭建
|
||||
|
||||
- #### Node安装
|
||||
Node包下载 (注意版本 8.9.4) `https://nodejs.org/download/release/v8.9.4/`
|
||||
|
||||
- #### 前端项目构建
|
||||
用命令行模式 `cd` 进入 `escheduler-ui`项目目录并执行 `npm install` 拉取项目依赖包
|
||||
|
||||
> 如果 `npm install` 速度非常慢
|
||||
|
||||
> 可以转淘宝镜像命令行输入 `npm install -g cnpm --registry=https://registry.npm.taobao.org`
|
||||
|
||||
> 运行 `cnpm install`
|
||||
|
||||
|
||||
|
||||
> ##### !!!这里特别注意 项目如果在拉取依赖包的过程中报 " node-sass error " 错误,请在执行完后再次执行以下命令
|
||||
```
|
||||
npm install node-sass --unsafe-perm //单独安装node-sass依赖
|
||||
```
|
||||
|
||||
- #### 开发环境运行
|
||||
- `npm start` 项目开发环境 (启动后访问地址 http://localhost:8888/#/)
|
||||
|
||||
|
||||
#### 前端项目发布
|
||||
|
||||
- `npm run build` 项目打包 (打包后根目录会创建一个名为dist文件夹,用于发布线上Nginx)
|
||||
|
||||
运行 `npm run build` 命令,生成打包文件(dist)包
|
||||
|
||||
再拷贝到服务器对应的目录下(前端服务静态页面存放目录)
|
||||
|
||||
访问地址 `http://localhost:8888/#/`
|
||||
|
||||
|
||||
#### Liunx下使用node启动并且守护进程
|
||||
|
||||
安装pm2 `npm install -g pm2`
|
||||
|
||||
在项目`escheduler-ui`根目录执行 `pm2 start npm -- run dev` 启动项目
|
||||
|
||||
#### 命令
|
||||
|
||||
- 启用 `pm2 start npm -- run dev`
|
||||
|
||||
- 停止 `pm2 stop npm`
|
||||
|
||||
- 删除 `pm2 delete npm`
|
||||
|
||||
- 状态 `pm2 list`
|
||||
|
||||
```
|
||||
|
||||
[root@localhost escheduler-ui]# pm2 start npm -- run dev
|
||||
[PM2] Applying action restartProcessId on app [npm](ids: 0)
|
||||
[PM2] [npm](0) ✓
|
||||
[PM2] Process successfully started
|
||||
┌──────────┬────┬─────────┬──────┬──────┬────────┬─────────┬────────┬─────┬──────────┬──────┬──────────┐
|
||||
│ App name │ id │ version │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │
|
||||
├──────────┼────┼─────────┼──────┼──────┼────────┼─────────┼────────┼─────┼──────────┼──────┼──────────┤
|
||||
│ npm │ 0 │ N/A │ fork │ 6168 │ online │ 31 │ 0s │ 0% │ 5.6 MB │ root │ disabled │
|
||||
└──────────┴────┴─────────┴──────┴──────┴────────┴─────────┴────────┴─────┴──────────┴──────┴──────────┘
|
||||
Use `pm2 show <id|name>` to get more details about an app
|
||||
|
||||
```
|
||||
|
||||
|
||||
### 系统功能模块
|
||||
|
||||
首页 => `http://localhost:8888/#/home`
|
||||
|
|
|
|||
|
|
@ -3,29 +3,20 @@
|
|||
前端有3种部署方式,分别为自动化部署,手动部署和编译源码部署
|
||||
|
||||
## 1、准备工作
|
||||
#### 准备一:下载安装包
|
||||
#### 下载安装包
|
||||
|
||||
目前最新安装包版本是1.0.1,下载地址: [码云下载](https://gitee.com/easyscheduler/EasyScheduler/attach_files/)
|
||||
目前最新安装包版本是1.0.2,下载地址: [码云下载](https://gitee.com/easyscheduler/EasyScheduler/attach_files/)
|
||||
|
||||
下载escheduler-ui-1.0.1.tar.gz后,解压后会产生dist目录,进入dist目录
|
||||
下载escheduler-ui-1.0.2.tar.gz后,解压后会产生dist目录,进入dist目录
|
||||
> cd dist
|
||||
|
||||
#### 准备二:新建一个`.env`文件
|
||||
|
||||
在dist目录下新建一个`.env`文件,在文件里添加后端服务的ip地址和端口,用于跟后端交互,`.env`文件内容如下:
|
||||
```
|
||||
# 代理的接口地址(自行修改)
|
||||
API_BASE = http://192.168.xx.xx:12345
|
||||
|
||||
# 如果您需要用ip访问项目可以把 "#" 号去掉(例)
|
||||
#DEV_HOST = 192.168.xx.xx
|
||||
```
|
||||
|
||||
## 2、部署
|
||||
以下两种方式任选其一部署即可,推荐自动化部署
|
||||
### 2.1 自动化部署
|
||||
|
||||
在前端项目根目录dist下编辑安装文件`vi install(线上环境).sh`(执行时,最好修改install(线上环境).sh为install-ui.sh,跟后端部署区分)
|
||||
在`escheduler-ui`目录下编辑安装文件`vi install(线上环境).sh`(执行时,最好修改install(线上环境).sh为install-ui.sh,跟后端部署区分)
|
||||
|
||||
更改前端访问端口和后端代理接口地址
|
||||
|
||||
|
|
@ -39,7 +30,7 @@ esc_proxy_port="http://192.168.xx.xx:12345"
|
|||
|
||||
前端自动部署基于linux系统`yum`操作,部署之前请先安装更新`yum`
|
||||
|
||||
在前端项目根目录dist下执行`./install(线上环境).sh` 或者改名后的 `./install-ui.sh`
|
||||
在`escheduler-ui`目录下执行`./install(线上环境).sh` 或者改名后的 `./install-ui.sh`
|
||||
|
||||
|
||||
### 2.2 手动部署
|
||||
|
|
@ -107,4 +98,4 @@ systemctl restart nginx
|
|||
```
|
||||
# 更改上传大小
|
||||
client_max_body_size 1024m
|
||||
```
|
||||
```
|
||||
|
|
|
|||
|
|
@ -0,0 +1,38 @@
|
|||
|
||||
# EasyScheduler升级文档
|
||||
|
||||
## 1. 备份上一版本文件和数据库。
|
||||
|
||||
## 2. 停止escheduler所有服务.
|
||||
|
||||
`sh ./script/stop_all.sh`
|
||||
|
||||
## 3. 下载新版本的安装包
|
||||
|
||||
- [码云下载](https://gitee.com/easyscheduler/EasyScheduler/attach_files), 下载最新版本的前后端安装包(后端简称escheduler-backend、前端简称escheduler-ui)
|
||||
- 以下升级操作都需要在新版本的目录进行
|
||||
|
||||
## 4. 数据库升级
|
||||
- 修改conf/dao/data_source.properties中的下列属性
|
||||
|
||||
```
|
||||
spring.datasource.url
|
||||
spring.datasource.username
|
||||
spring.datasource.password
|
||||
```
|
||||
|
||||
- 执行数据库升级脚本
|
||||
|
||||
`sh ./script/upgrade_escheduler.sh`
|
||||
|
||||
## 5. 后端服务升级
|
||||
|
||||
- 修改install.sh配置内容,执行升级脚本
|
||||
|
||||
`sh install.sh`
|
||||
|
||||
## 6. 前端服务升级
|
||||
- 覆盖上一版本dist目录
|
||||
- 重启nginx服务
|
||||
|
||||
`systemctl restart nginx`
|
||||
|
|
@ -0,0 +1,48 @@
|
|||
# 后端开发文档
|
||||
|
||||
## 环境要求
|
||||
|
||||
* [Mysql](http://geek.analysys.cn/topic/124) (5.5+) : 必装
|
||||
* [JDK](https://www.oracle.com/technetwork/java/javase/downloads/index.html) (1.8+) : 必装
|
||||
* [ZooKeeper](https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper)(3.4.6+) :必装
|
||||
* [Maven](http://maven.apache.org/download.cgi)(3.3+) :必装
|
||||
|
||||
因EasyScheduler中escheduler-rpc模块使用到Grpc,需要用到Maven编译生成所需要的类
|
||||
对Maven不熟的伙伴请参考: [maven in five minutes](http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html)(3.3+)
|
||||
|
||||
http://maven.apache.org/install.html
|
||||
|
||||
## 项目编译
|
||||
将EasyScheduler源码下载导入Idea等开发工具后,首先转为Maven项目(右键点击后选择"Add Framework Support")
|
||||
|
||||
* 执行编译命令:
|
||||
|
||||
```
|
||||
mvn -U clean package assembly:assembly -Dmaven.test.skip=true
|
||||
```
|
||||
|
||||
* 查看目录
|
||||
|
||||
正常编译完后,会在当前目录生成 target/escheduler-{version}/
|
||||
|
||||
```
|
||||
bin
|
||||
conf
|
||||
lib
|
||||
script
|
||||
sql
|
||||
install.sh
|
||||
```
|
||||
|
||||
- 说明
|
||||
|
||||
```
|
||||
bin : 基础服务启动脚本
|
||||
conf : 项目配置文件
|
||||
lib : 项目依赖jar包,包括各个模块jar和第三方jar
|
||||
script : 集群启动、停止和服务监控启停脚本
|
||||
sql : 项目依赖sql文件
|
||||
install.sh : 一键部署脚本
|
||||
```
|
||||
|
||||
|
||||
|
|
@ -4,13 +4,13 @@
|
|||
|
||||
## 1、准备工作
|
||||
|
||||
目前最新安装包版本是1.0.1,下载地址: [码云下载](https://gitee.com/easyscheduler/EasyScheduler/attach_files/) ,下载escheduler-backend-1.0.1.tar.gz后,解压后会产生escheduler-backend-1.0.1目录(后面简称escheduler-backend)
|
||||
目前最新安装包版本是1.0.2,下载地址: [码云下载](https://gitee.com/easyscheduler/EasyScheduler/attach_files/) ,下载escheduler-backend-1.0.2.tar.gz(后端简称escheduler-backend),escheduler-ui-1.0.2.tar.gz(前端简称escheduler-ui)
|
||||
|
||||
#### 准备一: 基础软件安装(必装项请自行安装)
|
||||
|
||||
* [Mysql](http://geek.analysys.cn/topic/124) (5.5+) : 必装
|
||||
* [JDK](https://www.oracle.com/technetwork/java/javase/downloads/index.html) (1.8+) : 必装
|
||||
* [ZooKeeper](https://www.jianshu.com/p/de90172ea680)(3.4.6) :必装
|
||||
* [ZooKeeper](https://www.jianshu.com/p/de90172ea680)(3.4.6+) :必装
|
||||
* [Hadoop](https://blog.csdn.net/Evankaka/article/details/51612437)(2.6+) :选装, 如果需要使用到资源上传功能,MapReduce任务提交则需要配置Hadoop(上传的资源文件目前保存在Hdfs上)
|
||||
* [Hive](https://staroon.pro/2017/12/09/HiveInstall/)(1.2.1) : 选装,hive任务提交需要安装
|
||||
* Spark(1.x,2.x) : 选装,Spark任务提交需要安装
|
||||
|
|
@ -57,7 +57,7 @@ escheduler ALL=(ALL) NOPASSWD: NOPASSWD: ALL
|
|||
flush privileges;
|
||||
```
|
||||
|
||||
* 创建表和导入基础数据
|
||||
* 1.0.0和1.0.1版本创建表和导入基础数据
|
||||
说明:在escheduler-backend/sql/escheduler.sql和quartz.sql
|
||||
|
||||
```sql
|
||||
|
|
@ -66,6 +66,19 @@ escheduler ALL=(ALL) NOPASSWD: NOPASSWD: ALL
|
|||
mysql -h {host} -u {user} -p{password} -D {db} < quartz.sql
|
||||
```
|
||||
|
||||
* 1.0.2版本创建表和导入基础数据
|
||||
修改conf/dao/data_source.properties中的下列属性
|
||||
|
||||
```
|
||||
spring.datasource.url
|
||||
spring.datasource.username
|
||||
spring.datasource.password
|
||||
```
|
||||
执行创建表和导入基础数据脚本
|
||||
```
|
||||
sh ./script/create_escheduler.sh
|
||||
```
|
||||
|
||||
#### 准备五: 修改部署目录权限及运行参数
|
||||
|
||||
我们先来大体了解下解压后escheduler-backend目录下的文件(夹)的作用
|
||||
|
|
@ -83,13 +96,13 @@ install.sh : 一键部署脚本
|
|||
|
||||
`sudo chown -R deployUser:deployUser escheduler-backend`
|
||||
|
||||
- 修改conf/env/目录下的`escheduler_env.py`, `.escheduler_env.sh` 两个文件中的环境变量
|
||||
- 修改conf/env/目录下的 `.escheduler_env.sh` 环境变量
|
||||
|
||||
- 修改部署参数(根据自己服务器及业务情况):
|
||||
|
||||
- 修改 **install.sh**中的各参数,替换成自身业务所需的值
|
||||
|
||||
- 如果使用hdfs相关功能,需要拷贝**hdfs-site.xml**和**core-site.xml**到conf目录下
|
||||
- 如果使用hdfs相关功能,需要拷贝**hdfs-site.xml**和**core-site.xml**到conf目录下
|
||||
|
||||
|
||||
## 2、部署
|
||||
|
|
@ -130,7 +143,7 @@ install.sh : 一键部署脚本
|
|||
|
||||
### 2.2 编译源码来部署
|
||||
|
||||
将源码包release版本1.0.1下载后,解压进入根目录
|
||||
将源码包release版本1.0.2下载后,解压进入根目录
|
||||
|
||||
* 执行编译命令:
|
||||
|
||||
|
|
@ -144,15 +157,15 @@ install.sh : 一键部署脚本
|
|||
|
||||
|
||||
|
||||
### 2.3 系统常用启停服务
|
||||
### 2.3 系统常用启停服务(服务用途请具体参见《系统架构设计》小节)
|
||||
|
||||
* 一键停止集群所有服务
|
||||
|
||||
` sh ./script/stop_all.sh`
|
||||
` sh ./bin/stop_all.sh`
|
||||
|
||||
* 一键开启集群所有服务
|
||||
|
||||
` sh ./script/start_all.sh`
|
||||
` sh ./bin/start_all.sh`
|
||||
|
||||
* 启停Master
|
||||
|
||||
|
|
@ -185,4 +198,10 @@ sh ./bin/escheduler-daemon.sh stop logger-server
|
|||
```
|
||||
sh ./bin/escheduler-daemon.sh start alert-server
|
||||
sh ./bin/escheduler-daemon.sh stop alert-server
|
||||
```
|
||||
```
|
||||
|
||||
## 3、数据库升级
|
||||
数据库升级是在1.0.2版本增加的功能,执行以下命令即可自动升级数据库
|
||||
```
|
||||
sh ./script/upgrade_escheduler.sh
|
||||
```
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
<parent>
|
||||
<groupId>cn.analysys</groupId>
|
||||
<artifactId>escheduler</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
<version>1.0.2-SNAPSHOT</version>
|
||||
</parent>
|
||||
<artifactId>escheduler-alert</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
<parent>
|
||||
<groupId>cn.analysys</groupId>
|
||||
<artifactId>escheduler</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
<version>1.0.2-SNAPSHOT</version>
|
||||
</parent>
|
||||
<artifactId>escheduler-api</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,169 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package cn.escheduler.api.controller;
|
||||
|
||||
|
||||
import cn.escheduler.api.enums.Status;
|
||||
import cn.escheduler.api.service.AccessTokenService;
|
||||
import cn.escheduler.api.service.UsersService;
|
||||
import cn.escheduler.api.utils.Constants;
|
||||
import cn.escheduler.api.utils.Result;
|
||||
import cn.escheduler.dao.model.User;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import static cn.escheduler.api.enums.Status.*;
|
||||
|
||||
|
||||
/**
|
||||
* user controller
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/access-token")
|
||||
public class AccessTokenController extends BaseController{
|
||||
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(AccessTokenController.class);
|
||||
|
||||
|
||||
@Autowired
|
||||
private AccessTokenService accessTokenService;
|
||||
|
||||
/**
|
||||
* create token
|
||||
* @param loginUser
|
||||
* @return
|
||||
*/
|
||||
@PostMapping(value = "/create")
|
||||
@ResponseStatus(HttpStatus.CREATED)
|
||||
public Result createToken(@RequestAttribute(value = Constants.SESSION_USER) User loginUser,
|
||||
@RequestParam(value = "userId") int userId,
|
||||
@RequestParam(value = "expireTime") String expireTime,
|
||||
@RequestParam(value = "token") String token){
|
||||
logger.info("login user {}, create token , userId : {} , token expire time : {} , token : {}", loginUser.getUserName(),
|
||||
userId,expireTime,token);
|
||||
|
||||
try {
|
||||
Map<String, Object> result = accessTokenService.createToken(userId, expireTime, token);
|
||||
return returnDataList(result);
|
||||
}catch (Exception e){
|
||||
logger.error(CREATE_ACCESS_TOKEN_ERROR.getMsg(),e);
|
||||
return error(CREATE_ACCESS_TOKEN_ERROR.getCode(), CREATE_ACCESS_TOKEN_ERROR.getMsg());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* create token
|
||||
* @param loginUser
|
||||
* @return
|
||||
*/
|
||||
@PostMapping(value = "/generate")
|
||||
@ResponseStatus(HttpStatus.CREATED)
|
||||
public Result generateToken(@RequestAttribute(value = Constants.SESSION_USER) User loginUser,
|
||||
@RequestParam(value = "userId") int userId,
|
||||
@RequestParam(value = "expireTime") String expireTime){
|
||||
logger.info("login user {}, generate token , userId : {} , token expire time : {}",loginUser,userId,expireTime);
|
||||
try {
|
||||
Map<String, Object> result = accessTokenService.generateToken(userId, expireTime);
|
||||
return returnDataList(result);
|
||||
}catch (Exception e){
|
||||
logger.error(GENERATE_TOKEN_ERROR.getMsg(),e);
|
||||
return error(GENERATE_TOKEN_ERROR.getCode(), GENERATE_TOKEN_ERROR.getMsg());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* query access token list paging
|
||||
*
|
||||
* @param loginUser
|
||||
* @param pageNo
|
||||
* @param searchVal
|
||||
* @param pageSize
|
||||
* @return
|
||||
*/
|
||||
@GetMapping(value="/list-paging")
|
||||
@ResponseStatus(HttpStatus.OK)
|
||||
public Result queryAccessTokenList(@RequestAttribute(value = Constants.SESSION_USER) User loginUser,
|
||||
@RequestParam("pageNo") Integer pageNo,
|
||||
@RequestParam(value = "searchVal", required = false) String searchVal,
|
||||
@RequestParam("pageSize") Integer pageSize){
|
||||
logger.info("login user {}, list access token paging, pageNo: {}, searchVal: {}, pageSize: {}",
|
||||
loginUser.getUserName(),pageNo,searchVal,pageSize);
|
||||
try{
|
||||
Map<String, Object> result = checkPageParams(pageNo, pageSize);
|
||||
if(result.get(Constants.STATUS) != Status.SUCCESS){
|
||||
return returnDataListPaging(result);
|
||||
}
|
||||
result = accessTokenService.queryAccessTokenList(loginUser, searchVal, pageNo, pageSize);
|
||||
return returnDataListPaging(result);
|
||||
}catch (Exception e){
|
||||
logger.error(QUERY_ACCESSTOKEN_LIST_PAGING_ERROR.getMsg(),e);
|
||||
return error(QUERY_ACCESSTOKEN_LIST_PAGING_ERROR.getCode(),QUERY_ACCESSTOKEN_LIST_PAGING_ERROR.getMsg());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* delete access token by id
|
||||
* @param loginUser
|
||||
* @param id
|
||||
* @return
|
||||
*/
|
||||
@PostMapping(value = "/delete")
|
||||
@ResponseStatus(HttpStatus.OK)
|
||||
public Result delAccessTokenById(@RequestAttribute(value = Constants.SESSION_USER) User loginUser,
|
||||
@RequestParam(value = "id") int id) {
|
||||
logger.info("login user {}, delete access token, id: {},", loginUser.getUserName(), id);
|
||||
try {
|
||||
Map<String, Object> result = accessTokenService.delAccessTokenById(loginUser, id);
|
||||
return returnDataList(result);
|
||||
}catch (Exception e){
|
||||
logger.error(DELETE_USER_BY_ID_ERROR.getMsg(),e);
|
||||
return error(Status.DELETE_USER_BY_ID_ERROR.getCode(), Status.DELETE_USER_BY_ID_ERROR.getMsg());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* update token
|
||||
* @param loginUser
|
||||
* @return
|
||||
*/
|
||||
@PostMapping(value = "/update")
|
||||
@ResponseStatus(HttpStatus.CREATED)
|
||||
public Result updateToken(@RequestAttribute(value = Constants.SESSION_USER) User loginUser,
|
||||
@RequestParam(value = "id") int id,
|
||||
@RequestParam(value = "userId") int userId,
|
||||
@RequestParam(value = "expireTime") String expireTime,
|
||||
@RequestParam(value = "token") String token){
|
||||
logger.info("login user {}, update token , userId : {} , token expire time : {} , token : {}", loginUser.getUserName(),
|
||||
userId,expireTime,token);
|
||||
|
||||
try {
|
||||
Map<String, Object> result = accessTokenService.updateToken(id,userId, expireTime, token);
|
||||
return returnDataList(result);
|
||||
}catch (Exception e){
|
||||
logger.error(CREATE_ACCESS_TOKEN_ERROR.getMsg(),e);
|
||||
return error(CREATE_ACCESS_TOKEN_ERROR.getCode(), CREATE_ACCESS_TOKEN_ERROR.getMsg());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -57,8 +57,7 @@ public class DataAnalysisController extends BaseController{
|
|||
public Result countTaskState(@RequestAttribute(value = Constants.SESSION_USER) User loginUser,
|
||||
@RequestParam(value="startDate", required=false) String startDate,
|
||||
@RequestParam(value="endDate", required=false) String endDate,
|
||||
@RequestParam(value="projectId", required=false, defaultValue = "0") int projectId
|
||||
){
|
||||
@RequestParam(value="projectId", required=false, defaultValue = "0") int projectId){
|
||||
try{
|
||||
logger.info("count task state, user:{}, start date: {}, end date:{}, project id {}",
|
||||
loginUser.getUserName(), startDate, endDate, projectId);
|
||||
|
|
@ -82,12 +81,11 @@ public class DataAnalysisController extends BaseController{
|
|||
public Result countProcessInstanceState(@RequestAttribute(value = Constants.SESSION_USER) User loginUser,
|
||||
@RequestParam(value="startDate", required=false) String startDate,
|
||||
@RequestParam(value="endDate", required=false) String endDate,
|
||||
@RequestParam(value="projectId", required=false, defaultValue = "0") int projectId
|
||||
){
|
||||
@RequestParam(value="projectId", required=false, defaultValue = "0") int projectId){
|
||||
try{
|
||||
logger.info("count process instance state, user:{}, start date: {}, end date:{}, project id",
|
||||
loginUser.getUserName(), startDate, endDate, projectId);
|
||||
Map<String, Object> result = dataAnalysisService.countProcessInstanceStateByProject(loginUser,projectId, startDate, endDate);
|
||||
Map<String, Object> result = dataAnalysisService.countProcessInstanceStateByProject(loginUser, projectId, startDate, endDate);
|
||||
return returnDataList(result);
|
||||
}catch (Exception e){
|
||||
logger.error(COUNT_PROCESS_INSTANCE_STATE_ERROR.getMsg(),e);
|
||||
|
|
@ -105,8 +103,7 @@ public class DataAnalysisController extends BaseController{
|
|||
@GetMapping(value="/define-user-count")
|
||||
@ResponseStatus(HttpStatus.OK)
|
||||
public Result countDefinitionByUser(@RequestAttribute(value = Constants.SESSION_USER) User loginUser,
|
||||
@RequestParam(value="projectId", required=false, defaultValue = "0") int projectId
|
||||
){
|
||||
@RequestParam(value="projectId", required=false, defaultValue = "0") int projectId){
|
||||
try{
|
||||
logger.info("count process definition , user:{}, project id",
|
||||
loginUser.getUserName(), projectId);
|
||||
|
|
@ -119,4 +116,51 @@ public class DataAnalysisController extends BaseController{
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* statistical command status data
|
||||
*
|
||||
* @param loginUser
|
||||
* @param projectId
|
||||
* @return
|
||||
*/
|
||||
@GetMapping(value="/command-state-count")
|
||||
@ResponseStatus(HttpStatus.OK)
|
||||
public Result countCommandState(@RequestAttribute(value = Constants.SESSION_USER) User loginUser,
|
||||
@RequestParam(value="startDate", required=false) String startDate,
|
||||
@RequestParam(value="endDate", required=false) String endDate,
|
||||
@RequestParam(value="projectId", required=false, defaultValue = "0") int projectId){
|
||||
try{
|
||||
logger.info("count command state, user:{}, start date: {}, end date:{}, project id {}",
|
||||
loginUser.getUserName(), startDate, endDate, projectId);
|
||||
Map<String, Object> result = dataAnalysisService.countCommandState(loginUser, projectId, startDate, endDate);
|
||||
return returnDataList(result);
|
||||
}catch (Exception e){
|
||||
logger.error(COMMAND_STATE_COUNT_ERROR.getMsg(),e);
|
||||
return error(COMMAND_STATE_COUNT_ERROR.getCode(), COMMAND_STATE_COUNT_ERROR.getMsg());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* queue count
|
||||
*
|
||||
* @param loginUser
|
||||
* @param projectId
|
||||
* @return
|
||||
*/
|
||||
@GetMapping(value="/queue-count")
|
||||
@ResponseStatus(HttpStatus.OK)
|
||||
public Result countQueueState(@RequestAttribute(value = Constants.SESSION_USER) User loginUser,
|
||||
@RequestParam(value="projectId", required=false, defaultValue = "0") int projectId){
|
||||
try{
|
||||
logger.info("count command state, user:{}, start date: {}, end date:{}, project id {}",
|
||||
loginUser.getUserName(), projectId);
|
||||
Map<String, Object> result = dataAnalysisService.countQueueState(loginUser, projectId);
|
||||
return returnDataList(result);
|
||||
}catch (Exception e){
|
||||
logger.error(QUEUE_COUNT_ERROR.getMsg(),e);
|
||||
return error(QUEUE_COUNT_ERROR.getCode(), QUEUE_COUNT_ERROR.getMsg());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -66,13 +66,15 @@ public class ExecutorController extends BaseController {
|
|||
@RequestParam(value = "receiversCc", required = false) String receiversCc,
|
||||
@RequestParam(value = "runMode", required = false) RunMode runMode,
|
||||
@RequestParam(value = "processInstancePriority", required = false) Priority processInstancePriority,
|
||||
@RequestParam(value = "workerGroupId", required = false, defaultValue = "-1") int workerGroupId,
|
||||
@RequestParam(value = "timeout", required = false) Integer timeout) {
|
||||
try {
|
||||
logger.info("login user {}, start process instance, project name: {}, process definition id: {}, schedule time: {}, "
|
||||
+ "failure policy: {}, node name: {}, node dep: {}, notify type: {}, "
|
||||
+ "notify group id: {},receivers:{},receiversCc:{}, run mode: {},process instance priority:{}, timeout: {}",
|
||||
+ "notify group id: {},receivers:{},receiversCc:{}, run mode: {},process instance priority:{}, workerGroupId: {}, timeout: {}",
|
||||
loginUser.getUserName(), projectName, processDefinitionId, scheduleTime, failureStrategy,
|
||||
taskDependType, warningType, warningGroupId,receivers,receiversCc,runMode,processInstancePriority,timeout);
|
||||
taskDependType, warningType, warningGroupId,receivers,receiversCc,runMode,processInstancePriority,
|
||||
workerGroupId, timeout);
|
||||
|
||||
if (timeout == null) {
|
||||
timeout = cn.escheduler.common.Constants.MAX_TASK_TIMEOUT;
|
||||
|
|
@ -80,7 +82,7 @@ public class ExecutorController extends BaseController {
|
|||
|
||||
Map<String, Object> result = execService.execProcessInstance(loginUser, projectName, processDefinitionId, scheduleTime, execType, failureStrategy,
|
||||
startNodeList, taskDependType, warningType,
|
||||
warningGroupId,receivers,receiversCc, runMode,processInstancePriority,timeout);
|
||||
warningGroupId,receivers,receiversCc, runMode,processInstancePriority, workerGroupId, timeout);
|
||||
return returnDataList(result);
|
||||
} catch (Exception e) {
|
||||
logger.error(START_PROCESS_INSTANCE_ERROR.getMsg(),e);
|
||||
|
|
@ -147,10 +149,11 @@ public class ExecutorController extends BaseController {
|
|||
@GetMapping(value = "/get-receiver-cc")
|
||||
@ResponseStatus(HttpStatus.OK)
|
||||
public Result getReceiverCc(@RequestAttribute(value = Constants.SESSION_USER) User loginUser,
|
||||
@RequestParam(value = "processDefinitionId") int processDefinitionId){
|
||||
@RequestParam(value = "processDefinitionId",required = false) Integer processDefinitionId,
|
||||
@RequestParam(value = "processInstanceId",required = false) Integer processInstanceId) {
|
||||
logger.info("login user {}, get process definition receiver and cc", loginUser.getUserName());
|
||||
try {
|
||||
Map<String, Object> result = execService.getReceiverCc(processDefinitionId);
|
||||
Map<String, Object> result = execService.getReceiverCc(processDefinitionId,processInstanceId);
|
||||
return returnDataList(result);
|
||||
} catch (Exception e) {
|
||||
logger.error(QUERY_RECIPIENTS_AND_COPYERS_BY_PROCESS_DEFINITION_ERROR.getMsg(),e);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,129 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package cn.escheduler.api.controller;
|
||||
|
||||
|
||||
import cn.escheduler.api.service.MonitorService;
|
||||
import cn.escheduler.api.service.ServerService;
|
||||
import cn.escheduler.api.utils.Constants;
|
||||
import cn.escheduler.api.utils.Result;
|
||||
import cn.escheduler.dao.model.User;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import static cn.escheduler.api.enums.Status.*;
|
||||
|
||||
|
||||
/**
|
||||
* monitor controller
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/monitor")
|
||||
public class MonitorController extends BaseController{
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(MonitorController.class);
|
||||
|
||||
@Autowired
|
||||
private ServerService serverService;
|
||||
|
||||
@Autowired
|
||||
private MonitorService monitorService;
|
||||
|
||||
/**
|
||||
* master list
|
||||
* @param loginUser
|
||||
* @return
|
||||
*/
|
||||
@GetMapping(value = "/master/list")
|
||||
@ResponseStatus(HttpStatus.OK)
|
||||
public Result listMaster(@RequestAttribute(value = Constants.SESSION_USER) User loginUser) {
|
||||
logger.info("login user: {}, query all master", loginUser.getUserName());
|
||||
try{
|
||||
logger.info("list master, user:{}", loginUser.getUserName());
|
||||
Map<String, Object> result = serverService.queryMaster(loginUser);
|
||||
return returnDataList(result);
|
||||
}catch (Exception e){
|
||||
logger.error(LIST_MASTERS_ERROR.getMsg(),e);
|
||||
return error(LIST_MASTERS_ERROR.getCode(),
|
||||
LIST_MASTERS_ERROR.getMsg());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* worker list
|
||||
* @param loginUser
|
||||
* @return
|
||||
*/
|
||||
@GetMapping(value = "/worker/list")
|
||||
@ResponseStatus(HttpStatus.OK)
|
||||
public Result listWorker(@RequestAttribute(value = Constants.SESSION_USER) User loginUser) {
|
||||
logger.info("login user: {}, query all workers", loginUser.getUserName());
|
||||
try{
|
||||
Map<String, Object> result = serverService.queryWorker(loginUser);
|
||||
return returnDataList(result);
|
||||
}catch (Exception e){
|
||||
logger.error(LIST_WORKERS_ERROR.getMsg(),e);
|
||||
return error(LIST_WORKERS_ERROR.getCode(),
|
||||
LIST_WORKERS_ERROR.getMsg());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* query database state
|
||||
* @param loginUser
|
||||
* @return
|
||||
*/
|
||||
@GetMapping(value = "/database")
|
||||
@ResponseStatus(HttpStatus.OK)
|
||||
public Result queryDatabaseState(@RequestAttribute(value = Constants.SESSION_USER) User loginUser) {
|
||||
logger.info("login user: {}, query database state", loginUser.getUserName());
|
||||
try{
|
||||
|
||||
Map<String, Object> result = monitorService.queryDatabaseState(loginUser);
|
||||
return returnDataList(result);
|
||||
}catch (Exception e){
|
||||
logger.error(QUERY_DATABASE_STATE_ERROR.getMsg(),e);
|
||||
return error(QUERY_DATABASE_STATE_ERROR.getCode(),
|
||||
QUERY_DATABASE_STATE_ERROR.getMsg());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* query zookeeper state
|
||||
* @param loginUser
|
||||
* @return
|
||||
*/
|
||||
@GetMapping(value = "/zookeeper/list")
|
||||
@ResponseStatus(HttpStatus.OK)
|
||||
public Result queryZookeeperState(@RequestAttribute(value = Constants.SESSION_USER) User loginUser) {
|
||||
logger.info("login user: {}, query zookeeper state", loginUser.getUserName());
|
||||
try{
|
||||
Map<String, Object> result = monitorService.queryZookeeperState(loginUser);
|
||||
return returnDataList(result);
|
||||
}catch (Exception e){
|
||||
logger.error(QUERY_ZOOKEEPER_STATE_ERROR.getMsg(),e);
|
||||
return error(QUERY_ZOOKEEPER_STATE_ERROR.getCode(),
|
||||
QUERY_ZOOKEEPER_STATE_ERROR.getMsg());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -46,7 +46,6 @@ public class SchedulerController extends BaseController{
|
|||
private static final Logger logger = LoggerFactory.getLogger(SchedulerController.class);
|
||||
public static final String DEFAULT_WARNING_TYPE = "NONE";
|
||||
public static final String DEFAULT_NOTIFY_GROUP_ID = "1";
|
||||
public static final String DEFAULT_MAX_TRY_TIMES = "0";
|
||||
public static final String DEFAULT_FAILURE_POLICY = "CONTINUE";
|
||||
|
||||
|
||||
|
|
@ -77,13 +76,15 @@ public class SchedulerController extends BaseController{
|
|||
@RequestParam(value = "failureStrategy", required = false, defaultValue = DEFAULT_FAILURE_POLICY) FailureStrategy failureStrategy,
|
||||
@RequestParam(value = "receivers", required = false) String receivers,
|
||||
@RequestParam(value = "receiversCc", required = false) String receiversCc,
|
||||
@RequestParam(value = "workerGroupId", required = false, defaultValue = "-1") int workerGroupId,
|
||||
@RequestParam(value = "processInstancePriority", required = false) Priority processInstancePriority) {
|
||||
logger.info("login user {}, project name: {}, process name: {}, create schedule: {}, warning type: {}, warning group id: {}," +
|
||||
"failure policy: {},receivers : {},receiversCc : {},processInstancePriority : {}",
|
||||
loginUser.getUserName(), projectName, processDefinitionId, schedule, warningType, warningGroupId, failureStrategy,receivers,receiversCc,processInstancePriority);
|
||||
"failure policy: {},receivers : {},receiversCc : {},processInstancePriority : {}, workGroupId:{}",
|
||||
loginUser.getUserName(), projectName, processDefinitionId, schedule, warningType, warningGroupId,
|
||||
failureStrategy,receivers,receiversCc,processInstancePriority,workerGroupId);
|
||||
try {
|
||||
Map<String, Object> result = schedulerService.insertSchedule(loginUser, projectName, processDefinitionId, schedule,
|
||||
warningType, warningGroupId, failureStrategy, receivers,receiversCc,processInstancePriority);
|
||||
warningType, warningGroupId, failureStrategy, receivers,receiversCc,processInstancePriority,workerGroupId);
|
||||
|
||||
return returnDataList(result);
|
||||
}catch (Exception e){
|
||||
|
|
@ -114,14 +115,16 @@ public class SchedulerController extends BaseController{
|
|||
@RequestParam(value = "failureStrategy", required = false, defaultValue = "END") FailureStrategy failureStrategy,
|
||||
@RequestParam(value = "receivers", required = false) String receivers,
|
||||
@RequestParam(value = "receiversCc", required = false) String receiversCc,
|
||||
@RequestParam(value = "workerGroupId", required = false, defaultValue = "-1") int workerGroupId,
|
||||
@RequestParam(value = "processInstancePriority", required = false) Priority processInstancePriority) {
|
||||
logger.info("login user {}, project name: {},id: {}, updateProcessInstance schedule: {}, notify type: {}, notify mails: {}, " +
|
||||
"failure policy: {},receivers : {},receiversCc : {},processInstancePriority : {}",
|
||||
loginUser.getUserName(), projectName, id, schedule, warningType, warningGroupId, failureStrategy,receivers,receiversCc,processInstancePriority);
|
||||
"failure policy: {},receivers : {},receiversCc : {},processInstancePriority : {},workerGroupId:{}",
|
||||
loginUser.getUserName(), projectName, id, schedule, warningType, warningGroupId, failureStrategy,
|
||||
receivers,receiversCc,processInstancePriority,workerGroupId);
|
||||
|
||||
try {
|
||||
Map<String, Object> result = schedulerService.updateSchedule(loginUser, projectName, id, schedule,
|
||||
warningType, warningGroupId, failureStrategy, receivers,receiversCc,null,processInstancePriority);
|
||||
warningType, warningGroupId, failureStrategy, receivers,receiversCc,null,processInstancePriority, workerGroupId);
|
||||
return returnDataList(result);
|
||||
|
||||
}catch (Exception e){
|
||||
|
|
|
|||
|
|
@ -68,7 +68,7 @@ public class TaskRecordController extends BaseController{
|
|||
try{
|
||||
logger.info("query task record list, task name:{}, state :{}, taskDate: {}, start:{}, end:{}",
|
||||
taskName, state, taskDate, startTime, endTime);
|
||||
Map<String, Object> result = taskRecordService.queryTaskRecordListPaging(taskName, startTime, taskDate, sourceTable, destTable, endTime,state, pageNo, pageSize);
|
||||
Map<String, Object> result = taskRecordService.queryTaskRecordListPaging(false, taskName, startTime, taskDate, sourceTable, destTable, endTime,state, pageNo, pageSize);
|
||||
return returnDataListPaging(result);
|
||||
}catch (Exception e){
|
||||
logger.error(QUERY_TASK_RECORD_LIST_PAGING_ERROR.getMsg(),e);
|
||||
|
|
@ -77,4 +77,36 @@ public class TaskRecordController extends BaseController{
|
|||
|
||||
}
|
||||
|
||||
/**
|
||||
* query history task record list paging
|
||||
*
|
||||
* @param loginUser
|
||||
* @return
|
||||
*/
|
||||
@GetMapping("/history-list-paging")
|
||||
@ResponseStatus(HttpStatus.OK)
|
||||
public Result queryHistoryTaskRecordListPaging(@RequestAttribute(value = Constants.SESSION_USER) User loginUser,
|
||||
@RequestParam(value = "taskName", required = false) String taskName,
|
||||
@RequestParam(value = "state", required = false) String state,
|
||||
@RequestParam(value = "sourceTable", required = false) String sourceTable,
|
||||
@RequestParam(value = "destTable", required = false) String destTable,
|
||||
@RequestParam(value = "taskDate", required = false) String taskDate,
|
||||
@RequestParam(value = "startDate", required = false) String startTime,
|
||||
@RequestParam(value = "endDate", required = false) String endTime,
|
||||
@RequestParam("pageNo") Integer pageNo,
|
||||
@RequestParam("pageSize") Integer pageSize
|
||||
){
|
||||
|
||||
try{
|
||||
logger.info("query hisotry task record list, task name:{}, state :{}, taskDate: {}, start:{}, end:{}",
|
||||
taskName, state, taskDate, startTime, endTime);
|
||||
Map<String, Object> result = taskRecordService.queryTaskRecordListPaging(true, taskName, startTime, taskDate, sourceTable, destTable, endTime,state, pageNo, pageSize);
|
||||
return returnDataListPaging(result);
|
||||
}catch (Exception e){
|
||||
logger.error(QUERY_TASK_RECORD_LIST_PAGING_ERROR.getMsg(),e);
|
||||
return error(QUERY_TASK_RECORD_LIST_PAGING_ERROR.getCode(), QUERY_TASK_RECORD_LIST_PAGING_ERROR.getMsg());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -64,13 +64,14 @@ public class UsersController extends BaseController{
|
|||
@RequestParam(value = "userName") String userName,
|
||||
@RequestParam(value = "userPassword") String userPassword,
|
||||
@RequestParam(value = "tenantId") int tenantId,
|
||||
@RequestParam(value = "queue") String queue,
|
||||
@RequestParam(value = "email") String email,
|
||||
@RequestParam(value = "phone", required = false) String phone) {
|
||||
logger.info("login user {}, create user, userName: {}, email: {}, tenantId: {}, userPassword: {}, phone: {}, proxyUsers: {}",
|
||||
loginUser.getUserName(), userName, email, tenantId, Constants.PASSWORD_DEFAULT, phone);
|
||||
logger.info("login user {}, create user, userName: {}, email: {}, tenantId: {}, userPassword: {}, phone: {}, user queue: {}",
|
||||
loginUser.getUserName(), userName, email, tenantId, Constants.PASSWORD_DEFAULT, phone,queue);
|
||||
|
||||
try {
|
||||
Map<String, Object> result = usersService.createUser(loginUser, userName, userPassword, email, tenantId, phone);
|
||||
Map<String, Object> result = usersService.createUser(loginUser, userName, userPassword,email,tenantId, phone,queue);
|
||||
return returnDataList(result);
|
||||
}catch (Exception e){
|
||||
logger.error(CREATE_USER_ERROR.getMsg(),e);
|
||||
|
|
@ -127,13 +128,14 @@ public class UsersController extends BaseController{
|
|||
@RequestParam(value = "id") int id,
|
||||
@RequestParam(value = "userName") String userName,
|
||||
@RequestParam(value = "userPassword") String userPassword,
|
||||
@RequestParam(value = "queue") String queue,
|
||||
@RequestParam(value = "email") String email,
|
||||
@RequestParam(value = "tenantId") int tenantId,
|
||||
@RequestParam(value = "phone", required = false) String phone) {
|
||||
logger.info("login user {}, updateProcessInstance user, userName: {}, email: {}, tenantId: {}, userPassword: {}, phone: {}, proxyUsers: {}",
|
||||
loginUser.getUserName(), userName, email, tenantId, Constants.PASSWORD_DEFAULT, phone);
|
||||
logger.info("login user {}, updateProcessInstance user, userName: {}, email: {}, tenantId: {}, userPassword: {}, phone: {}, user queue: {}",
|
||||
loginUser.getUserName(), userName, email, tenantId, Constants.PASSWORD_DEFAULT, phone,queue);
|
||||
try {
|
||||
Map<String, Object> result = usersService.updateUser(id,userName,userPassword,email,tenantId,phone);
|
||||
Map<String, Object> result = usersService.updateUser(id,userName,userPassword,email,tenantId,phone,queue);
|
||||
return returnDataList(result);
|
||||
}catch (Exception e){
|
||||
logger.error(UPDATE_USER_ERROR.getMsg(),e);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,144 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package cn.escheduler.api.controller;
|
||||
|
||||
|
||||
import cn.escheduler.api.enums.Status;
|
||||
import cn.escheduler.api.service.WorkerGroupService;
|
||||
import cn.escheduler.api.utils.Constants;
|
||||
import cn.escheduler.api.utils.Result;
|
||||
import cn.escheduler.dao.model.User;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* worker group controller
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/worker-group")
|
||||
public class WorkerGroupController extends BaseController{
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(WorkerGroupController.class);
|
||||
|
||||
|
||||
@Autowired
|
||||
WorkerGroupService workerGroupService;
|
||||
|
||||
|
||||
/**
|
||||
* create or update a worker group
|
||||
* @param loginUser
|
||||
* @param id
|
||||
* @param name
|
||||
* @param ipList
|
||||
* @return
|
||||
*/
|
||||
@PostMapping(value = "/save")
|
||||
@ResponseStatus(HttpStatus.OK)
|
||||
public Result saveWorkerGroup(@RequestAttribute(value = Constants.SESSION_USER) User loginUser,
|
||||
@RequestParam(value = "id", required = false, defaultValue = "0") int id,
|
||||
@RequestParam(value = "name") String name,
|
||||
@RequestParam(value = "ipList") String ipList
|
||||
) {
|
||||
logger.info("save worker group: login user {}, id:{}, name: {}, ipList: {} ",
|
||||
loginUser.getUserName(), id, name, ipList);
|
||||
|
||||
try {
|
||||
Map<String, Object> result = workerGroupService.saveWorkerGroup(id, name, ipList);
|
||||
return returnDataList(result);
|
||||
}catch (Exception e){
|
||||
logger.error(Status.SAVE_ERROR.getMsg(),e);
|
||||
return error(Status.SAVE_ERROR.getCode(), Status.SAVE_ERROR.getMsg());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* query worker groups paging
|
||||
* @param loginUser
|
||||
* @param pageNo
|
||||
* @param searchVal
|
||||
* @param pageSize
|
||||
* @return
|
||||
*/
|
||||
@GetMapping(value = "/list-paging")
|
||||
@ResponseStatus(HttpStatus.OK)
|
||||
public Result queryAllWorkerGroupsPaging(@RequestAttribute(value = Constants.SESSION_USER) User loginUser,
|
||||
@RequestParam("pageNo") Integer pageNo,
|
||||
@RequestParam(value = "searchVal", required = false) String searchVal,
|
||||
@RequestParam("pageSize") Integer pageSize
|
||||
) {
|
||||
logger.info("query all worker group paging: login user {}, pageNo:{}, pageSize:{}, searchVal:{}",
|
||||
loginUser.getUserName() , pageNo, pageSize, searchVal);
|
||||
|
||||
try {
|
||||
Map<String, Object> result = workerGroupService.queryAllGroupPaging(pageNo, pageSize, searchVal);
|
||||
return returnDataListPaging(result);
|
||||
}catch (Exception e){
|
||||
logger.error(Status.SAVE_ERROR.getMsg(),e);
|
||||
return error(Status.SAVE_ERROR.getCode(), Status.SAVE_ERROR.getMsg());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* query all worker groups
|
||||
* @param loginUser
|
||||
* @return
|
||||
*/
|
||||
@GetMapping(value = "/all-groups")
|
||||
@ResponseStatus(HttpStatus.OK)
|
||||
public Result queryAllWorkerGroups(@RequestAttribute(value = Constants.SESSION_USER) User loginUser
|
||||
) {
|
||||
logger.info("query all worker group: login user {}",
|
||||
loginUser.getUserName() );
|
||||
|
||||
try {
|
||||
Map<String, Object> result = workerGroupService.queryAllGroup();
|
||||
return returnDataList(result);
|
||||
}catch (Exception e){
|
||||
logger.error(Status.SAVE_ERROR.getMsg(),e);
|
||||
return error(Status.SAVE_ERROR.getCode(), Status.SAVE_ERROR.getMsg());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* delete worker group by id
|
||||
* @param loginUser
|
||||
* @param id
|
||||
* @return
|
||||
*/
|
||||
@GetMapping(value = "/delete-by-id")
|
||||
@ResponseStatus(HttpStatus.OK)
|
||||
public Result deleteById(@RequestAttribute(value = Constants.SESSION_USER) User loginUser,
|
||||
@RequestParam("id") Integer id
|
||||
) {
|
||||
logger.info("delete worker group: login user {}, id:{} ",
|
||||
loginUser.getUserName() , id);
|
||||
|
||||
try {
|
||||
Map<String, Object> result = workerGroupService.deleteWorkerGroupById(id);
|
||||
return returnDataList(result);
|
||||
}catch (Exception e){
|
||||
logger.error(Status.SAVE_ERROR.getMsg(),e);
|
||||
return error(Status.SAVE_ERROR.getCode(), Status.SAVE_ERROR.getMsg());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,60 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package cn.escheduler.api.dto;
|
||||
|
||||
import cn.escheduler.common.enums.ExecutionStatus;
|
||||
|
||||
/**
|
||||
* command state count
|
||||
*/
|
||||
public class CommandStateCount {
|
||||
|
||||
private int errorCount;
|
||||
private int normalCount;
|
||||
private ExecutionStatus commandState;
|
||||
|
||||
public CommandStateCount(){}
|
||||
public CommandStateCount(int errorCount, int normalCount, ExecutionStatus commandState) {
|
||||
this.errorCount = errorCount;
|
||||
this.normalCount = normalCount;
|
||||
this.commandState = commandState;
|
||||
}
|
||||
|
||||
public int getErrorCount() {
|
||||
return errorCount;
|
||||
}
|
||||
|
||||
public void setErrorCount(int errorCount) {
|
||||
this.errorCount = errorCount;
|
||||
}
|
||||
|
||||
public int getNormalCount() {
|
||||
return normalCount;
|
||||
}
|
||||
|
||||
public void setNormalCount(int normalCount) {
|
||||
this.normalCount = normalCount;
|
||||
}
|
||||
|
||||
public ExecutionStatus getCommandState() {
|
||||
return commandState;
|
||||
}
|
||||
|
||||
public void setCommandState(ExecutionStatus commandState) {
|
||||
this.commandState = commandState;
|
||||
}
|
||||
}
|
||||
|
|
@ -31,7 +31,7 @@ public enum Status {
|
|||
HDFS_OPERATION_ERROR(10006, "hdfs operation error"),
|
||||
UPDATE_FAILED(10007, "updateProcessInstance failed"),
|
||||
TASK_INSTANCE_HOST_NOT_FOUND(10008, "task instance does not set host"),
|
||||
TENANT_NAME_EXIST(10009, "tenant name already exists"),
|
||||
TENANT_NAME_EXIST(10009, "tenant code already exists"),
|
||||
USER_NOT_EXIST(10010, "user {0} not exists"),
|
||||
ALERT_GROUP_NOT_EXIST(10011, "alarm group not found"),
|
||||
ALERT_GROUP_EXIST(10012, "alarm group already exists"),
|
||||
|
|
@ -156,6 +156,10 @@ public enum Status {
|
|||
UPDATE_QUEUE_ERROR(10131, "update queue error"),
|
||||
NEED_NOT_UPDATE_QUEUE(10132, "no content changes, no updates are required"),
|
||||
VERIFY_QUEUE_ERROR(10133,"verify queue error"),
|
||||
NAME_NULL(10134,"name must be not null"),
|
||||
NAME_EXIST(10135, "name {0} already exists"),
|
||||
SAVE_ERROR(10136, "save error"),
|
||||
|
||||
|
||||
|
||||
UDF_FUNCTION_NOT_EXIST(20001, "UDF function not found"),
|
||||
|
|
@ -197,8 +201,25 @@ public enum Status {
|
|||
PROCESS_NODE_HAS_CYCLE(50019,"process node has cycle"),
|
||||
PROCESS_NODE_S_PARAMETER_INVALID(50020,"process node %s parameter invalid"),
|
||||
|
||||
|
||||
HDFS_NOT_STARTUP(60001,"hdfs not startup"),
|
||||
|
||||
/**
|
||||
* for monitor
|
||||
*/
|
||||
QUERY_DATABASE_STATE_ERROR(70001,"query database state error"),
|
||||
QUERY_ZOOKEEPER_STATE_ERROR(70002,"query zookeeper state error"),
|
||||
|
||||
|
||||
|
||||
CREATE_ACCESS_TOKEN_ERROR(70001,"create access token error"),
|
||||
GENERATE_TOKEN_ERROR(70002,"generate token error"),
|
||||
QUERY_ACCESSTOKEN_LIST_PAGING_ERROR(70003,"query access token list paging error"),
|
||||
|
||||
|
||||
COMMAND_STATE_COUNT_ERROR(80001,"task instance state count error"),
|
||||
|
||||
QUEUE_COUNT_ERROR(90001,"queue count error"),
|
||||
|
||||
;
|
||||
|
||||
private int code;
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@ import cn.escheduler.dao.mapper.UserMapper;
|
|||
import cn.escheduler.dao.model.Session;
|
||||
import cn.escheduler.dao.model.User;
|
||||
import org.apache.commons.httpclient.HttpStatus;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
|
@ -64,37 +65,36 @@ public class LoginHandlerInterceptor implements HandlerInterceptor {
|
|||
@Override
|
||||
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
|
||||
|
||||
Session session = sessionService.getSession(request);
|
||||
// get token
|
||||
String token = request.getHeader("token");
|
||||
User user = null;
|
||||
if (StringUtils.isEmpty(token)){
|
||||
Session session = sessionService.getSession(request);
|
||||
|
||||
if(logger.isDebugEnabled()){
|
||||
logger.debug("session info : " + session);
|
||||
if (session == null) {
|
||||
response.setStatus(HttpStatus.SC_UNAUTHORIZED);
|
||||
logger.info("session info is null ");
|
||||
return false;
|
||||
}
|
||||
|
||||
//get user object from session
|
||||
user = userMapper.queryById(session.getUserId());
|
||||
|
||||
// if user is null
|
||||
if (user == null) {
|
||||
response.setStatus(HttpStatus.SC_UNAUTHORIZED);
|
||||
logger.info("user does not exist");
|
||||
return false;
|
||||
}
|
||||
}else {
|
||||
user = userMapper.queryUserByToken(token);
|
||||
if (user == null) {
|
||||
response.setStatus(HttpStatus.SC_UNAUTHORIZED);
|
||||
logger.info("user token has expired");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (session == null) {
|
||||
response.setStatus(HttpStatus.SC_UNAUTHORIZED);
|
||||
logger.info("session info is null ");
|
||||
return false;
|
||||
}
|
||||
|
||||
if(logger.isDebugEnabled()){
|
||||
logger.debug("session id: {}", session.getId());
|
||||
}
|
||||
|
||||
//get user object from session
|
||||
User user = userMapper.queryById(session.getUserId());
|
||||
|
||||
if(logger.isDebugEnabled()){
|
||||
logger.info("user info : " + user);
|
||||
}
|
||||
|
||||
|
||||
if (user == null) {
|
||||
response.setStatus(HttpStatus.SC_UNAUTHORIZED);
|
||||
return false;
|
||||
}
|
||||
|
||||
request.setAttribute(Constants.SESSION_USER, user);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -125,13 +125,14 @@ public class ProcessScheduleJob implements Job {
|
|||
}
|
||||
|
||||
Command command = new Command();
|
||||
command.setCommandType(CommandType.START_PROCESS);
|
||||
command.setCommandType(CommandType.SCHEDULER);
|
||||
command.setExecutorId(schedule.getUserId());
|
||||
command.setFailureStrategy(schedule.getFailureStrategy());
|
||||
command.setProcessDefinitionId(schedule.getProcessDefinitionId());
|
||||
command.setScheduleTime(scheduledFireTime);
|
||||
command.setStartTime(fireTime);
|
||||
command.setWarningGroupId(schedule.getWarningGroupId());
|
||||
command.setWorkerGroupId(schedule.getWorkerGroupId());
|
||||
command.setWarningType(schedule.getWarningType());
|
||||
command.setProcessInstancePriority(schedule.getProcessInstancePriority());
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,185 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package cn.escheduler.api.service;
|
||||
|
||||
import cn.escheduler.api.enums.Status;
|
||||
import cn.escheduler.api.utils.CheckUtils;
|
||||
import cn.escheduler.api.utils.Constants;
|
||||
import cn.escheduler.api.utils.PageInfo;
|
||||
import cn.escheduler.api.utils.Result;
|
||||
import cn.escheduler.common.enums.UserType;
|
||||
import cn.escheduler.common.utils.*;
|
||||
import cn.escheduler.dao.mapper.*;
|
||||
import cn.escheduler.dao.model.*;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* user service
|
||||
*/
|
||||
@Service
|
||||
public class AccessTokenService extends BaseService {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(AccessTokenService.class);
|
||||
|
||||
@Autowired
|
||||
private AccessTokenMapper accessTokenMapper;
|
||||
|
||||
|
||||
/**
|
||||
* query access token list
|
||||
*
|
||||
* @param loginUser
|
||||
* @param searchVal
|
||||
* @param pageNo
|
||||
* @param pageSize
|
||||
* @return
|
||||
*/
|
||||
public Map<String, Object> queryAccessTokenList(User loginUser, String searchVal, Integer pageNo, Integer pageSize) {
|
||||
Map<String, Object> result = new HashMap<>(5);
|
||||
|
||||
PageInfo<AccessToken> pageInfo = new PageInfo<>(pageNo, pageSize);
|
||||
Integer count;
|
||||
List<AccessToken> accessTokenList;
|
||||
if (loginUser.getUserType() == UserType.ADMIN_USER){
|
||||
count = accessTokenMapper.countAccessTokenPaging(0,searchVal);
|
||||
accessTokenList = accessTokenMapper.queryAccessTokenPaging(0,searchVal, pageInfo.getStart(), pageSize);
|
||||
}else {
|
||||
count = accessTokenMapper.countAccessTokenPaging(loginUser.getId(),searchVal);
|
||||
accessTokenList = accessTokenMapper.queryAccessTokenPaging(loginUser.getId(),searchVal, pageInfo.getStart(), pageSize);
|
||||
}
|
||||
|
||||
pageInfo.setTotalCount(count);
|
||||
pageInfo.setLists(accessTokenList);
|
||||
result.put(Constants.DATA_LIST, pageInfo);
|
||||
putMsg(result, Status.SUCCESS);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* check
|
||||
*
|
||||
* @param result
|
||||
* @param bool
|
||||
* @param userNoOperationPerm
|
||||
* @param status
|
||||
* @return
|
||||
*/
|
||||
private boolean check(Map<String, Object> result, boolean bool, Status userNoOperationPerm, String status) {
|
||||
//only admin can operate
|
||||
if (bool) {
|
||||
result.put(Constants.STATUS, userNoOperationPerm);
|
||||
result.put(status, userNoOperationPerm.getMsg());
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* create token
|
||||
*
|
||||
* @param userId
|
||||
* @param expireTime
|
||||
* @param token
|
||||
* @return
|
||||
*/
|
||||
public Map<String, Object> createToken(int userId, String expireTime, String token) {
|
||||
Map<String, Object> result = new HashMap<>(5);
|
||||
|
||||
AccessToken accessToken = new AccessToken();
|
||||
accessToken.setUserId(userId);
|
||||
accessToken.setExpireTime(DateUtils.stringToDate(expireTime));
|
||||
accessToken.setToken(token);
|
||||
accessToken.setCreateTime(new Date());
|
||||
accessToken.setUpdateTime(new Date());
|
||||
|
||||
// insert
|
||||
int insert = accessTokenMapper.insert(accessToken);
|
||||
|
||||
if (insert > 0) {
|
||||
putMsg(result, Status.SUCCESS);
|
||||
} else {
|
||||
putMsg(result, Status.CREATE_ALERT_GROUP_ERROR);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* generate token
|
||||
* @param userId
|
||||
* @param expireTime
|
||||
* @return
|
||||
*/
|
||||
public Map<String, Object> generateToken(int userId, String expireTime) {
|
||||
Map<String, Object> result = new HashMap<>(5);
|
||||
String token = EncryptionUtils.getMd5(userId + expireTime + String.valueOf(System.currentTimeMillis()));
|
||||
result.put(Constants.DATA_LIST, token);
|
||||
putMsg(result, Status.SUCCESS);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* delete access token
|
||||
* @param loginUser
|
||||
* @param id
|
||||
* @return
|
||||
*/
|
||||
public Map<String, Object> delAccessTokenById(User loginUser, int id) {
|
||||
Map<String, Object> result = new HashMap<>(5);
|
||||
//only admin can operate
|
||||
if (!isAdmin(loginUser)) {
|
||||
putMsg(result, Status.USER_NOT_EXIST, id);
|
||||
return result;
|
||||
}
|
||||
|
||||
accessTokenMapper.delete(id);
|
||||
putMsg(result, Status.SUCCESS);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* update token by id
|
||||
* @param id
|
||||
* @param userId
|
||||
* @param expireTime
|
||||
* @param token
|
||||
* @return
|
||||
*/
|
||||
public Map<String, Object> updateToken(int id,int userId, String expireTime, String token) {
|
||||
Map<String, Object> result = new HashMap<>(5);
|
||||
AccessToken accessToken = new AccessToken();
|
||||
accessToken.setId(id);
|
||||
accessToken.setUserId(userId);
|
||||
accessToken.setExpireTime(DateUtils.stringToDate(expireTime));
|
||||
accessToken.setToken(token);
|
||||
accessToken.setUpdateTime(new Date());
|
||||
|
||||
accessTokenMapper.update(accessToken);
|
||||
|
||||
putMsg(result, Status.SUCCESS);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
|
@ -17,29 +17,29 @@
|
|||
package cn.escheduler.api.service;
|
||||
|
||||
|
||||
import cn.escheduler.api.dto.CommandStateCount;
|
||||
import cn.escheduler.api.dto.DefineUserDto;
|
||||
import cn.escheduler.api.dto.TaskCountDto;
|
||||
import cn.escheduler.api.enums.Status;
|
||||
import cn.escheduler.api.utils.Constants;
|
||||
import cn.escheduler.common.enums.ExecutionStatus;
|
||||
import cn.escheduler.common.enums.UserType;
|
||||
import cn.escheduler.common.queue.ITaskQueue;
|
||||
import cn.escheduler.common.queue.TaskQueueFactory;
|
||||
import cn.escheduler.common.utils.DateUtils;
|
||||
import cn.escheduler.dao.mapper.ProcessDefinitionMapper;
|
||||
import cn.escheduler.dao.mapper.ProcessInstanceMapper;
|
||||
import cn.escheduler.dao.mapper.ProjectMapper;
|
||||
import cn.escheduler.dao.mapper.TaskInstanceMapper;
|
||||
import cn.escheduler.dao.mapper.*;
|
||||
import cn.escheduler.dao.model.DefinitionGroupByUser;
|
||||
import cn.escheduler.dao.model.ExecuteStatusCount;
|
||||
import cn.escheduler.dao.model.Project;
|
||||
import cn.escheduler.dao.model.User;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.text.MessageFormat;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* data analysis service
|
||||
|
|
@ -55,15 +55,21 @@ public class DataAnalysisService {
|
|||
@Autowired
|
||||
ProjectService projectService;
|
||||
|
||||
@Autowired
|
||||
TaskInstanceMapper taskInstanceMapper;
|
||||
|
||||
@Autowired
|
||||
ProcessInstanceMapper processInstanceMapper;
|
||||
|
||||
@Autowired
|
||||
ProcessDefinitionMapper processDefinitionMapper;
|
||||
|
||||
@Autowired
|
||||
CommandMapper commandMapper;
|
||||
|
||||
@Autowired
|
||||
ErrorCommandMapper errorCommandMapper;
|
||||
|
||||
@Autowired
|
||||
TaskInstanceMapper taskInstanceMapper;
|
||||
|
||||
/**
|
||||
* statistical task instance status data
|
||||
*
|
||||
|
|
@ -206,4 +212,175 @@ public class DataAnalysisService {
|
|||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* statistical command status data
|
||||
*
|
||||
* @param loginUser
|
||||
* @param projectId
|
||||
* @param startDate
|
||||
* @param endDate
|
||||
* @return
|
||||
*/
|
||||
public Map<String, Object> countCommandState(User loginUser, int projectId, String startDate, String endDate) {
|
||||
|
||||
Map<String, Object> result = new HashMap<>(5);
|
||||
if(projectId != 0){
|
||||
Project project = projectMapper.queryById(projectId);
|
||||
result = projectService.checkProjectAndAuth(loginUser, project, String.valueOf(projectId));
|
||||
|
||||
if (getResultStatus(result)){
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* find all the task lists in the project under the user
|
||||
* statistics based on task status execution, failure, completion, wait, total
|
||||
*/
|
||||
Date start = null;
|
||||
Date end = null;
|
||||
|
||||
try {
|
||||
start = DateUtils.getScheduleDate(startDate);
|
||||
end = DateUtils.getScheduleDate(endDate);
|
||||
} catch (Exception e) {
|
||||
logger.error(e.getMessage(),e);
|
||||
putErrorRequestParamsMsg(result);
|
||||
return result;
|
||||
}
|
||||
|
||||
// count command state
|
||||
List<ExecuteStatusCount> commandStateCounts =
|
||||
commandMapper.countCommandState(loginUser.getId(),
|
||||
loginUser.getUserType(), start, end, projectId);
|
||||
|
||||
// count error command state
|
||||
List<ExecuteStatusCount> errorCommandStateCounts =
|
||||
errorCommandMapper.countCommandState(loginUser.getId(),
|
||||
loginUser.getUserType(), start, end, projectId);
|
||||
|
||||
//
|
||||
Map<ExecutionStatus,Map<String,Integer>> dataMap = new HashMap<>();
|
||||
|
||||
Map<String,Integer> commonCommand = new HashMap<>();
|
||||
commonCommand.put("commandState",0);
|
||||
commonCommand.put("errorCommandState",0);
|
||||
|
||||
|
||||
// init data map
|
||||
dataMap.put(ExecutionStatus.SUBMITTED_SUCCESS,commonCommand);
|
||||
dataMap.put(ExecutionStatus.RUNNING_EXEUTION,commonCommand);
|
||||
dataMap.put(ExecutionStatus.READY_PAUSE,commonCommand);
|
||||
dataMap.put(ExecutionStatus.PAUSE,commonCommand);
|
||||
dataMap.put(ExecutionStatus.READY_STOP,commonCommand);
|
||||
dataMap.put(ExecutionStatus.STOP,commonCommand);
|
||||
dataMap.put(ExecutionStatus.FAILURE,commonCommand);
|
||||
dataMap.put(ExecutionStatus.SUCCESS,commonCommand);
|
||||
dataMap.put(ExecutionStatus.NEED_FAULT_TOLERANCE,commonCommand);
|
||||
dataMap.put(ExecutionStatus.KILL,commonCommand);
|
||||
dataMap.put(ExecutionStatus.WAITTING_THREAD,commonCommand);
|
||||
dataMap.put(ExecutionStatus.WAITTING_DEPEND,commonCommand);
|
||||
|
||||
// put command state
|
||||
for (ExecuteStatusCount executeStatusCount : commandStateCounts){
|
||||
Map<String,Integer> commandStateCountsMap = new HashMap<>(dataMap.get(executeStatusCount.getExecutionStatus()));
|
||||
commandStateCountsMap.put("commandState", executeStatusCount.getCount());
|
||||
dataMap.put(executeStatusCount.getExecutionStatus(),commandStateCountsMap);
|
||||
}
|
||||
|
||||
// put error command state
|
||||
for (ExecuteStatusCount errorExecutionStatus : errorCommandStateCounts){
|
||||
Map<String,Integer> errorCommandStateCountsMap = new HashMap<>(dataMap.get(errorExecutionStatus.getExecutionStatus()));
|
||||
errorCommandStateCountsMap.put("errorCommandState",errorExecutionStatus.getCount());
|
||||
dataMap.put(errorExecutionStatus.getExecutionStatus(),errorCommandStateCountsMap);
|
||||
}
|
||||
|
||||
List<CommandStateCount> list = new ArrayList<>();
|
||||
Iterator<Map.Entry<ExecutionStatus, Map<String, Integer>>> iterator = dataMap.entrySet().iterator();
|
||||
while (iterator.hasNext()){
|
||||
Map.Entry<ExecutionStatus, Map<String, Integer>> next = iterator.next();
|
||||
CommandStateCount commandStateCount = new CommandStateCount(next.getValue().get("errorCommandState"),
|
||||
next.getValue().get("commandState"),next.getKey());
|
||||
list.add(commandStateCount);
|
||||
}
|
||||
|
||||
result.put(Constants.DATA_LIST, list);
|
||||
putMsg(result, Status.SUCCESS);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* count queue state
|
||||
* @param loginUser
|
||||
* @param projectId
|
||||
* @return
|
||||
*/
|
||||
public Map<String, Object> countQueueState(User loginUser, int projectId) {
|
||||
Map<String, Object> result = new HashMap<>(5);
|
||||
if(projectId != 0){
|
||||
Project project = projectMapper.queryById(projectId);
|
||||
result = projectService.checkProjectAndAuth(loginUser, project, String.valueOf(projectId));
|
||||
|
||||
if (getResultStatus(result)){
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
ITaskQueue tasksQueue = TaskQueueFactory.getTaskQueueInstance();
|
||||
List<String> tasksQueueList = tasksQueue.getAllTasks(cn.escheduler.common.Constants.SCHEDULER_TASKS_QUEUE);
|
||||
List<String> tasksKillList = tasksQueue.getAllTasks(cn.escheduler.common.Constants.SCHEDULER_TASKS_KILL);
|
||||
|
||||
Map<String,Integer> dataMap = new HashMap<>();
|
||||
if (loginUser.getUserType() == UserType.ADMIN_USER){
|
||||
dataMap.put("taskQueue",tasksQueueList.size());
|
||||
dataMap.put("taskKill",tasksKillList.size());
|
||||
|
||||
result.put(Constants.DATA_LIST, dataMap);
|
||||
putMsg(result, Status.SUCCESS);
|
||||
return result;
|
||||
}
|
||||
|
||||
int[] tasksQueueIds = new int[tasksQueueList.size()];
|
||||
int[] tasksKillIds = new int[tasksKillList.size()];
|
||||
|
||||
int i =0;
|
||||
for (String taskQueueStr : tasksQueueList){
|
||||
if (StringUtils.isNotEmpty(taskQueueStr)){
|
||||
String[] splits = taskQueueStr.split("_");
|
||||
if (splits.length == 4){
|
||||
tasksQueueIds[i++]=Integer.parseInt(splits[3]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
i = 0;
|
||||
for (String taskKillStr : tasksKillList){
|
||||
if (StringUtils.isNotEmpty(taskKillStr)){
|
||||
String[] splits = taskKillStr.split("-");
|
||||
if (splits.length == 2){
|
||||
tasksKillIds[i++]=Integer.parseInt(splits[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
Integer taskQueueCount = 0;
|
||||
Integer taskKillCount = 0;
|
||||
|
||||
if (tasksQueueIds.length != 0){
|
||||
taskQueueCount = taskInstanceMapper.countTask(loginUser.getId(),loginUser.getUserType(),projectId, tasksQueueIds);
|
||||
}
|
||||
|
||||
if (tasksKillIds.length != 0){
|
||||
taskKillCount = taskInstanceMapper.countTask(loginUser.getId(),loginUser.getUserType(),projectId, tasksKillIds);
|
||||
}
|
||||
|
||||
|
||||
|
||||
dataMap.put("taskQueue",taskQueueCount);
|
||||
dataMap.put("taskKill",taskKillCount);
|
||||
|
||||
result.put(Constants.DATA_LIST, dataMap);
|
||||
putMsg(result, Status.SUCCESS);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -480,7 +480,9 @@ public class DataSourceService extends BaseService{
|
|||
|
||||
}
|
||||
|
||||
logger.info("parameters map-----" + JSONObject.toJSONString(parameterMap));
|
||||
if(logger.isDebugEnabled()){
|
||||
logger.info("parameters map-----" + JSONObject.toJSONString(parameterMap));
|
||||
}
|
||||
return JSONObject.toJSONString(parameterMap);
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -90,7 +90,7 @@ public class ExecutorService extends BaseService{
|
|||
FailureStrategy failureStrategy, String startNodeList,
|
||||
TaskDependType taskDependType, WarningType warningType, int warningGroupId,
|
||||
String receivers, String receiversCc, RunMode runMode,
|
||||
Priority processInstancePriority, Integer timeout) throws ParseException {
|
||||
Priority processInstancePriority, int workerGroupId, Integer timeout) throws ParseException {
|
||||
Map<String, Object> result = new HashMap<>(5);
|
||||
// timeout is valid
|
||||
if (timeout <= 0 || timeout > MAX_TASK_TIMEOUT) {
|
||||
|
|
@ -115,7 +115,7 @@ public class ExecutorService extends BaseService{
|
|||
*/
|
||||
int create = this.createCommand(commandType, processDefinitionId,
|
||||
taskDependType, failureStrategy, startNodeList, cronTime, warningType, loginUser.getId(),
|
||||
warningGroupId, runMode,processInstancePriority);
|
||||
warningGroupId, runMode,processInstancePriority, workerGroupId);
|
||||
if(create > 0 ){
|
||||
/**
|
||||
* according to the process definition ID updateProcessInstance and CC recipient
|
||||
|
|
@ -361,18 +361,29 @@ public class ExecutorService extends BaseService{
|
|||
}
|
||||
|
||||
/**
|
||||
* query recipients and copyers by process definition id
|
||||
* query recipients and copyers by process definition id or processInstanceId
|
||||
*
|
||||
* @param processDefineId
|
||||
* @return
|
||||
*/
|
||||
public Map<String, Object> getReceiverCc(int processDefineId) {
|
||||
public Map<String, Object> getReceiverCc(Integer processDefineId,Integer processInstanceId) {
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
|
||||
logger.info("processInstanceId {}",processInstanceId);
|
||||
if(processDefineId == null && processInstanceId == null){
|
||||
throw new RuntimeException("You must set values for parameters processDefineId or processInstanceId");
|
||||
}
|
||||
if(processDefineId == null && processInstanceId != null) {
|
||||
ProcessInstance processInstance = processInstanceMapper.queryById(processInstanceId);
|
||||
if (processInstance == null) {
|
||||
throw new RuntimeException("processInstanceId is not exists");
|
||||
}
|
||||
processDefineId = processInstance.getProcessDefinitionId();
|
||||
}
|
||||
ProcessDefinition processDefinition = processDefinitionMapper.queryByDefineId(processDefineId);
|
||||
if (processDefinition == null){
|
||||
throw new RuntimeException("processDefineId is not exists");
|
||||
throw new RuntimeException(String.format("processDefineId %d is not exists",processDefineId));
|
||||
}
|
||||
|
||||
String receivers = processDefinition.getReceivers();
|
||||
String receiversCc = processDefinition.getReceiversCc();
|
||||
Map<String,String> dataMap = new HashMap<>();
|
||||
|
|
@ -405,7 +416,7 @@ public class ExecutorService extends BaseService{
|
|||
TaskDependType nodeDep, FailureStrategy failureStrategy,
|
||||
String startNodeList, String schedule, WarningType warningType,
|
||||
int excutorId, int warningGroupId,
|
||||
RunMode runMode,Priority processInstancePriority) throws ParseException {
|
||||
RunMode runMode,Priority processInstancePriority, int workerGroupId) throws ParseException {
|
||||
|
||||
/**
|
||||
* instantiate command schedule instance
|
||||
|
|
@ -436,6 +447,7 @@ public class ExecutorService extends BaseService{
|
|||
command.setExecutorId(excutorId);
|
||||
command.setWarningGroupId(warningGroupId);
|
||||
command.setProcessInstancePriority(processInstancePriority);
|
||||
command.setWorkerGroupId(workerGroupId);
|
||||
|
||||
Date start = null;
|
||||
Date end = null;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,72 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package cn.escheduler.api.service;
|
||||
|
||||
import cn.escheduler.api.enums.Status;
|
||||
import cn.escheduler.api.utils.Constants;
|
||||
import cn.escheduler.api.utils.ZookeeperMonitorUtils;
|
||||
import cn.escheduler.dao.MonitorDBDao;
|
||||
import cn.escheduler.dao.model.MonitorRecord;
|
||||
import cn.escheduler.dao.model.User;
|
||||
import cn.escheduler.dao.model.ZookeeperRecord;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* monitor service
|
||||
*/
|
||||
@Service
|
||||
public class MonitorService extends BaseService{
|
||||
|
||||
/**
|
||||
* query database state
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public Map<String,Object> queryDatabaseState(User loginUser) {
|
||||
Map<String, Object> result = new HashMap<>(5);
|
||||
|
||||
List<MonitorRecord> monitorRecordList = MonitorDBDao.queryDatabaseState();
|
||||
|
||||
result.put(Constants.DATA_LIST, monitorRecordList);
|
||||
putMsg(result, Status.SUCCESS);
|
||||
|
||||
return result;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* query zookeeper state
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public Map<String,Object> queryZookeeperState(User loginUser) {
|
||||
Map<String, Object> result = new HashMap<>(5);
|
||||
|
||||
List<ZookeeperRecord> zookeeperRecordList = ZookeeperMonitorUtils.zookeeperInfoList();
|
||||
|
||||
result.put(Constants.DATA_LIST, zookeeperRecordList);
|
||||
putMsg(result, Status.SUCCESS);
|
||||
|
||||
return result;
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -114,7 +114,7 @@ public class ProcessDefinitionService extends BaseDAGService {
|
|||
ProcessData processData = JSONUtils.parseObject(processDefinitionJson, ProcessData.class);
|
||||
Map<String, Object> checkProcessJson = checkProcessNodeList(processData, processDefinitionJson);
|
||||
if (checkProcessJson.get(Constants.STATUS) != Status.SUCCESS) {
|
||||
return result;
|
||||
return checkProcessJson;
|
||||
}
|
||||
|
||||
processDefine.setName(name);
|
||||
|
|
@ -125,6 +125,7 @@ public class ProcessDefinitionService extends BaseDAGService {
|
|||
processDefine.setDesc(desc);
|
||||
processDefine.setLocations(locations);
|
||||
processDefine.setConnects(connects);
|
||||
processDefine.setTimeout(processData.getTimeout());
|
||||
|
||||
//custom global params
|
||||
List<Property> globalParamsList = processData.getGlobalParams();
|
||||
|
|
@ -262,7 +263,7 @@ public class ProcessDefinitionService extends BaseDAGService {
|
|||
ProcessData processData = JSONUtils.parseObject(processDefinitionJson, ProcessData.class);
|
||||
Map<String, Object> checkProcessJson = checkProcessNodeList(processData, processDefinitionJson);
|
||||
if ((checkProcessJson.get(Constants.STATUS) != Status.SUCCESS)) {
|
||||
return result;
|
||||
return checkProcessJson;
|
||||
}
|
||||
ProcessDefinition processDefinition = processDao.findProcessDefineById(id);
|
||||
if (processDefinition == null) {
|
||||
|
|
@ -288,6 +289,7 @@ public class ProcessDefinitionService extends BaseDAGService {
|
|||
processDefine.setDesc(desc);
|
||||
processDefine.setLocations(locations);
|
||||
processDefine.setConnects(connects);
|
||||
processDefine.setTimeout(processData.getTimeout());
|
||||
|
||||
//custom global params
|
||||
List<Property> globalParamsList = processData.getGlobalParams();
|
||||
|
|
@ -717,7 +719,9 @@ public class ProcessDefinitionService extends BaseDAGService {
|
|||
List<String> preTasks = JSONUtils.toList(taskNodeResponse.getPreTasks(),String.class);
|
||||
if (CollectionUtils.isNotEmpty(preTasks)) {
|
||||
for (String preTask : preTasks) {
|
||||
graph.addEdge(preTask, taskNodeResponse.getName());
|
||||
if (!graph.addEdge(preTask, taskNodeResponse.getName())) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -346,7 +346,8 @@ public class ProcessInstanceService extends BaseDAGService {
|
|||
|
||||
//check process instance status
|
||||
if (!processInstance.getState().typeIsFinished()) {
|
||||
putMsg(result, Status.PROCESS_INSTANCE_STATE_OPERATION_ERROR, "update");
|
||||
putMsg(result, Status.PROCESS_INSTANCE_STATE_OPERATION_ERROR,
|
||||
processInstance.getName(), processInstance.getState().toString(), "update");
|
||||
return result;
|
||||
}
|
||||
Date schedule = null;
|
||||
|
|
@ -355,8 +356,12 @@ public class ProcessInstanceService extends BaseDAGService {
|
|||
} else {
|
||||
schedule = processInstance.getScheduleTime();
|
||||
}
|
||||
processInstance.setScheduleTime(schedule);
|
||||
processInstance.setLocations(locations);
|
||||
processInstance.setConnects(connects);
|
||||
String globalParams = null;
|
||||
String originDefParams = null;
|
||||
int timeout = processInstance.getTimeout();
|
||||
if (StringUtils.isNotEmpty(processInstanceJson)) {
|
||||
ProcessData processData = JSONUtils.parseObject(processInstanceJson, ProcessData.class);
|
||||
//check workflow json is valid
|
||||
|
|
@ -370,9 +375,14 @@ public class ProcessInstanceService extends BaseDAGService {
|
|||
Map<String, String> globalParamMap = globalParamList.stream().collect(Collectors.toMap(Property::getProp, Property::getValue));
|
||||
globalParams = ParameterUtils.curingGlobalParams(globalParamMap, globalParamList,
|
||||
processInstance.getCmdTypeIfComplement(), schedule);
|
||||
timeout = processData.getTimeout();
|
||||
processInstance.setTimeout(timeout);
|
||||
processInstance.setProcessInstanceJson(processInstanceJson);
|
||||
processInstance.setGlobalParams(globalParams);
|
||||
}
|
||||
int update = processDao.updateProcessInstance(processInstanceId, processInstanceJson,
|
||||
globalParams, schedule, flag, locations, connects);
|
||||
// int update = processDao.updateProcessInstance(processInstanceId, processInstanceJson,
|
||||
// globalParams, schedule, flag, locations, connects);
|
||||
int update = processDao.updateProcessInstance(processInstance);
|
||||
int updateDefine = 1;
|
||||
if (syncDefine && StringUtils.isNotEmpty(processInstanceJson)) {
|
||||
ProcessDefinition processDefinition = processDao.findProcessDefineById(processInstance.getProcessDefinitionId());
|
||||
|
|
@ -380,6 +390,7 @@ public class ProcessInstanceService extends BaseDAGService {
|
|||
processDefinition.setGlobalParams(originDefParams);
|
||||
processDefinition.setLocations(locations);
|
||||
processDefinition.setConnects(connects);
|
||||
processDefinition.setTimeout(timeout);
|
||||
updateDefine = processDefineMapper.update(processDefinition);
|
||||
}
|
||||
if (update > 0 && updateDefine > 0) {
|
||||
|
|
@ -509,7 +520,7 @@ public class ProcessInstanceService extends BaseDAGService {
|
|||
}
|
||||
|
||||
// local params
|
||||
Map<String, List<Property>> localUserDefParams = new HashMap<>();
|
||||
Map<String, Map<String,Object>> localUserDefParams = new HashMap<>();
|
||||
for (TaskNode taskNode : taskNodeList) {
|
||||
String parameter = taskNode.getParams();
|
||||
Map<String, String> map = JSONUtils.toMap(parameter);
|
||||
|
|
@ -517,8 +528,11 @@ public class ProcessInstanceService extends BaseDAGService {
|
|||
if (localParams != null && !localParams.isEmpty()) {
|
||||
localParams = ParameterUtils.convertParameterPlaceholders(localParams, timeParams);
|
||||
List<Property> localParamsList = JSON.parseArray(localParams, Property.class);
|
||||
Map<String,Object> localParamsMap = new HashMap<>();
|
||||
localParamsMap.put("taskType",taskNode.getType());
|
||||
localParamsMap.put("localParamsList",localParamsList);
|
||||
if (localParamsList.size() > 0) {
|
||||
localUserDefParams.put(taskNode.getName(), localParamsList);
|
||||
localUserDefParams.put(taskNode.getName(), localParamsMap);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -242,7 +242,11 @@ public class ProjectService extends BaseService{
|
|||
if (checkResult != null) {
|
||||
return checkResult;
|
||||
}
|
||||
|
||||
Project tempProject = projectMapper.queryByName(projectName);
|
||||
if (tempProject != null && tempProject.getId() != projectId) {
|
||||
putMsg(result, Status.PROJECT_ALREADY_EXISTS, projectName);
|
||||
return result;
|
||||
}
|
||||
project.setName(projectName);
|
||||
project.setDesc(desc);
|
||||
project.setUpdateTime(new Date());
|
||||
|
|
|
|||
|
|
@ -88,7 +88,7 @@ public class SchedulerService extends BaseService {
|
|||
@Transactional(value = "TransactionManager", rollbackFor = Exception.class)
|
||||
public Map<String, Object> insertSchedule(User loginUser, String projectName, Integer processDefineId, String schedule, WarningType warningType,
|
||||
int warningGroupId, FailureStrategy failureStrategy,
|
||||
String receivers, String receiversCc,Priority processInstancePriority) throws IOException {
|
||||
String receivers, String receiversCc,Priority processInstancePriority, int workerGroupId) throws IOException {
|
||||
|
||||
Map<String, Object> result = new HashMap<String, Object>(5);
|
||||
|
||||
|
|
@ -133,6 +133,7 @@ public class SchedulerService extends BaseService {
|
|||
scheduleObj.setUserName(loginUser.getUserName());
|
||||
scheduleObj.setReleaseState(ReleaseState.OFFLINE);
|
||||
scheduleObj.setProcessInstancePriority(processInstancePriority);
|
||||
scheduleObj.setWorkerGroupId(workerGroupId);
|
||||
scheduleMapper.insert(scheduleObj);
|
||||
|
||||
/**
|
||||
|
|
@ -156,13 +157,14 @@ public class SchedulerService extends BaseService {
|
|||
* @param warningGroupId
|
||||
* @param failureStrategy
|
||||
* @param scheduleStatus
|
||||
* @param workerGroupId
|
||||
* @return
|
||||
*/
|
||||
@Transactional(value = "TransactionManager", rollbackFor = Exception.class)
|
||||
public Map<String, Object> updateSchedule(User loginUser, String projectName, Integer id, String scheduleExpression, WarningType warningType,
|
||||
int warningGroupId, FailureStrategy failureStrategy,
|
||||
String receivers, String receiversCc, ReleaseState scheduleStatus,
|
||||
Priority processInstancePriority) throws IOException {
|
||||
Priority processInstancePriority, int workerGroupId) throws IOException {
|
||||
Map<String, Object> result = new HashMap<String, Object>(5);
|
||||
|
||||
Project project = projectMapper.queryByName(projectName);
|
||||
|
|
@ -221,6 +223,7 @@ public class SchedulerService extends BaseService {
|
|||
if (scheduleStatus != null) {
|
||||
schedule.setReleaseState(scheduleStatus);
|
||||
}
|
||||
schedule.setWorkerGroupId(workerGroupId);
|
||||
schedule.setUpdateTime(now);
|
||||
schedule.setProcessInstancePriority(processInstancePriority);
|
||||
scheduleMapper.update(schedule);
|
||||
|
|
|
|||
|
|
@ -52,9 +52,6 @@ public class ServerService extends BaseService{
|
|||
public Map<String,Object> queryMaster(User loginUser) {
|
||||
|
||||
Map<String, Object> result = new HashMap<>(5);
|
||||
if (checkAdmin(loginUser, result)){
|
||||
return result;
|
||||
}
|
||||
|
||||
List<MasterServer> masterList = masterServerMapper.queryAllMaster();
|
||||
result.put(Constants.DATA_LIST, masterList);
|
||||
|
|
@ -71,9 +68,6 @@ public class ServerService extends BaseService{
|
|||
*/
|
||||
public Map<String,Object> queryWorker(User loginUser) {
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
if (checkAdmin(loginUser, result)){
|
||||
return result;
|
||||
}
|
||||
|
||||
List<WorkerServer> workerList = workerServerMapper.queryAllWorker();
|
||||
result.put(Constants.DATA_LIST, workerList);
|
||||
|
|
|
|||
|
|
@ -29,6 +29,8 @@ import java.util.HashMap;
|
|||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import static cn.escheduler.common.Constants.*;
|
||||
|
||||
/**
|
||||
* task record service
|
||||
*/
|
||||
|
|
@ -51,7 +53,7 @@ public class TaskRecordService extends BaseService{
|
|||
* @param pageSize
|
||||
* @return
|
||||
*/
|
||||
public Map<String,Object> queryTaskRecordListPaging(String taskName, String startDate,
|
||||
public Map<String,Object> queryTaskRecordListPaging(boolean isHistory, String taskName, String startDate,
|
||||
String taskDate, String sourceTable,
|
||||
String destTable, String endDate,
|
||||
String state, Integer pageNo, Integer pageSize) {
|
||||
|
|
@ -69,8 +71,9 @@ public class TaskRecordService extends BaseService{
|
|||
map.put("offset", pageInfo.getStart().toString());
|
||||
map.put("pageSize", pageInfo.getPageSize().toString());
|
||||
|
||||
int count = TaskRecordDao.countTaskRecord(map);
|
||||
List<TaskRecord> recordList = TaskRecordDao.queryAllTaskRecord(map);
|
||||
String table = isHistory ? TASK_RECORD_TABLE_HISTORY_HIVE_LOG : TASK_RECORD_TABLE_HIVE_LOG;
|
||||
int count = TaskRecordDao.countTaskRecord(map, table);
|
||||
List<TaskRecord> recordList = TaskRecordDao.queryAllTaskRecord(map, table);
|
||||
pageInfo.setTotalCount(count);
|
||||
pageInfo.setLists(recordList);
|
||||
result.put(Constants.DATA_LIST, pageInfo);
|
||||
|
|
|
|||
|
|
@ -80,6 +80,10 @@ public class TenantService extends BaseService{
|
|||
Tenant tenant = new Tenant();
|
||||
Date now = new Date();
|
||||
|
||||
if (!tenantCode.matches("^[0-9a-zA-Z_.-]{1,}$") || tenantCode.startsWith("-") || tenantCode.startsWith(".")){
|
||||
putMsg(result, Status.VERIFY_TENANT_CODE_ERROR);
|
||||
return result;
|
||||
}
|
||||
tenant.setTenantCode(tenantCode);
|
||||
tenant.setTenantName(tenantName);
|
||||
tenant.setQueueId(queueId);
|
||||
|
|
|
|||
|
|
@ -87,7 +87,8 @@ public class UsersService extends BaseService {
|
|||
String userPassword,
|
||||
String email,
|
||||
int tenantId,
|
||||
String phone) throws Exception {
|
||||
String phone,
|
||||
String queue) throws Exception {
|
||||
|
||||
Map<String, Object> result = new HashMap<>(5);
|
||||
result = CheckUtils.checkUserParams(userName, userPassword, email, phone);
|
||||
|
|
@ -114,6 +115,7 @@ public class UsersService extends BaseService {
|
|||
user.setUserType(UserType.GENERAL_USER);
|
||||
user.setCreateTime(now);
|
||||
user.setUpdateTime(now);
|
||||
user.setQueue(queue);
|
||||
|
||||
// save user
|
||||
userMapper.insert(user);
|
||||
|
|
@ -194,7 +196,13 @@ public class UsersService extends BaseService {
|
|||
* @param phone
|
||||
* @return
|
||||
*/
|
||||
public Map<String, Object> updateUser(int userId, String userName, String userPassword, String email, int tenantId, String phone) throws Exception {
|
||||
public Map<String, Object> updateUser(int userId,
|
||||
String userName,
|
||||
String userPassword,
|
||||
String email,
|
||||
int tenantId,
|
||||
String phone,
|
||||
String queue) throws Exception {
|
||||
Map<String, Object> result = new HashMap<>(5);
|
||||
result.put(Constants.STATUS, false);
|
||||
|
||||
|
|
@ -208,6 +216,11 @@ public class UsersService extends BaseService {
|
|||
Date now = new Date();
|
||||
|
||||
if (StringUtils.isNotEmpty(userName)) {
|
||||
User tempUser = userMapper.queryByUserName(userName);
|
||||
if (tempUser != null && tempUser.getId() != userId) {
|
||||
putMsg(result, Status.USER_NAME_EXIST);
|
||||
return result;
|
||||
}
|
||||
user.setUserName(userName);
|
||||
}
|
||||
|
||||
|
|
@ -218,6 +231,7 @@ public class UsersService extends BaseService {
|
|||
if (StringUtils.isNotEmpty(email)) {
|
||||
user.setEmail(email);
|
||||
}
|
||||
user.setQueue(queue);
|
||||
user.setPhone(phone);
|
||||
user.setUpdateTime(now);
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,155 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package cn.escheduler.api.service;
|
||||
|
||||
import cn.escheduler.api.enums.Status;
|
||||
import cn.escheduler.api.utils.Constants;
|
||||
import cn.escheduler.api.utils.PageInfo;
|
||||
import cn.escheduler.dao.mapper.WorkerGroupMapper;
|
||||
import cn.escheduler.dao.model.User;
|
||||
import cn.escheduler.dao.model.WorkerGroup;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* work group service
|
||||
*/
|
||||
@Service
|
||||
public class WorkerGroupService extends BaseService {
|
||||
|
||||
|
||||
@Autowired
|
||||
WorkerGroupMapper workerGroupMapper;
|
||||
|
||||
/**
|
||||
* create or update a worker group
|
||||
* @param id
|
||||
* @param name
|
||||
* @param ipList
|
||||
* @return
|
||||
*/
|
||||
public Map<String, Object> saveWorkerGroup(int id, String name, String ipList){
|
||||
|
||||
Map<String, Object> result = new HashMap<>(5);
|
||||
|
||||
if(StringUtils.isEmpty(name)){
|
||||
putMsg(result, Status.NAME_NULL);
|
||||
return result;
|
||||
}
|
||||
Date now = new Date();
|
||||
WorkerGroup workerGroup = null;
|
||||
if(id != 0){
|
||||
workerGroup = workerGroupMapper.queryById(id);
|
||||
}else{
|
||||
workerGroup = new WorkerGroup();
|
||||
workerGroup.setCreateTime(now);
|
||||
}
|
||||
workerGroup.setName(name);
|
||||
workerGroup.setIpList(ipList);
|
||||
workerGroup.setUpdateTime(now);
|
||||
|
||||
if(checkWorkerGroupNameExists(workerGroup)){
|
||||
putMsg(result, Status.NAME_EXIST, workerGroup.getName());
|
||||
return result;
|
||||
}
|
||||
if(workerGroup.getId() != 0 ){
|
||||
workerGroupMapper.update(workerGroup);
|
||||
}else{
|
||||
workerGroupMapper.insert(workerGroup);
|
||||
}
|
||||
putMsg(result, Status.SUCCESS);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* check worker group name exists
|
||||
* @param workerGroup
|
||||
* @return
|
||||
*/
|
||||
private boolean checkWorkerGroupNameExists(WorkerGroup workerGroup) {
|
||||
|
||||
List<WorkerGroup> workerGroupList = workerGroupMapper.queryWorkerGroupByName(workerGroup.getName());
|
||||
|
||||
if(workerGroupList.size() > 0 ){
|
||||
// new group has same name..
|
||||
if(workerGroup.getId() == 0){
|
||||
return true;
|
||||
}
|
||||
// update group...
|
||||
for(WorkerGroup group : workerGroupList){
|
||||
if(group.getId() != workerGroup.getId()){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* query worker group paging
|
||||
* @param pageNo
|
||||
* @param pageSize
|
||||
* @param searchVal
|
||||
* @return
|
||||
*/
|
||||
public Map<String,Object> queryAllGroupPaging(Integer pageNo, Integer pageSize, String searchVal) {
|
||||
|
||||
Map<String, Object> result = new HashMap<>(5);
|
||||
int count = workerGroupMapper.countPaging(searchVal);
|
||||
|
||||
|
||||
PageInfo<WorkerGroup> pageInfo = new PageInfo<>(pageNo, pageSize);
|
||||
List<WorkerGroup> workerGroupList = workerGroupMapper.queryListPaging(pageInfo.getStart(), pageSize, searchVal);
|
||||
pageInfo.setTotalCount(count);
|
||||
pageInfo.setLists(workerGroupList);
|
||||
result.put(Constants.DATA_LIST, pageInfo);
|
||||
putMsg(result, Status.SUCCESS);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* delete worker group by id
|
||||
* @param id
|
||||
* @return
|
||||
*/
|
||||
public Map<String,Object> deleteWorkerGroupById(Integer id) {
|
||||
|
||||
Map<String, Object> result = new HashMap<>(5);
|
||||
|
||||
int delete = workerGroupMapper.deleteById(id);
|
||||
putMsg(result, Status.SUCCESS);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* query all worker group
|
||||
* @return
|
||||
*/
|
||||
public Map<String,Object> queryAllGroup() {
|
||||
Map<String, Object> result = new HashMap<>(5);
|
||||
List<WorkerGroup> workerGroupList = workerGroupMapper.queryAllWorkerGroup();
|
||||
result.put(Constants.DATA_LIST, workerGroupList);
|
||||
putMsg(result, Status.SUCCESS);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,211 @@
|
|||
package cn.escheduler.api.utils;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.zookeeper.client.FourLetterWordMain;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Scanner;
|
||||
|
||||
/**
|
||||
* zookeeper状态监控:4字口诀
|
||||
*
|
||||
*/
|
||||
public class ZooKeeperState {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(ZooKeeperState.class);
|
||||
|
||||
private final String host;
|
||||
private final int port;
|
||||
|
||||
private int minLatency = -1, avgLatency = -1, maxLatency = -1;
|
||||
private long received = -1;
|
||||
private long sent = -1;
|
||||
private int outStanding = -1;
|
||||
private long zxid = -1;
|
||||
private String mode = null;
|
||||
private int nodeCount = -1;
|
||||
private int watches = -1;
|
||||
private int connections = -1;
|
||||
|
||||
public ZooKeeperState(String connectionString) {
|
||||
String host = connectionString.substring(0,
|
||||
connectionString.indexOf(':'));
|
||||
int port = Integer.parseInt(connectionString.substring(connectionString
|
||||
.indexOf(':') + 1));
|
||||
this.host = host;
|
||||
this.port = port;
|
||||
}
|
||||
|
||||
public void getZookeeperInfo() {
|
||||
String content = cmd("srvr");
|
||||
if (StringUtils.isNotBlank(content)) {
|
||||
Scanner scannerForStat = new Scanner(content);
|
||||
while (scannerForStat.hasNext()) {
|
||||
String line = scannerForStat.nextLine();
|
||||
if (line.startsWith("Latency min/avg/max:")) {
|
||||
String[] latencys = getStringValueFromLine(line).split("/");
|
||||
minLatency = Integer.parseInt(latencys[0]);
|
||||
avgLatency = Integer.parseInt(latencys[1]);
|
||||
maxLatency = Integer.parseInt(latencys[2]);
|
||||
} else if (line.startsWith("Received:")) {
|
||||
received = Long.parseLong(getStringValueFromLine(line));
|
||||
} else if (line.startsWith("Sent:")) {
|
||||
sent = Long.parseLong(getStringValueFromLine(line));
|
||||
} else if (line.startsWith("Outstanding:")) {
|
||||
outStanding = Integer.parseInt(getStringValueFromLine(line));
|
||||
} else if (line.startsWith("Zxid:")) {
|
||||
zxid = Long.parseLong(getStringValueFromLine(line).substring(2), 16);
|
||||
} else if (line.startsWith("Mode:")) {
|
||||
mode = getStringValueFromLine(line);
|
||||
} else if (line.startsWith("Node count:")) {
|
||||
nodeCount = Integer.parseInt(getStringValueFromLine(line));
|
||||
}
|
||||
}
|
||||
scannerForStat.close();
|
||||
}
|
||||
|
||||
String wchsText = cmd("wchs");
|
||||
if (StringUtils.isNotBlank(wchsText)) {
|
||||
Scanner scannerForWchs = new Scanner(wchsText);
|
||||
while (scannerForWchs.hasNext()) {
|
||||
String line = scannerForWchs.nextLine();
|
||||
if (line.startsWith("Total watches:")) {
|
||||
watches = Integer.parseInt(getStringValueFromLine(line));
|
||||
}
|
||||
}
|
||||
scannerForWchs.close();
|
||||
}
|
||||
|
||||
String consText = cmd("cons");
|
||||
if (StringUtils.isNotBlank(consText)) {
|
||||
Scanner scannerForCons = new Scanner(consText);
|
||||
if (StringUtils.isNotBlank(consText)) {
|
||||
connections = 0;
|
||||
}
|
||||
while (scannerForCons.hasNext()) {
|
||||
@SuppressWarnings("unused")
|
||||
String line = scannerForCons.nextLine();
|
||||
++connections;
|
||||
}
|
||||
scannerForCons.close();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public boolean ruok() {
|
||||
return "imok\n".equals(cmd("ruok"));
|
||||
}
|
||||
|
||||
|
||||
private String getStringValueFromLine(String line) {
|
||||
return line.substring(line.indexOf(":") + 1, line.length()).replaceAll(
|
||||
" ", "").trim();
|
||||
}
|
||||
|
||||
private class SendThread extends Thread {
|
||||
private String cmd;
|
||||
|
||||
public String ret = "";
|
||||
|
||||
public SendThread(String cmd) {
|
||||
this.cmd = cmd;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
ret = FourLetterWordMain.send4LetterWord(host, port, cmd);
|
||||
} catch (IOException e) {
|
||||
logger.error(e.getMessage(),e);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private String cmd(String cmd) {
|
||||
final int waitTimeout = 5;
|
||||
SendThread sendThread = new SendThread(cmd);
|
||||
sendThread.setName("FourLetterCmd:" + cmd);
|
||||
sendThread.start();
|
||||
try {
|
||||
sendThread.join(waitTimeout * 1000);
|
||||
return sendThread.ret;
|
||||
} catch (InterruptedException e) {
|
||||
logger.error("send " + cmd + " to server " + host + ":" + port + " failed!", e);
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
public Logger getLogger() {
|
||||
return logger;
|
||||
}
|
||||
|
||||
public String getHost() {
|
||||
return host;
|
||||
}
|
||||
|
||||
public int getPort() {
|
||||
return port;
|
||||
}
|
||||
|
||||
public int getMinLatency() {
|
||||
return minLatency;
|
||||
}
|
||||
|
||||
public int getAvgLatency() {
|
||||
return avgLatency;
|
||||
}
|
||||
|
||||
public int getMaxLatency() {
|
||||
return maxLatency;
|
||||
}
|
||||
|
||||
public long getReceived() {
|
||||
return received;
|
||||
}
|
||||
|
||||
public long getSent() {
|
||||
return sent;
|
||||
}
|
||||
|
||||
public int getOutStanding() {
|
||||
return outStanding;
|
||||
}
|
||||
|
||||
public long getZxid() {
|
||||
return zxid;
|
||||
}
|
||||
|
||||
public String getMode() {
|
||||
return mode;
|
||||
}
|
||||
|
||||
public int getNodeCount() {
|
||||
return nodeCount;
|
||||
}
|
||||
|
||||
public int getWatches() {
|
||||
return watches;
|
||||
}
|
||||
|
||||
public int getConnections() {
|
||||
return connections;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "ZooKeeperState [host=" + host + ", port=" + port
|
||||
+ ", minLatency=" + minLatency + ", avgLatency=" + avgLatency
|
||||
+ ", maxLatency=" + maxLatency + ", received=" + received
|
||||
+ ", sent=" + sent + ", outStanding=" + outStanding + ", zxid="
|
||||
+ zxid + ", mode=" + mode + ", nodeCount=" + nodeCount
|
||||
+ ", watches=" + watches + ", connections="
|
||||
+ connections + "]";
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,72 @@
|
|||
package cn.escheduler.api.utils;
|
||||
|
||||
import cn.escheduler.common.zk.AbstractZKClient;
|
||||
import cn.escheduler.dao.model.ZookeeperRecord;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
|
||||
/**
|
||||
* monitor zookeeper info
|
||||
*/
|
||||
public class ZookeeperMonitorUtils {
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(ZookeeperMonitorUtils.class);
|
||||
private static final String zookeeperList = AbstractZKClient.getZookeeperQuorum();
|
||||
|
||||
/**
|
||||
*
|
||||
* @return zookeeper info list
|
||||
*/
|
||||
public static List<ZookeeperRecord> zookeeperInfoList(){
|
||||
String zookeeperServers = zookeeperList.replaceAll("[\\t\\n\\x0B\\f\\r]", "");
|
||||
try{
|
||||
return zookeeperInfoList(zookeeperServers);
|
||||
}catch(Exception e){
|
||||
LOG.error(e.getMessage(),e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
private static List<ZookeeperRecord> zookeeperInfoList(String zookeeperServers) {
|
||||
|
||||
List<ZookeeperRecord> list = new ArrayList<>(5);
|
||||
|
||||
if(StringUtils.isNotBlank(zookeeperServers)){
|
||||
String[] zookeeperServersArray = zookeeperServers.split(",");
|
||||
|
||||
for (String zookeeperServer : zookeeperServersArray) {
|
||||
ZooKeeperState state = new ZooKeeperState(zookeeperServer);
|
||||
boolean ok = state.ruok();
|
||||
if(ok){
|
||||
state.getZookeeperInfo();
|
||||
}
|
||||
|
||||
String hostName = zookeeperServer;
|
||||
int connections = state.getConnections();
|
||||
int watches = state.getWatches();
|
||||
long sent = state.getSent();
|
||||
long received = state.getReceived();
|
||||
String mode = state.getMode();
|
||||
int minLatency = state.getMinLatency();
|
||||
int avgLatency = state.getAvgLatency();
|
||||
int maxLatency = state.getMaxLatency();
|
||||
int nodeCount = state.getNodeCount();
|
||||
int status = ok ? 1 : 0;
|
||||
Date date = new Date();
|
||||
|
||||
ZookeeperRecord zookeeperRecord = new ZookeeperRecord(hostName,connections,watches,sent,received,mode,minLatency,avgLatency,maxLatency,nodeCount,status,date);
|
||||
list.add(zookeeperRecord);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,160 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package cn.escheduler.api;
|
||||
|
||||
import java.io.File;
|
||||
import java.net.URI;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import cn.escheduler.common.utils.EncryptionUtils;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.apache.http.NameValuePair;
|
||||
import org.apache.http.client.entity.UrlEncodedFormEntity;
|
||||
import org.apache.http.client.methods.CloseableHttpResponse;
|
||||
import org.apache.http.client.methods.HttpGet;
|
||||
import org.apache.http.client.methods.HttpPost;
|
||||
import org.apache.http.client.utils.URIBuilder;
|
||||
import org.apache.http.impl.client.CloseableHttpClient;
|
||||
import org.apache.http.impl.client.HttpClients;
|
||||
import org.apache.http.message.BasicNameValuePair;
|
||||
import org.apache.http.util.EntityUtils;
|
||||
import org.junit.Test;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
public class HttpClientTest {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(HttpClientTest.class);
|
||||
|
||||
@Test
|
||||
public void doPOSTParam()throws Exception{
|
||||
// create HttpClient
|
||||
CloseableHttpClient httpclient = HttpClients.createDefault();
|
||||
|
||||
// create http post request
|
||||
HttpPost httpPost = new HttpPost("http://127.0.0.1:12345/escheduler/projects/create");
|
||||
httpPost.setHeader("token", "123");
|
||||
// set parameters
|
||||
List<NameValuePair> parameters = new ArrayList<NameValuePair>();
|
||||
parameters.add(new BasicNameValuePair("projectName", "qzw"));
|
||||
parameters.add(new BasicNameValuePair("desc", "qzw"));
|
||||
|
||||
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(parameters);
|
||||
httpPost.setEntity(formEntity);
|
||||
|
||||
|
||||
CloseableHttpResponse response = null;
|
||||
try {
|
||||
// execute
|
||||
response = httpclient.execute(httpPost);
|
||||
// eponse status code 200
|
||||
if (response.getStatusLine().getStatusCode() == 200) {
|
||||
String content = EntityUtils.toString(response.getEntity(), "UTF-8");
|
||||
System.out.println(content);
|
||||
}
|
||||
} finally {
|
||||
if (response != null) {
|
||||
response.close();
|
||||
}
|
||||
httpclient.close();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* do get param path variables chinese
|
||||
* @throws Exception
|
||||
*/
|
||||
@Test
|
||||
public void doGETParamPathVariableAndChinese()throws Exception{
|
||||
// create HttpClient
|
||||
CloseableHttpClient httpclient = HttpClients.createDefault();
|
||||
|
||||
List<NameValuePair> parameters = new ArrayList<NameValuePair>();
|
||||
// parameters.add(new BasicNameValuePair("pageSize", "10"));
|
||||
|
||||
// define the parameters of the request
|
||||
URI uri = new URIBuilder("http://192.168.220.247:12345/escheduler/projects/%E5%85%A8%E9%83%A8%E6%B5%81%E7%A8%8B%E6%B5%8B%E8%AF%95/process/list")
|
||||
.build();
|
||||
|
||||
// create http GET request
|
||||
HttpGet httpGet = new HttpGet(uri);
|
||||
httpGet.setHeader("token","10f5625a2a1cbf9aa710653796c5d764");
|
||||
//response object
|
||||
CloseableHttpResponse response = null;
|
||||
try {
|
||||
// execute http get request
|
||||
response = httpclient.execute(httpGet);
|
||||
// reponse status code 200
|
||||
if (response.getStatusLine().getStatusCode() == 200) {
|
||||
String content = EntityUtils.toString(response.getEntity(), "UTF-8");
|
||||
logger.info("start--------------->");
|
||||
logger.info(content);
|
||||
logger.info("end----------------->");
|
||||
}
|
||||
} finally {
|
||||
if (response != null) {
|
||||
response.close();
|
||||
}
|
||||
httpclient.close();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* do get param
|
||||
* @throws Exception
|
||||
*/
|
||||
@Test
|
||||
public void doGETParam()throws Exception{
|
||||
// create HttpClient
|
||||
CloseableHttpClient httpclient = HttpClients.createDefault();
|
||||
|
||||
List<NameValuePair> parameters = new ArrayList<NameValuePair>();
|
||||
parameters.add(new BasicNameValuePair("startDate", "2018-04-22 19:30:08"));
|
||||
parameters.add(new BasicNameValuePair("endDate", "2028-04-22 19:30:08"));
|
||||
parameters.add(new BasicNameValuePair("projectId", "0"));
|
||||
|
||||
// define the parameters of the request
|
||||
URI uri = new URIBuilder("http://192.168.220.247:12345/escheduler/projects/analysis/queue-count")
|
||||
.setParameters(parameters)
|
||||
.build();
|
||||
|
||||
// create http GET request
|
||||
HttpGet httpGet = new HttpGet(uri);
|
||||
httpGet.setHeader("token","2aef24c052c212fab9eec78848c2258b");
|
||||
//response object
|
||||
CloseableHttpResponse response = null;
|
||||
try {
|
||||
// execute http get request
|
||||
response = httpclient.execute(httpGet);
|
||||
// reponse status code 200
|
||||
if (response.getStatusLine().getStatusCode() == 200) {
|
||||
String content = EntityUtils.toString(response.getEntity(), "UTF-8");
|
||||
logger.info("start--------------->");
|
||||
logger.info(content);
|
||||
logger.info("end----------------->");
|
||||
}
|
||||
} finally {
|
||||
if (response != null) {
|
||||
response.close();
|
||||
}
|
||||
httpclient.close();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -32,8 +32,11 @@ import org.springframework.test.context.junit4.SpringRunner;
|
|||
import org.springframework.test.web.servlet.MockMvc;
|
||||
import org.springframework.test.web.servlet.MvcResult;
|
||||
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
|
||||
import org.springframework.util.LinkedMultiValueMap;
|
||||
import org.springframework.util.MultiValueMap;
|
||||
import org.springframework.web.context.WebApplicationContext;
|
||||
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
||||
|
|
@ -66,4 +69,21 @@ public class ExecutorControllerTest {
|
|||
Assert.assertEquals(Status.SUCCESS.getCode(),result.getCode().intValue());
|
||||
logger.info(mvcResult.getResponse().getContentAsString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getReceiverCc() throws Exception {
|
||||
MultiValueMap<String, String> paramsMap = new LinkedMultiValueMap<>();
|
||||
//paramsMap.add("processDefinitionId","4");
|
||||
paramsMap.add("processInstanceId","13");
|
||||
//paramsMap.add("processInstanceId","13");
|
||||
MvcResult mvcResult = mockMvc.perform(get("/projects/{projectName}/executors/get-receiver-cc","li_sql_test")
|
||||
.header("sessionId", "e79b3353-e227-4680-88c0-544194e64025")
|
||||
.params(paramsMap))
|
||||
.andExpect(status().isOk())
|
||||
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
|
||||
.andReturn();
|
||||
Result result = JSONUtils.parseObject(mvcResult.getResponse().getContentAsString(), Result.class);
|
||||
Assert.assertEquals(Status.SUCCESS.getCode(),result.getCode().intValue());
|
||||
logger.info(mvcResult.getResponse().getContentAsString());
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,105 @@
|
|||
package cn.escheduler.api.controller;
|
||||
|
||||
import cn.escheduler.api.enums.Status;
|
||||
import cn.escheduler.api.utils.Result;
|
||||
import cn.escheduler.common.enums.ResourceType;
|
||||
import cn.escheduler.common.utils.JSONUtils;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
import org.springframework.test.web.servlet.MockMvc;
|
||||
import org.springframework.test.web.servlet.MvcResult;
|
||||
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
|
||||
import org.springframework.web.context.WebApplicationContext;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
||||
|
||||
@RunWith(SpringRunner.class)
|
||||
@SpringBootTest
|
||||
public class MonitorControllerTest {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(MonitorControllerTest.class);
|
||||
public static final String SESSION_ID = "sessionId";
|
||||
public static String SESSION_ID_VALUE;
|
||||
|
||||
private MockMvc mockMvc;
|
||||
|
||||
@Autowired
|
||||
private WebApplicationContext webApplicationContext;
|
||||
|
||||
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
|
||||
SESSION_ID_VALUE = "bad76fc4-2eb4-4aae-b32b-d650e4beb6af";
|
||||
}
|
||||
|
||||
@Test
|
||||
public void listMaster() throws Exception {
|
||||
|
||||
MvcResult mvcResult = mockMvc.perform(get("/monitor/master/list")
|
||||
.header(SESSION_ID, SESSION_ID_VALUE)
|
||||
/* .param("type", ResourceType.FILE.name())*/ )
|
||||
.andExpect(status().isOk())
|
||||
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
|
||||
.andReturn();
|
||||
|
||||
Result result = JSONUtils.parseObject(mvcResult.getResponse().getContentAsString(), Result.class);
|
||||
result.getCode().equals(Status.SUCCESS.getCode());
|
||||
|
||||
|
||||
JSONObject object = (JSONObject) JSONObject.parse(mvcResult.getResponse().getContentAsString());
|
||||
|
||||
Assert.assertEquals(Status.SUCCESS.getCode(),result.getCode().intValue());
|
||||
logger.info(mvcResult.getResponse().getContentAsString());
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void queryDatabaseState() throws Exception {
|
||||
MvcResult mvcResult = mockMvc.perform(get("/monitor/database")
|
||||
.header(SESSION_ID, SESSION_ID_VALUE)
|
||||
/* .param("type", ResourceType.FILE.name())*/ )
|
||||
.andExpect(status().isOk())
|
||||
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
|
||||
.andReturn();
|
||||
|
||||
Result result = JSONUtils.parseObject(mvcResult.getResponse().getContentAsString(), Result.class);
|
||||
result.getCode().equals(Status.SUCCESS.getCode());
|
||||
|
||||
|
||||
Assert.assertEquals(Status.SUCCESS.getCode(),result.getCode().intValue());
|
||||
logger.info(mvcResult.getResponse().getContentAsString());
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void queryZookeeperState() throws Exception {
|
||||
MvcResult mvcResult = mockMvc.perform(get("/monitor/zookeeper/list")
|
||||
.header(SESSION_ID, SESSION_ID_VALUE)
|
||||
/* .param("type", ResourceType.FILE.name())*/ )
|
||||
.andExpect(status().isOk())
|
||||
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
|
||||
.andReturn();
|
||||
|
||||
Result result = JSONUtils.parseObject(mvcResult.getResponse().getContentAsString(), Result.class);
|
||||
result.getCode().equals(Status.SUCCESS.getCode());
|
||||
|
||||
|
||||
|
||||
Assert.assertEquals(Status.SUCCESS.getCode(),result.getCode().intValue());
|
||||
logger.info(mvcResult.getResponse().getContentAsString());
|
||||
}
|
||||
}
|
||||
|
|
@ -4,7 +4,7 @@
|
|||
<parent>
|
||||
<artifactId>escheduler</artifactId>
|
||||
<groupId>cn.analysys</groupId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
<version>1.0.2-SNAPSHOT</version>
|
||||
</parent>
|
||||
<artifactId>escheduler-common</artifactId>
|
||||
<name>escheduler-common</name>
|
||||
|
|
|
|||
|
|
@ -70,25 +70,6 @@ public final class Constants {
|
|||
*/
|
||||
public static final String YARN_APPLICATION_STATUS_ADDRESS = "yarn.application.status.address";
|
||||
|
||||
/**
|
||||
* spring.redis.maxIdle
|
||||
*/
|
||||
public static final String SPRING_REDIS_MAXIDLE = "spring.redis.maxIdle";
|
||||
|
||||
/**
|
||||
* spring.redis.maxTotal
|
||||
*/
|
||||
public static final String SPRING_REDIS_MAXTOTAL = "spring.redis.maxTotal";
|
||||
|
||||
/**
|
||||
* spring.redis.host
|
||||
*/
|
||||
public static final String SPRING_REDIS_HOST = "spring.redis.host";
|
||||
|
||||
/**
|
||||
* spring.redis.port
|
||||
*/
|
||||
public static final String SPRING_REDIS_PORT = "spring.redis.port";
|
||||
|
||||
/**
|
||||
* hdfs configuration
|
||||
|
|
@ -117,9 +98,14 @@ public final class Constants {
|
|||
public static final String ESCHEDULER_ENV_PATH = "escheduler.env.path";
|
||||
|
||||
/**
|
||||
* escheduler.env.py
|
||||
* escheduler.env.sh
|
||||
*/
|
||||
public static final String ESCHEDULER_ENV_PY = "escheduler.env.py";
|
||||
public static final String ESCHEDULER_ENV_SH = ".escheduler_env.sh";
|
||||
|
||||
/**
|
||||
* python home
|
||||
*/
|
||||
public static final String PYTHON_HOME="PYTHON_HOME";
|
||||
|
||||
/**
|
||||
* resource.view.suffixs
|
||||
|
|
@ -255,8 +241,6 @@ public final class Constants {
|
|||
|
||||
public static final String SCHEDULER_QUEUE_IMPL = "escheduler.queue.impl";
|
||||
|
||||
public static final String SCHEDULER_QUEUE_REDIS_IMPL = "redis";
|
||||
|
||||
|
||||
/**
|
||||
* date format of yyyy-MM-dd HH:mm:ss
|
||||
|
|
@ -347,6 +331,11 @@ public final class Constants {
|
|||
*/
|
||||
public static final int MAX_TASK_TIMEOUT = 24 * 3600;
|
||||
|
||||
/**
|
||||
* max task timeout
|
||||
*/
|
||||
public static final int MAX_PROCESS_TIMEOUT = Integer.MAX_VALUE;
|
||||
|
||||
|
||||
/**
|
||||
* heartbeat threads number
|
||||
|
|
@ -453,7 +442,7 @@ public final class Constants {
|
|||
/**
|
||||
* task record configuration path
|
||||
*/
|
||||
public static final String TASK_RECORD_PROPERTIES_PATH = "dao/data_source.properties";
|
||||
public static final String DATA_SOURCE_PROPERTIES = "dao/data_source.properties";
|
||||
|
||||
public static final String TASK_RECORD_URL = "task.record.datasource.url";
|
||||
|
||||
|
|
@ -463,6 +452,10 @@ public final class Constants {
|
|||
|
||||
public static final String TASK_RECORD_PWD = "task.record.datasource.password";
|
||||
|
||||
public static String TASK_RECORD_TABLE_HIVE_LOG = "eamp_hive_log_hd";
|
||||
|
||||
public static String TASK_RECORD_TABLE_HISTORY_HIVE_LOG = "eamp_hive_hist_log_hd";
|
||||
|
||||
public static final String STATUS = "status";
|
||||
|
||||
|
||||
|
|
@ -826,4 +819,9 @@ public final class Constants {
|
|||
public static final String CONTENT = "content";
|
||||
public static final String DEPENDENT_SPLIT = ":||";
|
||||
public static final String DEPENDENT_ALL = "ALL";
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
}
|
||||
|
|
|
|||
|
|
@ -113,6 +113,12 @@ public class TaskNode {
|
|||
*/
|
||||
private Priority taskInstancePriority;
|
||||
|
||||
/**
|
||||
* worker group id
|
||||
*/
|
||||
private int workerGroupId;
|
||||
|
||||
|
||||
/**
|
||||
* task time out
|
||||
*/
|
||||
|
|
@ -224,6 +230,7 @@ public class TaskNode {
|
|||
Objects.equals(extras, taskNode.extras) &&
|
||||
Objects.equals(runFlag, taskNode.runFlag) &&
|
||||
Objects.equals(dependence, taskNode.dependence) &&
|
||||
Objects.equals(workerGroupId, taskNode.workerGroupId) &&
|
||||
CollectionUtils.equalLists(depList, taskNode.depList);
|
||||
}
|
||||
|
||||
|
|
@ -303,6 +310,15 @@ public class TaskNode {
|
|||
", dependence='" + dependence + '\'' +
|
||||
", taskInstancePriority=" + taskInstancePriority +
|
||||
", timeout='" + timeout + '\'' +
|
||||
", workerGroupId='" + workerGroupId + '\'' +
|
||||
'}';
|
||||
}
|
||||
|
||||
public int getWorkerGroupId() {
|
||||
return workerGroupId;
|
||||
}
|
||||
|
||||
public void setWorkerGroupId(int workerGroupId) {
|
||||
this.workerGroupId = workerGroupId;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -54,10 +54,17 @@ public interface ITaskQueue {
|
|||
* an element pops out of the queue
|
||||
*
|
||||
* @param key queue name
|
||||
* @param remove where remove the element
|
||||
* @return
|
||||
*/
|
||||
String poll(String key);
|
||||
String poll(String key, boolean remove);
|
||||
|
||||
/**
|
||||
* remove a element from queue
|
||||
* @param key
|
||||
* @param value
|
||||
*/
|
||||
void removeNode(String key, String value);
|
||||
|
||||
/**
|
||||
* add an element to the set
|
||||
|
|
|
|||
|
|
@ -137,10 +137,11 @@ public class TaskQueueZkImpl extends AbstractZKClient implements ITaskQueue {
|
|||
*
|
||||
* 流程实例优先级_流程实例id_任务优先级_任务id high <- low
|
||||
* @param key task queue name
|
||||
* @param remove whether remove the element
|
||||
* @return the task id to be executed
|
||||
*/
|
||||
@Override
|
||||
public String poll(String key) {
|
||||
public String poll(String key, boolean remove) {
|
||||
try{
|
||||
CuratorFramework zk = getZkClient();
|
||||
String tasksQueuePath = getTasksPath(key) + Constants.SINGLE_SLASH;
|
||||
|
|
@ -181,18 +182,11 @@ public class TaskQueueZkImpl extends AbstractZKClient implements ITaskQueue {
|
|||
|
||||
String[] vals = targetTaskKey.split(Constants.UNDERLINE);
|
||||
|
||||
try{
|
||||
zk.delete().forPath(taskIdPath);
|
||||
|
||||
// String path = conf.getString(Constants.ZOOKEEPER_SCHEDULER_ROOT) + Constants.SINGLE_SLASH + Constants.SCHEDULER_TASKS_QUEUE + "_remove" + Constants.SINGLE_SLASH + targetTaskKey;
|
||||
// getZkClient().create().creatingParentContainersIfNeeded().withMode(CreateMode.PERSISTENT).forPath(path,
|
||||
// Bytes.toBytes(targetTaskKey));
|
||||
}catch(Exception e){
|
||||
logger.error(String.format("delete task:%s from zookeeper fail, task detail: %s exception" ,targetTaskKey, vals[vals.length - 1]) ,e);
|
||||
if(remove){
|
||||
removeNode(key, targetTaskKey);
|
||||
}
|
||||
logger.info("consume task: {},there still have {} tasks need to be executed", targetTaskKey, size - 1);
|
||||
|
||||
return vals[vals.length - 1];
|
||||
logger.info("consume task: {},there still have {} tasks need to be executed", vals[vals.length - 1], size - 1);
|
||||
return targetTaskKey;
|
||||
}else{
|
||||
logger.error("should not go here, task queue poll error, please check!");
|
||||
}
|
||||
|
|
@ -204,6 +198,21 @@ public class TaskQueueZkImpl extends AbstractZKClient implements ITaskQueue {
|
|||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeNode(String key, String nodeValue){
|
||||
|
||||
CuratorFramework zk = getZkClient();
|
||||
String tasksQueuePath = getTasksPath(key) + Constants.SINGLE_SLASH;
|
||||
String taskIdPath = tasksQueuePath + nodeValue;
|
||||
logger.info("consume task {}", taskIdPath);
|
||||
try{
|
||||
zk.delete().forPath(taskIdPath);
|
||||
}catch(Exception e){
|
||||
logger.error(String.format("delete task:%s from zookeeper fail, exception:" ,nodeValue) ,e);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -73,6 +73,16 @@ public class SqlParameters extends AbstractParameters {
|
|||
*/
|
||||
private List<String> postStatements;
|
||||
|
||||
/**
|
||||
* receivers
|
||||
*/
|
||||
private String receivers;
|
||||
|
||||
/**
|
||||
* receivers cc
|
||||
*/
|
||||
private String receiversCc;
|
||||
|
||||
public String getType() {
|
||||
return type;
|
||||
}
|
||||
|
|
@ -129,6 +139,21 @@ public class SqlParameters extends AbstractParameters {
|
|||
this.connParams = connParams;
|
||||
}
|
||||
|
||||
public String getReceivers() {
|
||||
return receivers;
|
||||
}
|
||||
|
||||
public void setReceivers(String receivers) {
|
||||
this.receivers = receivers;
|
||||
}
|
||||
|
||||
public String getReceiversCc() {
|
||||
return receiversCc;
|
||||
}
|
||||
|
||||
public void setReceiversCc(String receiversCc) {
|
||||
this.receiversCc = receiversCc;
|
||||
}
|
||||
public List<String> getPreStatements() {
|
||||
return preStatements;
|
||||
}
|
||||
|
|
@ -165,6 +190,8 @@ public class SqlParameters extends AbstractParameters {
|
|||
", udfs='" + udfs + '\'' +
|
||||
", showType='" + showType + '\'' +
|
||||
", connParams='" + connParams + '\'' +
|
||||
", receivers='" + receivers + '\'' +
|
||||
", receiversCc='" + receiversCc + '\'' +
|
||||
", preStatements=" + preStatements +
|
||||
", postStatements=" + postStatements +
|
||||
'}';
|
||||
|
|
|
|||
|
|
@ -46,13 +46,6 @@ public class CommonUtils {
|
|||
return envPath;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return get the path of Python system environment variables
|
||||
*/
|
||||
public static String getPythonSystemEnvPath() {
|
||||
return getString(ESCHEDULER_ENV_PY);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return get queue implementation name
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -72,7 +72,7 @@ public class DateUtils {
|
|||
public static Date parse(String date,String format){
|
||||
try {
|
||||
return new SimpleDateFormat(format).parse(date);
|
||||
} catch (ParseException e) {
|
||||
} catch (Exception e) {
|
||||
logger.error("error while parse date:" + date, e);
|
||||
}
|
||||
return null;
|
||||
|
|
|
|||
|
|
@ -368,5 +368,61 @@ public class FileUtils {
|
|||
org.apache.commons.io.FileUtils.forceDelete(new File(filename));
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets all the parent subdirectories of the parentDir directory
|
||||
* @param parentDir
|
||||
* @return
|
||||
*/
|
||||
public static File[] getAllDir(String parentDir){
|
||||
if(parentDir == null || "".equals(parentDir)) {
|
||||
throw new RuntimeException("parentDir can not be empty");
|
||||
}
|
||||
|
||||
File file = new File(parentDir);
|
||||
if(!file.exists() || !file.isDirectory()) {
|
||||
throw new RuntimeException("parentDir not exist, or is not a directory:"+parentDir);
|
||||
}
|
||||
|
||||
File[] schemaDirs = file.listFiles(new FileFilter() {
|
||||
|
||||
@Override
|
||||
public boolean accept(File pathname) {
|
||||
if (pathname.isDirectory()) {
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return schemaDirs;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Content
|
||||
* @param inputStream
|
||||
* @return
|
||||
* @throws IOException
|
||||
*/
|
||||
public static String readFile2Str(InputStream inputStream) throws IOException{
|
||||
String all_content=null;
|
||||
try {
|
||||
all_content = new String();
|
||||
InputStream ins = inputStream;
|
||||
ByteArrayOutputStream outputstream = new ByteArrayOutputStream();
|
||||
byte[] str_b = new byte[1024];
|
||||
int i = -1;
|
||||
while ((i=ins.read(str_b)) > 0) {
|
||||
outputstream.write(str_b,0,i);
|
||||
}
|
||||
all_content = outputstream.toString();
|
||||
return all_content;
|
||||
} catch (Exception e) {
|
||||
logger.error(e.getMessage(),e);
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,104 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package cn.escheduler.common.utils;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.sql.*;
|
||||
|
||||
public class MysqlUtil {
|
||||
|
||||
public static final Logger logger = LoggerFactory.getLogger(MysqlUtil.class);
|
||||
|
||||
private static MysqlUtil instance;
|
||||
|
||||
MysqlUtil() {
|
||||
}
|
||||
|
||||
public static MysqlUtil getInstance() {
|
||||
if (null == instance) {
|
||||
syncInit();
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
private static synchronized void syncInit() {
|
||||
if (instance == null) {
|
||||
instance = new MysqlUtil();
|
||||
}
|
||||
}
|
||||
|
||||
public void release(ResultSet rs, Statement stmt, Connection conn) {
|
||||
try {
|
||||
if (rs != null) {
|
||||
rs.close();
|
||||
rs = null;
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
logger.error(e.getMessage(),e);
|
||||
throw new RuntimeException(e);
|
||||
} finally {
|
||||
try {
|
||||
if (stmt != null) {
|
||||
stmt.close();
|
||||
stmt = null;
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
logger.error(e.getMessage(),e);
|
||||
throw new RuntimeException(e);
|
||||
} finally {
|
||||
try {
|
||||
if (conn != null) {
|
||||
conn.close();
|
||||
conn = null;
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
logger.error(e.getMessage(),e);
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void realeaseResource(ResultSet rs, PreparedStatement ps, Connection conn) {
|
||||
MysqlUtil.getInstance().release(rs,ps,conn);
|
||||
if (null != rs) {
|
||||
try {
|
||||
rs.close();
|
||||
} catch (SQLException e) {
|
||||
logger.error(e.getMessage(),e);
|
||||
}
|
||||
}
|
||||
|
||||
if (null != ps) {
|
||||
try {
|
||||
ps.close();
|
||||
} catch (SQLException e) {
|
||||
logger.error(e.getMessage(),e);
|
||||
}
|
||||
}
|
||||
|
||||
if (null != conn) {
|
||||
try {
|
||||
conn.close();
|
||||
} catch (SQLException e) {
|
||||
logger.error(e.getMessage(),e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,150 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package cn.escheduler.common.utils;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* Metadata related common classes
|
||||
*
|
||||
*/
|
||||
public class SchemaUtils {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(SchemaUtils.class);
|
||||
private static Pattern p = Pattern.compile("\\s*|\t|\r|\n");
|
||||
|
||||
/**
|
||||
* 获取所有upgrade目录下的可升级的schema
|
||||
* Gets upgradable schemas for all upgrade directories
|
||||
* @return
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public static List<String> getAllSchemaList() {
|
||||
List<String> schemaDirList = new ArrayList<>();
|
||||
File[] schemaDirArr = FileUtils.getAllDir("sql/upgrade");
|
||||
if(schemaDirArr == null || schemaDirArr.length == 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
for(File file : schemaDirArr) {
|
||||
schemaDirList.add(file.getName());
|
||||
}
|
||||
|
||||
Collections.sort(schemaDirList , new Comparator() {
|
||||
@Override
|
||||
public int compare(Object o1 , Object o2){
|
||||
try {
|
||||
String dir1 = String.valueOf(o1);
|
||||
String dir2 = String.valueOf(o2);
|
||||
String version1 = dir1.split("_")[0];
|
||||
String version2 = dir2.split("_")[0];
|
||||
if(version1.equals(version2)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(SchemaUtils.isAGreatVersion(version1, version2)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return -1;
|
||||
|
||||
} catch (Exception e) {
|
||||
logger.error(e.getMessage(),e);
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return schemaDirList;
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断schemaVersion是否比version版本高
|
||||
* Determine whether schemaVersion is higher than version
|
||||
* @param schemaVersion
|
||||
* @param version
|
||||
* @return
|
||||
*/
|
||||
public static boolean isAGreatVersion(String schemaVersion, String version) {
|
||||
if(StringUtils.isEmpty(schemaVersion) || StringUtils.isEmpty(version)) {
|
||||
throw new RuntimeException("schemaVersion or version is empty");
|
||||
}
|
||||
|
||||
String[] schemaVersionArr = schemaVersion.split("\\.");
|
||||
String[] versionArr = version.split("\\.");
|
||||
int arrLength = schemaVersionArr.length < versionArr.length ? schemaVersionArr.length : versionArr.length;
|
||||
for(int i = 0 ; i < arrLength ; i++) {
|
||||
if(Integer.valueOf(schemaVersionArr[i]) > Integer.valueOf(versionArr[i])) {
|
||||
return true;
|
||||
}else if(Integer.valueOf(schemaVersionArr[i]) < Integer.valueOf(versionArr[i])) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// 说明直到第arrLength-1个元素,两个版本号都一样,此时谁的arrLength大,谁的版本号就大
|
||||
// If the version and schema version is the same from 0 up to the arrlength-1 element,whoever has a larger arrLength has a larger version number
|
||||
return schemaVersionArr.length > versionArr.length;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the current software version number of the system
|
||||
* @return
|
||||
*/
|
||||
public static String getSoftVersion() {
|
||||
String soft_version;
|
||||
try {
|
||||
soft_version = FileUtils.readFile2Str(new FileInputStream(new File("sql/soft_version")));
|
||||
soft_version = replaceBlank(soft_version);
|
||||
} catch (FileNotFoundException e) {
|
||||
logger.error(e.getMessage(),e);
|
||||
throw new RuntimeException("Failed to get the product version description file. The file could not be found", e);
|
||||
} catch (IOException e) {
|
||||
logger.error(e.getMessage(),e);
|
||||
throw new RuntimeException("Failed to get product version number description file, failed to read the file", e);
|
||||
}
|
||||
return soft_version;
|
||||
}
|
||||
|
||||
/**
|
||||
* 去掉字符串中的空格回车换行和制表符
|
||||
* Strips the string of space carriage returns and tabs
|
||||
* @param str
|
||||
* @return
|
||||
*/
|
||||
public static String replaceBlank(String str) {
|
||||
String dest = "";
|
||||
if (str!=null) {
|
||||
|
||||
Matcher m = p.matcher(str);
|
||||
dest = m.replaceAll("");
|
||||
}
|
||||
return dest;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,317 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package cn.escheduler.common.utils;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.LineNumberReader;
|
||||
import java.io.Reader;
|
||||
import java.sql.*;
|
||||
|
||||
/*
|
||||
* Slightly modified version of the com.ibatis.common.jdbc.ScriptRunner class
|
||||
* from the iBATIS Apache project. Only removed dependency on Resource class
|
||||
* and a constructor
|
||||
*/
|
||||
/*
|
||||
* Copyright 2004 Clinton Begin
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Tool to run database scripts
|
||||
*/
|
||||
public class ScriptRunner {
|
||||
|
||||
public static final Logger logger = LoggerFactory.getLogger(ScriptRunner.class);
|
||||
|
||||
private static final String DEFAULT_DELIMITER = ";";
|
||||
|
||||
private Connection connection;
|
||||
|
||||
private boolean stopOnError;
|
||||
private boolean autoCommit;
|
||||
|
||||
private String delimiter = DEFAULT_DELIMITER;
|
||||
private boolean fullLineDelimiter = false;
|
||||
|
||||
/**
|
||||
* Default constructor
|
||||
*/
|
||||
public ScriptRunner(Connection connection, boolean autoCommit, boolean stopOnError) {
|
||||
this.connection = connection;
|
||||
this.autoCommit = autoCommit;
|
||||
this.stopOnError = stopOnError;
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
String dbName = "db_mmu";
|
||||
String appKey = dbName.substring(dbName.lastIndexOf("_")+1, dbName.length());
|
||||
System.out.println(appKey);
|
||||
}
|
||||
|
||||
public void setDelimiter(String delimiter, boolean fullLineDelimiter) {
|
||||
this.delimiter = delimiter;
|
||||
this.fullLineDelimiter = fullLineDelimiter;
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs an SQL script (read in using the Reader parameter)
|
||||
*
|
||||
* @param reader
|
||||
* - the source of the script
|
||||
*/
|
||||
public void runScript(Reader reader) throws IOException, SQLException {
|
||||
try {
|
||||
boolean originalAutoCommit = connection.getAutoCommit();
|
||||
try {
|
||||
if (originalAutoCommit != this.autoCommit) {
|
||||
connection.setAutoCommit(this.autoCommit);
|
||||
}
|
||||
runScript(connection, reader);
|
||||
} finally {
|
||||
connection.setAutoCommit(originalAutoCommit);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
throw e;
|
||||
} catch (SQLException e) {
|
||||
throw e;
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("Error running script. Cause: " + e, e);
|
||||
}
|
||||
}
|
||||
|
||||
public void runScript(Reader reader, String dbName) throws IOException, SQLException {
|
||||
try {
|
||||
boolean originalAutoCommit = connection.getAutoCommit();
|
||||
try {
|
||||
if (originalAutoCommit != this.autoCommit) {
|
||||
connection.setAutoCommit(this.autoCommit);
|
||||
}
|
||||
runScript(connection, reader, dbName);
|
||||
} finally {
|
||||
connection.setAutoCommit(originalAutoCommit);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
throw e;
|
||||
} catch (SQLException e) {
|
||||
throw e;
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("Error running script. Cause: " + e, e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs an SQL script (read in using the Reader parameter) using the connection
|
||||
* passed in
|
||||
*
|
||||
* @param conn
|
||||
* - the connection to use for the script
|
||||
* @param reader
|
||||
* - the source of the script
|
||||
* @throws SQLException
|
||||
* if any SQL errors occur
|
||||
* @throws IOException
|
||||
* if there is an error reading from the Reader
|
||||
*/
|
||||
private void runScript(Connection conn, Reader reader) throws IOException, SQLException {
|
||||
StringBuffer command = null;
|
||||
try {
|
||||
LineNumberReader lineReader = new LineNumberReader(reader);
|
||||
String line = null;
|
||||
while ((line = lineReader.readLine()) != null) {
|
||||
if (command == null) {
|
||||
command = new StringBuffer();
|
||||
}
|
||||
String trimmedLine = line.trim();
|
||||
if (trimmedLine.startsWith("--")) {
|
||||
logger.info(trimmedLine);
|
||||
} else if (trimmedLine.length() < 1 || trimmedLine.startsWith("//")) {
|
||||
// Do nothing
|
||||
} else if (trimmedLine.length() < 1 || trimmedLine.startsWith("--")) {
|
||||
// Do nothing
|
||||
|
||||
} else if (trimmedLine.startsWith("delimiter")) {
|
||||
String newDelimiter = trimmedLine.split(" ")[1];
|
||||
this.setDelimiter(newDelimiter, fullLineDelimiter);
|
||||
|
||||
} else if (!fullLineDelimiter && trimmedLine.endsWith(getDelimiter())
|
||||
|| fullLineDelimiter && trimmedLine.equals(getDelimiter())) {
|
||||
command.append(line.substring(0, line.lastIndexOf(getDelimiter())));
|
||||
command.append(" ");
|
||||
Statement statement = conn.createStatement();
|
||||
|
||||
// logger.info(command.toString());
|
||||
|
||||
boolean hasResults = false;
|
||||
logger.info("sql:"+command.toString());
|
||||
if (stopOnError) {
|
||||
hasResults = statement.execute(command.toString());
|
||||
} else {
|
||||
try {
|
||||
statement.execute(command.toString());
|
||||
} catch (SQLException e) {
|
||||
logger.error(e.getMessage(),e);
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
ResultSet rs = statement.getResultSet();
|
||||
if (hasResults && rs != null) {
|
||||
ResultSetMetaData md = rs.getMetaData();
|
||||
int cols = md.getColumnCount();
|
||||
for (int i = 0; i < cols; i++) {
|
||||
String name = md.getColumnLabel(i);
|
||||
logger.info(name + "\t");
|
||||
}
|
||||
logger.info("");
|
||||
while (rs.next()) {
|
||||
for (int i = 0; i < cols; i++) {
|
||||
String value = rs.getString(i);
|
||||
logger.info(value + "\t");
|
||||
}
|
||||
logger.info("");
|
||||
}
|
||||
}
|
||||
|
||||
command = null;
|
||||
try {
|
||||
statement.close();
|
||||
} catch (Exception e) {
|
||||
// Ignore to workaround a bug in Jakarta DBCP
|
||||
}
|
||||
Thread.yield();
|
||||
} else {
|
||||
command.append(line);
|
||||
command.append(" ");
|
||||
}
|
||||
}
|
||||
|
||||
} catch (SQLException e) {
|
||||
logger.error("Error executing: " + command.toString());
|
||||
throw e;
|
||||
} catch (IOException e) {
|
||||
e.fillInStackTrace();
|
||||
logger.error("Error executing: " + command.toString());
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
private void runScript(Connection conn, Reader reader , String dbName) throws IOException, SQLException {
|
||||
StringBuffer command = null;
|
||||
String sql = "";
|
||||
String appKey = dbName.substring(dbName.lastIndexOf("_")+1, dbName.length());
|
||||
try {
|
||||
LineNumberReader lineReader = new LineNumberReader(reader);
|
||||
String line = null;
|
||||
while ((line = lineReader.readLine()) != null) {
|
||||
if (command == null) {
|
||||
command = new StringBuffer();
|
||||
}
|
||||
String trimmedLine = line.trim();
|
||||
if (trimmedLine.startsWith("--")) {
|
||||
logger.info(trimmedLine);
|
||||
} else if (trimmedLine.length() < 1 || trimmedLine.startsWith("//")) {
|
||||
// Do nothing
|
||||
} else if (trimmedLine.length() < 1 || trimmedLine.startsWith("--")) {
|
||||
// Do nothing
|
||||
|
||||
} else if (trimmedLine.startsWith("delimiter")) {
|
||||
String newDelimiter = trimmedLine.split(" ")[1];
|
||||
this.setDelimiter(newDelimiter, fullLineDelimiter);
|
||||
|
||||
} else if (!fullLineDelimiter && trimmedLine.endsWith(getDelimiter())
|
||||
|| fullLineDelimiter && trimmedLine.equals(getDelimiter())) {
|
||||
command.append(line.substring(0, line.lastIndexOf(getDelimiter())));
|
||||
command.append(" ");
|
||||
Statement statement = conn.createStatement();
|
||||
|
||||
// logger.info(command.toString());
|
||||
|
||||
sql = command.toString().replaceAll("\\{\\{APPDB\\}\\}", dbName);
|
||||
boolean hasResults = false;
|
||||
logger.info("sql:"+sql);
|
||||
if (stopOnError) {
|
||||
hasResults = statement.execute(sql);
|
||||
} else {
|
||||
try {
|
||||
statement.execute(sql);
|
||||
} catch (SQLException e) {
|
||||
logger.error(e.getMessage(),e);
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
ResultSet rs = statement.getResultSet();
|
||||
if (hasResults && rs != null) {
|
||||
ResultSetMetaData md = rs.getMetaData();
|
||||
int cols = md.getColumnCount();
|
||||
for (int i = 0; i < cols; i++) {
|
||||
String name = md.getColumnLabel(i);
|
||||
logger.info(name + "\t");
|
||||
}
|
||||
logger.info("");
|
||||
while (rs.next()) {
|
||||
for (int i = 0; i < cols; i++) {
|
||||
String value = rs.getString(i);
|
||||
logger.info(value + "\t");
|
||||
}
|
||||
logger.info("");
|
||||
}
|
||||
}
|
||||
|
||||
command = null;
|
||||
try {
|
||||
statement.close();
|
||||
} catch (Exception e) {
|
||||
// Ignore to workaround a bug in Jakarta DBCP
|
||||
}
|
||||
Thread.yield();
|
||||
} else {
|
||||
command.append(line);
|
||||
command.append(" ");
|
||||
}
|
||||
}
|
||||
|
||||
} catch (SQLException e) {
|
||||
logger.error("Error executing: " + sql);
|
||||
throw e;
|
||||
} catch (IOException e) {
|
||||
e.fillInStackTrace();
|
||||
logger.error("Error executing: " + sql);
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
private String getDelimiter() {
|
||||
return delimiter;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -87,15 +87,6 @@ public abstract class AbstractZKClient {
|
|||
|
||||
|
||||
public AbstractZKClient() {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
String[] zookeeperParamslist = conf.getStringArray(Constants.ZOOKEEPER_QUORUM);
|
||||
for (String param : zookeeperParamslist) {
|
||||
sb.append(param).append(Constants.COMMA);
|
||||
}
|
||||
|
||||
if(sb.length() > 0){
|
||||
sb.deleteCharAt(sb.length() - 1);
|
||||
}
|
||||
|
||||
// retry strategy
|
||||
RetryPolicy retryPolicy = new ExponentialBackoffRetry(
|
||||
|
|
@ -105,7 +96,7 @@ public abstract class AbstractZKClient {
|
|||
try{
|
||||
// crate zookeeper client
|
||||
zkClient = CuratorFrameworkFactory.builder()
|
||||
.connectString(sb.toString())
|
||||
.connectString(getZookeeperQuorum())
|
||||
.retryPolicy(retryPolicy)
|
||||
.sessionTimeoutMs(1000 * Integer.parseInt(conf.getString(Constants.ZOOKEEPER_SESSION_TIMEOUT)))
|
||||
.connectionTimeoutMs(1000 * Integer.parseInt(conf.getString(Constants.ZOOKEEPER_CONNECTION_TIMEOUT)))
|
||||
|
|
@ -327,6 +318,24 @@ public abstract class AbstractZKClient {
|
|||
return childrenList.size();
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return zookeeper quorum
|
||||
*/
|
||||
public static String getZookeeperQuorum(){
|
||||
StringBuilder sb = new StringBuilder();
|
||||
String[] zookeeperParamslist = conf.getStringArray(Constants.ZOOKEEPER_QUORUM);
|
||||
for (String param : zookeeperParamslist) {
|
||||
sb.append(param).append(Constants.COMMA);
|
||||
}
|
||||
|
||||
if(sb.length() > 0){
|
||||
sb.deleteCharAt(sb.length() - 1);
|
||||
}
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "AbstractZKClient{" +
|
||||
|
|
|
|||
|
|
@ -18,7 +18,6 @@ hdfs.startup.state=true
|
|||
|
||||
# system env path. self configuration, please make sure the directory and file exists and have read write execute permissions
|
||||
escheduler.env.path=/opt/.escheduler_env.sh
|
||||
escheduler.env.py=/opt/escheduler_env.py
|
||||
|
||||
#resource.view.suffixs
|
||||
resource.view.suffixs=txt,log,sh,conf,cfg,py,java,sql,hql,xml
|
||||
|
|
|
|||
|
|
@ -49,9 +49,9 @@ public class TaskQueueImplTest {
|
|||
tasksQueue.add(Constants.SCHEDULER_TASKS_QUEUE,"4");
|
||||
|
||||
//pop
|
||||
String node1 = tasksQueue.poll(Constants.SCHEDULER_TASKS_QUEUE);
|
||||
String node1 = tasksQueue.poll(Constants.SCHEDULER_TASKS_QUEUE, false);
|
||||
assertEquals(node1,"1");
|
||||
String node2 = tasksQueue.poll(Constants.SCHEDULER_TASKS_QUEUE);
|
||||
String node2 = tasksQueue.poll(Constants.SCHEDULER_TASKS_QUEUE, false);
|
||||
assertEquals(node2,"2");
|
||||
|
||||
//sadd
|
||||
|
|
@ -99,7 +99,7 @@ public class TaskQueueImplTest {
|
|||
}
|
||||
}
|
||||
|
||||
String node1 = tasksQueue.poll(Constants.SCHEDULER_TASKS_QUEUE);
|
||||
String node1 = tasksQueue.poll(Constants.SCHEDULER_TASKS_QUEUE, false);
|
||||
assertEquals(node1,"0");
|
||||
|
||||
//clear all data
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
<parent>
|
||||
<groupId>cn.analysys</groupId>
|
||||
<artifactId>escheduler</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
<version>1.0.2-SNAPSHOT</version>
|
||||
</parent>
|
||||
<artifactId>escheduler-dao</artifactId>
|
||||
<name>escheduler-dao</name>
|
||||
|
|
|
|||
|
|
@ -23,6 +23,8 @@ import cn.escheduler.dao.datasource.ConnectionFactory;
|
|||
import cn.escheduler.dao.mapper.AlertMapper;
|
||||
import cn.escheduler.dao.mapper.UserAlertGroupMapper;
|
||||
import cn.escheduler.dao.model.Alert;
|
||||
import cn.escheduler.dao.model.ProcessDefinition;
|
||||
import cn.escheduler.dao.model.ProcessInstance;
|
||||
import cn.escheduler.dao.model.User;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
|
|
@ -83,8 +85,9 @@ public class AlertDao extends AbstractBaseDao {
|
|||
*/
|
||||
public void sendServerStopedAlert(int alertgroupId,String host,String serverType){
|
||||
Alert alert = new Alert();
|
||||
String content = String.format("[{'type':'%s','host':'%s','event':'服务挂掉','警告级别':'严重'}]",serverType,host);
|
||||
alert.setTitle("容错告警");
|
||||
String content = String.format("[{'type':'%s','host':'%s','event':'server down','warning level':'serious'}]",
|
||||
serverType, host);
|
||||
alert.setTitle("Fault tolerance warning");
|
||||
alert.setShowType(ShowType.TABLE);
|
||||
alert.setContent(content);
|
||||
alert.setAlertType(AlertType.EMAIL);
|
||||
|
|
@ -94,6 +97,34 @@ public class AlertDao extends AbstractBaseDao {
|
|||
alertMapper.insert(alert);
|
||||
}
|
||||
|
||||
/**
|
||||
* process time out alert
|
||||
* @param processInstance
|
||||
* @param processDefinition
|
||||
*/
|
||||
public void sendProcessTimeoutAlert(ProcessInstance processInstance, ProcessDefinition processDefinition){
|
||||
int alertgroupId = processInstance.getWarningGroupId();
|
||||
String receivers = processDefinition.getReceivers();
|
||||
String receiversCc = processDefinition.getReceiversCc();
|
||||
Alert alert = new Alert();
|
||||
String content = String.format("[{'id':'%d','name':'%s','event':'timeout','warnLevel':'middle'}]",
|
||||
processInstance.getId(), processInstance.getName());
|
||||
alert.setTitle("Process Timeout Warn");
|
||||
alert.setShowType(ShowType.TABLE);
|
||||
alert.setContent(content);
|
||||
alert.setAlertType(AlertType.EMAIL);
|
||||
alert.setAlertGroupId(alertgroupId);
|
||||
if (StringUtils.isNotEmpty(receivers)) {
|
||||
alert.setReceivers(receivers);
|
||||
}
|
||||
if (StringUtils.isNotEmpty(receiversCc)) {
|
||||
alert.setReceiversCc(receiversCc);
|
||||
}
|
||||
alert.setCreateTime(new Date());
|
||||
alert.setUpdateTime(new Date());
|
||||
alertMapper.insert(alert);
|
||||
}
|
||||
|
||||
/**
|
||||
* task timeout warn
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -0,0 +1,145 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package cn.escheduler.dao;
|
||||
|
||||
import cn.escheduler.common.Constants;
|
||||
import cn.escheduler.dao.model.MonitorRecord;
|
||||
import org.apache.commons.configuration.Configuration;
|
||||
import org.apache.commons.configuration.ConfigurationException;
|
||||
import org.apache.commons.configuration.PropertiesConfiguration;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.sql.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
|
||||
/**
|
||||
* database state dao
|
||||
*/
|
||||
public class MonitorDBDao {
|
||||
|
||||
private static Logger logger = LoggerFactory.getLogger(MonitorDBDao.class);
|
||||
public static final String VARIABLE_NAME = "variable_name";
|
||||
|
||||
/**
|
||||
* 加载配置文件
|
||||
*/
|
||||
private static Configuration conf;
|
||||
|
||||
static {
|
||||
try {
|
||||
conf = new PropertiesConfiguration(Constants.DATA_SOURCE_PROPERTIES);
|
||||
}catch (ConfigurationException e){
|
||||
logger.error("load configuration excetpion",e);
|
||||
System.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* create connection
|
||||
* @return
|
||||
*/
|
||||
private static Connection getConn() {
|
||||
String url = conf.getString(Constants.SPRING_DATASOURCE_URL);
|
||||
String username = conf.getString(Constants.SPRING_DATASOURCE_USERNAME);
|
||||
String password = conf.getString(Constants.SPRING_DATASOURCE_PASSWORD);
|
||||
Connection conn = null;
|
||||
try {
|
||||
//classloader,load driver
|
||||
Class.forName(Constants.JDBC_MYSQL_CLASS_NAME);
|
||||
conn = DriverManager.getConnection(url, username, password);
|
||||
} catch (ClassNotFoundException e) {
|
||||
logger.error("ClassNotFoundException ", e);
|
||||
} catch (SQLException e) {
|
||||
logger.error("SQLException ", e);
|
||||
}
|
||||
return conn;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* query database state
|
||||
* @return
|
||||
*/
|
||||
public static List<MonitorRecord> queryDatabaseState() {
|
||||
List<MonitorRecord> list = new ArrayList<>(1);
|
||||
|
||||
Connection conn = null;
|
||||
long maxConnections = 0;
|
||||
long maxUsedConnections = 0;
|
||||
long threadsConnections = 0;
|
||||
long threadsRunningConnections = 0;
|
||||
//mysql running state
|
||||
int state = 1;
|
||||
|
||||
|
||||
MonitorRecord monitorRecord = new MonitorRecord();
|
||||
try {
|
||||
conn = getConn();
|
||||
if(conn == null){
|
||||
return list;
|
||||
}
|
||||
|
||||
Statement pstmt = conn.createStatement();
|
||||
|
||||
ResultSet rs1 = pstmt.executeQuery("show global variables");
|
||||
while(rs1.next()){
|
||||
if(rs1.getString(VARIABLE_NAME).toUpperCase().equals("MAX_CONNECTIONS")){
|
||||
maxConnections= Long.parseLong(rs1.getString("value"));
|
||||
}
|
||||
}
|
||||
|
||||
ResultSet rs2 = pstmt.executeQuery("show global status");
|
||||
while(rs2.next()){
|
||||
if(rs2.getString(VARIABLE_NAME).toUpperCase().equals("MAX_USED_CONNECTIONS")){
|
||||
maxUsedConnections = Long.parseLong(rs2.getString("value"));
|
||||
}else if(rs2.getString(VARIABLE_NAME).toUpperCase().equals("THREADS_CONNECTED")){
|
||||
threadsConnections = Long.parseLong(rs2.getString("value"));
|
||||
}else if(rs2.getString(VARIABLE_NAME).toUpperCase().equals("THREADS_RUNNING")){
|
||||
threadsRunningConnections= Long.parseLong(rs2.getString("value"));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} catch (SQLException e) {
|
||||
logger.error("SQLException ", e);
|
||||
state = 0;
|
||||
}finally {
|
||||
try {
|
||||
if(conn != null){
|
||||
conn.close();
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
logger.error("SQLException ", e);
|
||||
}
|
||||
}
|
||||
|
||||
monitorRecord.setDate(new Date());
|
||||
monitorRecord.setMaxConnections(maxConnections);
|
||||
monitorRecord.setMaxUsedConnections(maxUsedConnections);
|
||||
monitorRecord.setThreadsConnections(threadsConnections);
|
||||
monitorRecord.setThreadsRunningConnections(threadsRunningConnections);
|
||||
monitorRecord.setState(state);
|
||||
|
||||
list.add(monitorRecord);
|
||||
|
||||
return list;
|
||||
}
|
||||
}
|
||||
|
|
@ -59,7 +59,7 @@ public class ProcessDao extends AbstractBaseDao {
|
|||
ExecutionStatus.READY_STOP.ordinal()};
|
||||
|
||||
@Autowired
|
||||
private ProjectMapper projectMapper;
|
||||
private UserMapper userMapper;
|
||||
|
||||
@Autowired
|
||||
private ProcessDefinitionMapper processDefineMapper;
|
||||
|
|
@ -88,6 +88,12 @@ public class ProcessDao extends AbstractBaseDao {
|
|||
@Autowired
|
||||
private ResourceMapper resourceMapper;
|
||||
|
||||
@Autowired
|
||||
private WorkerGroupMapper workerGroupMapper;
|
||||
|
||||
@Autowired
|
||||
private ErrorCommandMapper errorCommandMapper;
|
||||
|
||||
/**
|
||||
* task queue impl
|
||||
*/
|
||||
|
|
@ -102,7 +108,7 @@ public class ProcessDao extends AbstractBaseDao {
|
|||
*/
|
||||
@Override
|
||||
protected void init() {
|
||||
projectMapper = getMapper(ProjectMapper.class);
|
||||
userMapper=getMapper(UserMapper.class);
|
||||
processDefineMapper = getMapper(ProcessDefinitionMapper.class);
|
||||
processInstanceMapper = getMapper(ProcessInstanceMapper.class);
|
||||
dataSourceMapper = getMapper(DataSourceMapper.class);
|
||||
|
|
@ -112,6 +118,7 @@ public class ProcessDao extends AbstractBaseDao {
|
|||
scheduleMapper = getMapper(ScheduleMapper.class);
|
||||
udfFuncMapper = getMapper(UdfFuncMapper.class);
|
||||
resourceMapper = getMapper(ResourceMapper.class);
|
||||
workerGroupMapper = getMapper(WorkerGroupMapper.class);
|
||||
taskQueue = TaskQueueFactory.getTaskQueueInstance();
|
||||
}
|
||||
|
||||
|
|
@ -120,48 +127,72 @@ public class ProcessDao extends AbstractBaseDao {
|
|||
* find one command from command queue, construct process instance
|
||||
* @param logger
|
||||
* @param host
|
||||
* @param vaildThreadNum
|
||||
* @param validThreadNum
|
||||
* @return
|
||||
*/
|
||||
@Transactional(value = "TransactionManager",rollbackFor = Exception.class)
|
||||
public ProcessInstance scanCommand(Logger logger, String host, int vaildThreadNum){
|
||||
public ProcessInstance scanCommand(Logger logger, String host, int validThreadNum){
|
||||
|
||||
ProcessInstance processInstance = null;
|
||||
Command command = findOneCommand();
|
||||
|
||||
if (command == null) {
|
||||
return null;
|
||||
}
|
||||
logger.info(String.format("find one command: id: %d, type: %s", command.getId(),command.getCommandType().toString()));
|
||||
|
||||
processInstance = constructProcessInstance(command, host);
|
||||
|
||||
//cannot construct process instance, return null;
|
||||
if(processInstance == null){
|
||||
logger.error("scan command, command parameter is error: %s", command.toString());
|
||||
}else{
|
||||
// check thread number enough for this command, if not, change state to waiting thread.
|
||||
int commandThreadCount = this.workProcessThreadNumCount(command.getProcessDefinitionId());
|
||||
if(vaildThreadNum < commandThreadCount){
|
||||
logger.info("there is not enough thread for this command: {}",command.toString() );
|
||||
processInstance.setState(ExecutionStatus.WAITTING_THREAD);
|
||||
if(command.getCommandType() != CommandType.RECOVER_WAITTING_THREAD){
|
||||
processInstance.addHistoryCmd(command.getCommandType());
|
||||
}
|
||||
saveProcessInstance(processInstance);
|
||||
this.setSubProcessParam(processInstance);
|
||||
createRecoveryWaitingThreadCommand(command, processInstance);
|
||||
try{
|
||||
processInstance = constructProcessInstance(command, host);
|
||||
//cannot construct process instance, return null;
|
||||
if(processInstance == null){
|
||||
logger.error("scan command, command parameter is error: %s", command.toString());
|
||||
delCommandByid(command.getId());
|
||||
saveErrorCommand(command, "process instance is null");
|
||||
return null;
|
||||
}else if(!checkThreadNum(command, validThreadNum)){
|
||||
logger.info("there is not enough thread for this command: {}",command.toString() );
|
||||
return setWaitingThreadProcess(command, processInstance);
|
||||
}else{
|
||||
processInstance.setCommandType(command.getCommandType());
|
||||
processInstance.addHistoryCmd(command.getCommandType());
|
||||
saveProcessInstance(processInstance);
|
||||
this.setSubProcessParam(processInstance);
|
||||
processInstance.setCommandType(command.getCommandType());
|
||||
processInstance.addHistoryCmd(command.getCommandType());
|
||||
saveProcessInstance(processInstance);
|
||||
this.setSubProcessParam(processInstance);
|
||||
delCommandByid(command.getId());
|
||||
return processInstance;
|
||||
}
|
||||
}catch (Exception e){
|
||||
logger.error("scan command error ", e);
|
||||
saveErrorCommand(command, e.toString());
|
||||
delCommandByid(command.getId());
|
||||
}
|
||||
// delete command
|
||||
delCommandByid(command.getId());
|
||||
return processInstance;
|
||||
return null;
|
||||
}
|
||||
|
||||
private void saveErrorCommand(Command command, String message) {
|
||||
|
||||
ErrorCommand errorCommand = new ErrorCommand(command, message);
|
||||
this.errorCommandMapper.insert(errorCommand);
|
||||
}
|
||||
|
||||
/**
|
||||
* set process waiting thread
|
||||
* @param command
|
||||
* @param processInstance
|
||||
* @return
|
||||
*/
|
||||
private ProcessInstance setWaitingThreadProcess(Command command, ProcessInstance processInstance) {
|
||||
processInstance.setState(ExecutionStatus.WAITTING_THREAD);
|
||||
if(command.getCommandType() != CommandType.RECOVER_WAITTING_THREAD){
|
||||
processInstance.addHistoryCmd(command.getCommandType());
|
||||
}
|
||||
saveProcessInstance(processInstance);
|
||||
this.setSubProcessParam(processInstance);
|
||||
createRecoveryWaitingThreadCommand(command, processInstance);
|
||||
return null;
|
||||
}
|
||||
|
||||
private boolean checkThreadNum(Command command, int validThreadNum) {
|
||||
int commandThreadCount = this.workProcessThreadNumCount(command.getProcessDefinitionId());
|
||||
return validThreadNum >= commandThreadCount;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -245,7 +276,7 @@ public class ProcessDao extends AbstractBaseDao {
|
|||
public ProcessInstance findProcessInstanceByScheduleTime(int defineId, Date scheduleTime){
|
||||
|
||||
return processInstanceMapper.queryByScheduleTime(defineId,
|
||||
DateUtils.dateToString(scheduleTime), 0,null, null);
|
||||
DateUtils.dateToString(scheduleTime), 0, null, null);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -450,6 +481,8 @@ public class ProcessDao extends AbstractBaseDao {
|
|||
processInstance.setProcessInstanceJson(processDefinition.getProcessDefinitionJson());
|
||||
// set process instance priority
|
||||
processInstance.setProcessInstancePriority(command.getProcessInstancePriority());
|
||||
processInstance.setWorkerGroupId(command.getWorkerGroupId());
|
||||
processInstance.setTimeout(processDefinition.getTimeout());
|
||||
return processInstance;
|
||||
}
|
||||
|
||||
|
|
@ -669,7 +702,7 @@ public class ProcessDao extends AbstractBaseDao {
|
|||
paramMap.put(CMDPARAM_SUB_PROCESS, String.valueOf(processInstance.getId()));
|
||||
processInstance.setCommandParam(JSONUtils.toJson(paramMap));
|
||||
processInstance.setIsSubProcess(Flag.YES);
|
||||
this.updateProcessInstance(processInstance);
|
||||
this.saveProcessInstance(processInstance);
|
||||
}
|
||||
// copy parent instance user def params to sub process..
|
||||
String parentInstanceId = paramMap.get(CMDPARAM_SUB_PROCESS_PARENT_INSTANCE_ID);
|
||||
|
|
@ -677,7 +710,7 @@ public class ProcessDao extends AbstractBaseDao {
|
|||
ProcessInstance parentInstance = findProcessInstanceDetailById(Integer.parseInt(parentInstanceId));
|
||||
if(parentInstance != null){
|
||||
processInstance.setGlobalParams(parentInstance.getGlobalParams());
|
||||
this.updateProcessInstance(processInstance);
|
||||
this.saveProcessInstance(processInstance);
|
||||
}else{
|
||||
logger.error("sub process command params error, cannot find parent instance: {} ", cmdParam);
|
||||
}
|
||||
|
|
@ -1194,7 +1227,7 @@ public class ProcessDao extends AbstractBaseDao {
|
|||
public int updateProcessInstance(Integer processInstanceId, String processJson,
|
||||
String globalParams, Date scheduleTime, Flag flag,
|
||||
String locations, String connects){
|
||||
return processInstanceMapper.updateProcessInstance( processInstanceId, processJson,
|
||||
return processInstanceMapper.updateProcessInstance(processInstanceId, processJson,
|
||||
globalParams, scheduleTime, locations, connects, flag);
|
||||
}
|
||||
|
||||
|
|
@ -1538,4 +1571,25 @@ public class ProcessDao extends AbstractBaseDao {
|
|||
DateUtils.dateToString(dateInterval.getEndTime()),
|
||||
stateArray);
|
||||
}
|
||||
|
||||
/**
|
||||
* query user queue by process instance id
|
||||
* @param processInstanceId
|
||||
* @return
|
||||
*/
|
||||
public String queryQueueByProcessInstanceId(int processInstanceId){
|
||||
return userMapper.queryQueueByProcessInstanceId(processInstanceId);
|
||||
}
|
||||
|
||||
/**
|
||||
* query worker group by id
|
||||
* @param workerGroupId
|
||||
* @return
|
||||
*/
|
||||
public WorkerGroup queryWorkerGroupById(int workerGroupId){
|
||||
return workerGroupMapper.queryById(workerGroupId);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@
|
|||
package cn.escheduler.dao;
|
||||
|
||||
import cn.escheduler.common.Constants;
|
||||
import cn.escheduler.common.utils.DateUtils;
|
||||
import cn.escheduler.dao.model.TaskRecord;
|
||||
import org.apache.commons.configuration.Configuration;
|
||||
import org.apache.commons.configuration.ConfigurationException;
|
||||
|
|
@ -39,6 +40,8 @@ public class TaskRecordDao {
|
|||
|
||||
private static Logger logger = LoggerFactory.getLogger(TaskRecordDao.class.getName());
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 加载配置文件
|
||||
*/
|
||||
|
|
@ -46,7 +49,7 @@ public class TaskRecordDao {
|
|||
|
||||
static {
|
||||
try {
|
||||
conf = new PropertiesConfiguration(Constants.TASK_RECORD_PROPERTIES_PATH);
|
||||
conf = new PropertiesConfiguration(Constants.DATA_SOURCE_PROPERTIES);
|
||||
}catch (ConfigurationException e){
|
||||
logger.error("load configuration excetpion",e);
|
||||
System.exit(1);
|
||||
|
|
@ -133,7 +136,7 @@ public class TaskRecordDao {
|
|||
* @param filterMap
|
||||
* @return
|
||||
*/
|
||||
public static int countTaskRecord(Map<String, String> filterMap){
|
||||
public static int countTaskRecord(Map<String, String> filterMap, String table){
|
||||
|
||||
int count = 0;
|
||||
Connection conn = null;
|
||||
|
|
@ -142,7 +145,7 @@ public class TaskRecordDao {
|
|||
if(conn == null){
|
||||
return count;
|
||||
}
|
||||
String sql = "select count(1) as count from eamp_hive_log_hd";
|
||||
String sql = String.format("select count(1) as count from %s", table);
|
||||
sql += getWhereString(filterMap);
|
||||
PreparedStatement pstmt;
|
||||
pstmt = conn.prepareStatement(sql);
|
||||
|
|
@ -170,9 +173,9 @@ public class TaskRecordDao {
|
|||
* @param filterMap
|
||||
* @return
|
||||
*/
|
||||
public static List<TaskRecord> queryAllTaskRecord(Map<String,String> filterMap ) {
|
||||
public static List<TaskRecord> queryAllTaskRecord(Map<String,String> filterMap , String table) {
|
||||
|
||||
String sql = "select * from eamp_hive_log_hd ";
|
||||
String sql = String.format("select * from %s", table);
|
||||
sql += getWhereString(filterMap);
|
||||
|
||||
int offset = Integer.parseInt(filterMap.get("offset"));
|
||||
|
|
@ -201,8 +204,8 @@ public class TaskRecordDao {
|
|||
taskRecord.setProcId(resultSet.getInt("PROC_ID"));
|
||||
taskRecord.setProcName(resultSet.getString("PROC_NAME"));
|
||||
taskRecord.setProcDate(resultSet.getString("PROC_DATE"));
|
||||
taskRecord.setStartDate(resultSet.getDate("STARTDATE"));
|
||||
taskRecord.setEndDate(resultSet.getDate("ENDDATE"));
|
||||
taskRecord.setStartTime(DateUtils.stringToDate(resultSet.getString("STARTDATE")));
|
||||
taskRecord.setEndTime(DateUtils.stringToDate(resultSet.getString("ENDDATE")));
|
||||
taskRecord.setResult(resultSet.getString("RESULT"));
|
||||
taskRecord.setDuration(resultSet.getInt("DURATION"));
|
||||
taskRecord.setNote(resultSet.getString("NOTE"));
|
||||
|
|
|
|||
|
|
@ -63,14 +63,14 @@ public class ConnectionFactory {
|
|||
druidDataSource.setTestOnReturn(getBoolean(Constants.SPRING_DATASOURCE_TEST_ON_RETURN));
|
||||
druidDataSource.setKeepAlive(getBoolean(Constants.SPRING_DATASOURCE_KEEP_ALIVE));
|
||||
//just for development
|
||||
if (CommonUtils.isDevelopMode()) {
|
||||
/*if (CommonUtils.isDevelopMode()) {
|
||||
//Configure filters that are intercepted by monitoring statistics, and SQL can not be counted after removing them.'wall'is used for firewall
|
||||
try {
|
||||
druidDataSource.setFilters("stat,wall,log4j");
|
||||
} catch (SQLException e) {
|
||||
logger.error(e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
druidDataSource.setMinIdle(getInt(Constants.SPRING_DATASOURCE_MIN_IDLE));
|
||||
druidDataSource.setMaxActive(getInt(Constants.SPRING_DATASOURCE_MAX_ACTIVE));
|
||||
|
|
|
|||
|
|
@ -0,0 +1,90 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package cn.escheduler.dao.mapper;
|
||||
|
||||
import cn.escheduler.common.enums.UserType;
|
||||
import cn.escheduler.dao.model.AccessToken;
|
||||
import cn.escheduler.dao.model.User;
|
||||
import org.apache.ibatis.annotations.*;
|
||||
import org.apache.ibatis.type.EnumOrdinalTypeHandler;
|
||||
import org.apache.ibatis.type.JdbcType;
|
||||
|
||||
import java.sql.Timestamp;
|
||||
import java.util.List;
|
||||
|
||||
public interface AccessTokenMapper {
|
||||
|
||||
/**
|
||||
* insert accessToken
|
||||
* @param accessToken
|
||||
* @return
|
||||
*/
|
||||
@InsertProvider(type = AccessTokenMapperProvider.class, method = "insert")
|
||||
@Options(useGeneratedKeys = true,keyProperty = "accessToken.id")
|
||||
@SelectKey(statement = "SELECT LAST_INSERT_ID()", keyProperty = "accessToken.id", before = false, resultType = int.class)
|
||||
int insert(@Param("accessToken") AccessToken accessToken);
|
||||
|
||||
|
||||
/**
|
||||
* delete accessToken
|
||||
* @param accessTokenId
|
||||
* @return
|
||||
*/
|
||||
@DeleteProvider(type = AccessTokenMapperProvider.class, method = "delete")
|
||||
int delete(@Param("accessTokenId") int accessTokenId);
|
||||
|
||||
|
||||
/**
|
||||
* update accessToken
|
||||
*
|
||||
* @param accessToken
|
||||
* @return
|
||||
*/
|
||||
@UpdateProvider(type = AccessTokenMapperProvider.class, method = "update")
|
||||
int update(@Param("accessToken") AccessToken accessToken);
|
||||
|
||||
|
||||
/**
|
||||
* query access token list paging
|
||||
* @param searchVal
|
||||
* @param offset
|
||||
* @param pageSize
|
||||
* @return
|
||||
*/
|
||||
@Results(value = {@Result(property = "id", column = "id", id = true, javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "userId", column = "user_id", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "token", column = "token", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "userName", column = "user_name", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "expireTime", column = "expire_time", javaType = Timestamp.class, jdbcType = JdbcType.DATE),
|
||||
@Result(property = "createTime", column = "create_time", javaType = Timestamp.class, jdbcType = JdbcType.DATE),
|
||||
@Result(property = "updateTime", column = "update_time", javaType = Timestamp.class, jdbcType = JdbcType.DATE)
|
||||
})
|
||||
@SelectProvider(type = AccessTokenMapperProvider.class, method = "queryAccessTokenPaging")
|
||||
List<AccessToken> queryAccessTokenPaging(@Param("userId") Integer userId,
|
||||
@Param("searchVal") String searchVal,
|
||||
@Param("offset") Integer offset,
|
||||
@Param("pageSize") Integer pageSize);
|
||||
|
||||
/**
|
||||
* count access token by search value
|
||||
* @param searchVal
|
||||
* @return
|
||||
*/
|
||||
@SelectProvider(type = AccessTokenMapperProvider.class, method = "countAccessTokenPaging")
|
||||
Integer countAccessTokenPaging(@Param("userId") Integer userId
|
||||
,@Param("searchVal") String searchVal);
|
||||
}
|
||||
|
|
@ -0,0 +1,136 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package cn.escheduler.dao.mapper;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.ibatis.jdbc.SQL;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* access token mapper provider
|
||||
*
|
||||
*/
|
||||
public class AccessTokenMapperProvider {
|
||||
|
||||
private static final String TABLE_NAME = "t_escheduler_access_token";
|
||||
|
||||
/**
|
||||
* insert accessToken
|
||||
*
|
||||
* @param parameter
|
||||
* @return
|
||||
*/
|
||||
public String insert(Map<String, Object> parameter) {
|
||||
return new SQL() {
|
||||
{
|
||||
INSERT_INTO(TABLE_NAME);
|
||||
VALUES("`user_id`", "#{accessToken.userId}");
|
||||
VALUES("`token`", "#{accessToken.token}");
|
||||
VALUES("`expire_time`", "#{accessToken.expireTime}");;
|
||||
VALUES("`create_time`", "#{accessToken.createTime}");
|
||||
VALUES("`update_time`", "#{accessToken.updateTime}");
|
||||
}
|
||||
}.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* delete accessToken
|
||||
*
|
||||
* @param parameter
|
||||
* @return
|
||||
*/
|
||||
public String delete(Map<String, Object> parameter) {
|
||||
return new SQL() {
|
||||
{
|
||||
DELETE_FROM(TABLE_NAME);
|
||||
|
||||
WHERE("`id`=#{accessTokenId}");
|
||||
}
|
||||
}.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* update accessToken
|
||||
*
|
||||
* @param parameter
|
||||
* @return
|
||||
*/
|
||||
public String update(Map<String, Object> parameter) {
|
||||
return new SQL() {
|
||||
{
|
||||
UPDATE(TABLE_NAME);
|
||||
|
||||
SET("`user_id`=#{accessToken.userId}");
|
||||
SET("`token`=#{accessToken.token}");
|
||||
SET("`expire_time`=#{accessToken.expireTime}");
|
||||
SET("`update_time`=#{accessToken.updateTime}");
|
||||
|
||||
WHERE("`id`=#{accessToken.id}");
|
||||
}
|
||||
}.toString();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* count user number by search value
|
||||
* @param parameter
|
||||
* @return
|
||||
*/
|
||||
public String countAccessTokenPaging(Map<String, Object> parameter) {
|
||||
return new SQL() {{
|
||||
SELECT("count(0)");
|
||||
FROM(TABLE_NAME + " t,t_escheduler_user u");
|
||||
Object searchVal = parameter.get("searchVal");
|
||||
WHERE("u.id = t.user_id");
|
||||
if(parameter.get("userId") != null && (int)parameter.get("userId") != 0){
|
||||
WHERE(" u.id = #{userId}");
|
||||
}
|
||||
if(searchVal != null && StringUtils.isNotEmpty(searchVal.toString())){
|
||||
WHERE(" u.user_name like concat('%', #{searchVal}, '%')");
|
||||
}
|
||||
}}.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* query user list paging
|
||||
* @param parameter
|
||||
* @return
|
||||
*/
|
||||
public String queryAccessTokenPaging(Map<String, Object> parameter) {
|
||||
return new SQL() {
|
||||
{
|
||||
SELECT("t.*,u.user_name");
|
||||
FROM(TABLE_NAME + " t,t_escheduler_user u");
|
||||
Object searchVal = parameter.get("searchVal");
|
||||
WHERE("u.id = t.user_id");
|
||||
if(parameter.get("userId") != null && (int)parameter.get("userId") != 0){
|
||||
WHERE(" u.id = #{userId}");
|
||||
}
|
||||
if(searchVal != null && StringUtils.isNotEmpty(searchVal.toString())){
|
||||
WHERE(" u.user_name like concat('%', #{searchVal}, '%') ");
|
||||
}
|
||||
ORDER_BY(" t.update_time desc limit #{offset},#{pageSize} ");
|
||||
}
|
||||
}.toString();
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -18,12 +18,15 @@ package cn.escheduler.dao.mapper;
|
|||
|
||||
import cn.escheduler.common.enums.*;
|
||||
import cn.escheduler.dao.model.Command;
|
||||
import cn.escheduler.dao.model.ExecuteStatusCount;
|
||||
import org.apache.ibatis.annotations.*;
|
||||
import org.apache.ibatis.type.EnumOrdinalTypeHandler;
|
||||
import org.apache.ibatis.type.JdbcType;
|
||||
|
||||
import java.sql.Timestamp;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* command mapper
|
||||
|
|
@ -76,6 +79,7 @@ public interface CommandMapper {
|
|||
@Result(property = "scheduleTime", column = "schedule_time", javaType = Timestamp.class, jdbcType = JdbcType.DATE),
|
||||
@Result(property = "updateTime", column = "update_time", javaType = Timestamp.class, jdbcType = JdbcType.DATE),
|
||||
@Result(property = "startTime", column = "start_time", javaType = Timestamp.class, jdbcType = JdbcType.DATE),
|
||||
@Result(property = "workerGroupId", column = "worker_group_id", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "processInstancePriority", column = "process_instance_priority", javaType = Priority.class, typeHandler = EnumOrdinalTypeHandler.class, jdbcType = JdbcType.TINYINT)
|
||||
})
|
||||
@SelectProvider(type = CommandMapperProvider.class, method = "queryOneCommand")
|
||||
|
|
@ -98,9 +102,23 @@ public interface CommandMapper {
|
|||
@Result(property = "scheduleTime", column = "schedule_time", javaType = Timestamp.class, jdbcType = JdbcType.DATE),
|
||||
@Result(property = "updateTime", column = "update_time", javaType = Timestamp.class, jdbcType = JdbcType.DATE),
|
||||
@Result(property = "startTime", column = "start_time", javaType = Timestamp.class, jdbcType = JdbcType.DATE),
|
||||
@Result(property = "workerGroupId", column = "worker_group_id", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "processInstancePriority", column = "process_instance_priority", javaType = Priority.class, typeHandler = EnumOrdinalTypeHandler.class, jdbcType = JdbcType.TINYINT)
|
||||
})
|
||||
@SelectProvider(type = CommandMapperProvider.class, method = "queryAllCommand")
|
||||
List<Command> queryAllCommand();
|
||||
|
||||
|
||||
|
||||
@Results(value = {
|
||||
@Result(property = "state", column = "state", typeHandler = EnumOrdinalTypeHandler.class, javaType = ExecutionStatus.class, jdbcType = JdbcType.TINYINT),
|
||||
@Result(property = "count", column = "count", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
})
|
||||
@SelectProvider(type = CommandMapperProvider.class, method = "countCommandState")
|
||||
List<ExecuteStatusCount> countCommandState(
|
||||
@Param("userId") int userId,
|
||||
@Param("userType") UserType userType,
|
||||
@Param("startTime") Date startTime,
|
||||
@Param("endTime") Date endTime,
|
||||
@Param("projectId") int projectId);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -51,6 +51,7 @@ public class CommandMapperProvider {
|
|||
VALUES("`warning_group_id`", "#{command.warningGroupId}");
|
||||
VALUES("`schedule_time`", "#{command.scheduleTime}");
|
||||
VALUES("`update_time`", "#{command.updateTime}");
|
||||
VALUES("`worker_group_id`", "#{command.workerGroupId}");
|
||||
VALUES("`start_time`", "#{command.startTime}");
|
||||
|
||||
}
|
||||
|
|
@ -95,6 +96,7 @@ public class CommandMapperProvider {
|
|||
SET("`warning_group_id`=#{command.warningGroupId}");
|
||||
SET("`schedule_time`=#{command.scheduleTime}");
|
||||
SET("`update_time`=#{command.updateTime}");
|
||||
SET("`worker_group_id`=#{command.workerGroupId}");
|
||||
SET("`start_time`=#{command.startTime}");
|
||||
|
||||
WHERE("`id`=#{command.id}");
|
||||
|
|
@ -139,6 +141,31 @@ public class CommandMapperProvider {
|
|||
}.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* count command type
|
||||
* @param parameter
|
||||
* @return
|
||||
*/
|
||||
public String countCommandState(Map<String, Object> parameter){
|
||||
return new SQL(){
|
||||
{
|
||||
SELECT ("command_type as state,COUNT(*) AS count");
|
||||
FROM(TABLE_NAME + " cmd,t_escheduler_process_definition process");
|
||||
WHERE("cmd.process_definition_id = process.id");
|
||||
if(parameter.get("projectId") != null && (int)parameter.get("projectId") != 0){
|
||||
WHERE( "process.project_id = #{projectId} ");
|
||||
}else{
|
||||
if(parameter.get("userType") != null && String.valueOf(parameter.get("userType")) == "GENERAL_USER") {
|
||||
AND();
|
||||
WHERE("process.project_id in (select id as project_id from t_escheduler_project tp where tp.user_id= #{userId} " +
|
||||
"union select project_id from t_escheduler_relation_project_user tr where tr.user_id= #{userId} )");
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
WHERE("cmd.start_time >= #{startTime} and cmd.update_time <= #{endTime}");
|
||||
GROUP_BY("cmd.command_type");
|
||||
}
|
||||
}.toString();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,59 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package cn.escheduler.dao.mapper;
|
||||
|
||||
import cn.escheduler.common.enums.*;
|
||||
import cn.escheduler.dao.model.Command;
|
||||
import cn.escheduler.dao.model.ErrorCommand;
|
||||
import cn.escheduler.dao.model.ExecuteStatusCount;
|
||||
import org.apache.ibatis.annotations.*;
|
||||
import org.apache.ibatis.type.EnumOrdinalTypeHandler;
|
||||
import org.apache.ibatis.type.JdbcType;
|
||||
|
||||
import java.sql.Timestamp;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* command mapper
|
||||
*/
|
||||
public interface ErrorCommandMapper {
|
||||
|
||||
/**
|
||||
* inert error command
|
||||
* @param errorCommand
|
||||
* @return
|
||||
*/
|
||||
@InsertProvider(type = ErrorCommandMapperProvider.class, method = "insert")
|
||||
@Options(useGeneratedKeys = true,keyProperty = "errorCommand.id")
|
||||
@SelectKey(statement = "SELECT LAST_INSERT_ID()", keyProperty = "errorCommand.id", before = false, resultType = int.class)
|
||||
int insert(@Param("errorCommand") ErrorCommand errorCommand);
|
||||
|
||||
@Results(value = {
|
||||
@Result(property = "state", column = "state", typeHandler = EnumOrdinalTypeHandler.class, javaType = ExecutionStatus.class, jdbcType = JdbcType.TINYINT),
|
||||
@Result(property = "count", column = "count", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
})
|
||||
@SelectProvider(type = ErrorCommandMapperProvider.class, method = "countCommandState")
|
||||
List<ExecuteStatusCount> countCommandState(
|
||||
@Param("userId") int userId,
|
||||
@Param("userType") UserType userType,
|
||||
@Param("startTime") Date startTime,
|
||||
@Param("endTime") Date endTime,
|
||||
@Param("projectId") int projectId);
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,71 @@
|
|||
package cn.escheduler.dao.mapper;
|
||||
|
||||
import cn.escheduler.common.enums.*;
|
||||
import cn.escheduler.common.utils.EnumFieldUtil;
|
||||
import org.apache.ibatis.jdbc.SQL;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public class ErrorCommandMapperProvider {
|
||||
|
||||
|
||||
private static final String TABLE_NAME = "t_escheduler_error_command";
|
||||
|
||||
|
||||
/**
|
||||
* inert command
|
||||
*
|
||||
* @param parameter
|
||||
* @return
|
||||
*/
|
||||
public String insert(Map<String, Object> parameter) {
|
||||
return new SQL() {
|
||||
{
|
||||
INSERT_INTO(TABLE_NAME);
|
||||
VALUES("`id`", "#{errorCommand.id}");
|
||||
VALUES("`command_type`", EnumFieldUtil.genFieldStr("errorCommand.commandType", CommandType.class));
|
||||
VALUES("`process_definition_id`", "#{errorCommand.processDefinitionId}");
|
||||
VALUES("`executor_id`", "#{errorCommand.executorId}");
|
||||
VALUES("`command_param`", "#{errorCommand.commandParam}");
|
||||
VALUES("`task_depend_type`", EnumFieldUtil.genFieldStr("errorCommand.taskDependType", TaskDependType.class));
|
||||
VALUES("`failure_strategy`", EnumFieldUtil.genFieldStr("errorCommand.failureStrategy", FailureStrategy.class));
|
||||
VALUES("`warning_type`", EnumFieldUtil.genFieldStr("errorCommand.warningType", WarningType.class));
|
||||
VALUES("`process_instance_priority`", EnumFieldUtil.genFieldStr("errorCommand.processInstancePriority", Priority.class));
|
||||
VALUES("`warning_group_id`", "#{errorCommand.warningGroupId}");
|
||||
VALUES("`schedule_time`", "#{errorCommand.scheduleTime}");
|
||||
VALUES("`update_time`", "#{errorCommand.updateTime}");
|
||||
VALUES("`start_time`", "#{errorCommand.startTime}");
|
||||
VALUES("`worker_group_id`", "#{errorCommand.workerGroupId}");
|
||||
VALUES("`message`", "#{errorCommand.message}");
|
||||
}
|
||||
}.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* count command type
|
||||
* @param parameter
|
||||
* @return
|
||||
*/
|
||||
public String countCommandState(Map<String, Object> parameter){
|
||||
return new SQL(){
|
||||
{
|
||||
SELECT("command_type as state,COUNT(*) AS count");
|
||||
FROM(TABLE_NAME + " cmd,t_escheduler_process_definition process");
|
||||
WHERE("cmd.process_definition_id = process.id");
|
||||
if(parameter.get("projectId") != null && (int)parameter.get("projectId") != 0){
|
||||
WHERE( "process.project_id = #{projectId} ");
|
||||
}else{
|
||||
if(parameter.get("userType") != null && String.valueOf(parameter.get("userType")) == "GENERAL_USER") {
|
||||
AND();
|
||||
WHERE("process.project_id in (select id as project_id from t_escheduler_project tp where tp.user_id= #{userId} " +
|
||||
"union select project_id from t_escheduler_relation_project_user tr where tr.user_id= #{userId} )");
|
||||
|
||||
}
|
||||
}
|
||||
WHERE("cmd.start_time >= #{startTime} and cmd.update_time <= #{endTime}");
|
||||
GROUP_BY("cmd.command_type");
|
||||
}
|
||||
}.toString();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,88 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package cn.escheduler.dao.mapper;
|
||||
|
||||
import cn.escheduler.dao.model.Queue;
|
||||
import org.apache.ibatis.annotations.*;
|
||||
import org.apache.ibatis.type.JdbcType;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* queue mapper
|
||||
*/
|
||||
public interface MonitorMapper {
|
||||
|
||||
/**
|
||||
* insert queue
|
||||
* @param queue
|
||||
* @return
|
||||
*/
|
||||
@InsertProvider(type = QueueMapperProvider.class, method = "insert")
|
||||
@Options(useGeneratedKeys = true,keyProperty = "queue.id")
|
||||
@SelectKey(statement = "SELECT LAST_INSERT_ID()", keyProperty = "queue.id", before = false, resultType = int.class)
|
||||
int insert(@Param("queue") Queue queue);
|
||||
|
||||
|
||||
/**
|
||||
* delete queue
|
||||
* @param queueId
|
||||
* @return
|
||||
*/
|
||||
@DeleteProvider(type = QueueMapperProvider.class, method = "delete")
|
||||
int delete(@Param("queueId") int queueId);
|
||||
|
||||
|
||||
/**
|
||||
* update queue
|
||||
*
|
||||
* @param queue
|
||||
* @return
|
||||
*/
|
||||
@UpdateProvider(type = QueueMapperProvider.class, method = "update")
|
||||
int update(@Param("queue") Queue queue);
|
||||
|
||||
|
||||
/**
|
||||
* query queue by id
|
||||
* @param queueId
|
||||
* @return
|
||||
*/
|
||||
@Results(value = {@Result(property = "id", column = "id", id = true, javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "queueName", column = "queue_name", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "queue", column = "queue", javaType = String.class, jdbcType = JdbcType.VARCHAR)
|
||||
})
|
||||
@SelectProvider(type = QueueMapperProvider.class, method = "queryById")
|
||||
Queue queryById(@Param("queueId") int queueId);
|
||||
|
||||
|
||||
/**
|
||||
* query all queue list
|
||||
* @return
|
||||
*/
|
||||
@Results(value = {@Result(property = "id", column = "id", id = true, javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "queueName", column = "queue_name", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "queue", column = "queue", javaType = String.class, jdbcType = JdbcType.VARCHAR)
|
||||
})
|
||||
@SelectProvider(type = QueueMapperProvider.class, method = "queryAllQueue")
|
||||
List<Queue> queryAllQueue();
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -94,6 +94,7 @@ public interface ProcessDefinitionMapper {
|
|||
@Result(property = "locations", column = "locations", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "connects", column = "connects", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "projectName", column = "project_name", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "timeout", column = "timeout", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "receivers", column = "receivers", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "receiversCc", column = "receivers_cc", javaType = String.class, jdbcType = JdbcType.VARCHAR)
|
||||
|
||||
|
|
@ -121,6 +122,7 @@ public interface ProcessDefinitionMapper {
|
|||
@Result(property = "userName", column = "user_name", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "locations", column = "locations", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "connects", column = "connects", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "timeout", column = "timeout", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "projectName", column = "project_name", javaType = String.class, jdbcType = JdbcType.VARCHAR)
|
||||
})
|
||||
@SelectProvider(type = ProcessDefinitionMapperProvider.class, method = "queryByDefineName")
|
||||
|
|
@ -157,6 +159,7 @@ public interface ProcessDefinitionMapper {
|
|||
@Result(property = "updateTime", column = "update_time", javaType = Timestamp.class, jdbcType = JdbcType.DATE),
|
||||
@Result(property = "flag", column = "flag", typeHandler = EnumOrdinalTypeHandler.class, javaType = Flag.class, jdbcType = JdbcType.TINYINT),
|
||||
@Result(property = "userName", column = "user_name", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "timeout", column = "timeout", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "projectName", column = "project_name", javaType = String.class, jdbcType = JdbcType.VARCHAR)
|
||||
})
|
||||
@SelectProvider(type = ProcessDefinitionMapperProvider.class, method = "queryAllDefinitionList")
|
||||
|
|
@ -183,6 +186,7 @@ public interface ProcessDefinitionMapper {
|
|||
@Result(property = "flag", column = "flag", typeHandler = EnumOrdinalTypeHandler.class, javaType = Flag.class, jdbcType = JdbcType.TINYINT),
|
||||
@Result(property = "userName", column = "user_name", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "scheduleReleaseState", column = "schedule_release_state", typeHandler = EnumOrdinalTypeHandler.class, javaType = ReleaseState.class, jdbcType = JdbcType.TINYINT),
|
||||
@Result(property = "timeout", column = "timeout", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "projectName", column = "project_name", javaType = String.class, jdbcType = JdbcType.VARCHAR)
|
||||
})
|
||||
@SelectProvider(type = ProcessDefinitionMapperProvider.class, method = "queryDefineListPaging")
|
||||
|
|
@ -211,6 +215,7 @@ public interface ProcessDefinitionMapper {
|
|||
@Result(property = "locations", column = "locations", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "connects", column = "connects", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "userName", column = "user_name", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "timeout", column = "timeout", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "projectName", column = "project_name", javaType = String.class, jdbcType = JdbcType.VARCHAR)
|
||||
})
|
||||
@SelectProvider(type = ProcessDefinitionMapperProvider.class, method = "queryDefinitionListByIdList")
|
||||
|
|
|
|||
|
|
@ -55,6 +55,7 @@ public class ProcessDefinitionMapperProvider {
|
|||
VALUES("`connects`", "#{processDefinition.connects}");
|
||||
VALUES("`create_time`", "#{processDefinition.createTime}");
|
||||
VALUES("`update_time`", "#{processDefinition.updateTime}");
|
||||
VALUES("`timeout`", "#{processDefinition.timeout}");
|
||||
VALUES("`flag`", EnumFieldUtil.genFieldStr("processDefinition.flag", ReleaseState.class));
|
||||
VALUES("`user_id`", "#{processDefinition.userId}");
|
||||
|
||||
|
|
@ -100,6 +101,7 @@ public class ProcessDefinitionMapperProvider {
|
|||
SET("`global_params`=#{processDefinition.globalParams}");
|
||||
SET("`create_time`=#{processDefinition.createTime}");
|
||||
SET("`update_time`=#{processDefinition.updateTime}");
|
||||
SET("`timeout`=#{processDefinition.timeout}");
|
||||
SET("`flag`="+EnumFieldUtil.genFieldStr("processDefinition.flag", Flag.class));
|
||||
SET("`user_id`=#{processDefinition.userId}");
|
||||
|
||||
|
|
@ -173,7 +175,7 @@ public class ProcessDefinitionMapperProvider {
|
|||
*/
|
||||
public String queryDefineListPaging(Map<String, Object> parameter) {
|
||||
return new SQL() {{
|
||||
SELECT("td.id,td.name,td.version,td.release_state,td.project_id,td.user_id,td.`desc`,td.create_time,td.update_time,td.flag,td.global_params,td.receivers,td.receivers_cc,sc.schedule_release_state");
|
||||
SELECT("td.*,sc.schedule_release_state");
|
||||
FROM(TABLE_NAME + " td");
|
||||
LEFT_OUTER_JOIN(" (select process_definition_id,release_state as schedule_release_state from `t_escheduler_schedules` " +
|
||||
"group by `process_definition_id`,`release_state`) sc on sc.process_definition_id = td.id");
|
||||
|
|
|
|||
|
|
@ -94,6 +94,8 @@ public interface ProcessInstanceMapper {
|
|||
@Result(property = "dependenceScheduleTimes", column = "dependence_schedule_times", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "duration", column = "duration", javaType = Long.class, jdbcType = JdbcType.BIGINT),
|
||||
@Result(property = "tenantCode", column = "tenant_code", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "workerGroupId", column = "worker_group_id", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "timeout", column = "timeout", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "processInstancePriority", column = "process_instance_priority", javaType = Priority.class, typeHandler = EnumOrdinalTypeHandler.class, jdbcType = JdbcType.TINYINT)
|
||||
})
|
||||
@SelectProvider(type = ProcessInstanceMapperProvider.class, method = "queryDetailById")
|
||||
|
|
@ -131,6 +133,8 @@ public interface ProcessInstanceMapper {
|
|||
@Result(property = "connects", column = "connects", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "historyCmd", column = "history_cmd", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "dependenceScheduleTimes", column = "dependence_schedule_times", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "workerGroupId", column = "worker_group_id", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "timeout", column = "timeout", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "processInstancePriority", column = "process_instance_priority", javaType = Priority.class, typeHandler = EnumOrdinalTypeHandler.class, jdbcType = JdbcType.TINYINT)
|
||||
})
|
||||
@SelectProvider(type = ProcessInstanceMapperProvider.class, method = "queryById")
|
||||
|
|
@ -168,6 +172,8 @@ public interface ProcessInstanceMapper {
|
|||
@Result(property = "historyCmd", column = "history_cmd", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "dependenceScheduleTimes", column = "dependence_schedule_times", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "processInstanceJson", column = "process_instance_json", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "workerGroupId", column = "worker_group_id", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "timeout", column = "timeout", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "processInstancePriority", column = "process_instance_priority", javaType = Priority.class, typeHandler = EnumOrdinalTypeHandler.class, jdbcType = JdbcType.TINYINT)
|
||||
|
||||
})
|
||||
|
|
@ -205,6 +211,8 @@ public interface ProcessInstanceMapper {
|
|||
@Result(property = "historyCmd", column = "history_cmd", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "dependenceScheduleTimes", column = "dependence_schedule_times", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "processInstanceJson", column = "process_instance_json", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "workerGroupId", column = "worker_group_id", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "timeout", column = "timeout", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "processInstancePriority", column = "process_instance_priority", javaType = Priority.class, typeHandler = EnumOrdinalTypeHandler.class, jdbcType = JdbcType.TINYINT)
|
||||
|
||||
})
|
||||
|
|
@ -251,6 +259,8 @@ public interface ProcessInstanceMapper {
|
|||
@Result(property = "dependenceScheduleTimes", column = "dependence_schedule_times", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "duration", column = "duration", javaType = Long.class, jdbcType = JdbcType.BIGINT),
|
||||
@Result(property = "processInstanceJson", column = "process_instance_json", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "workerGroupId", column = "worker_group_id", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "timeout", column = "timeout", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "processInstancePriority", column = "process_instance_priority", javaType = Priority.class, typeHandler = EnumOrdinalTypeHandler.class, jdbcType = JdbcType.TINYINT)
|
||||
|
||||
})
|
||||
|
|
@ -346,6 +356,8 @@ public interface ProcessInstanceMapper {
|
|||
@Result(property = "dependenceScheduleTimes", column = "dependence_schedule_times", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "duration", column = "duration", javaType = Long.class, jdbcType = JdbcType.BIGINT),
|
||||
@Result(property = "processInstanceJson", column = "process_instance_json", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "workerGroupId", column = "worker_group_id", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "timeout", column = "timeout", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "processInstancePriority", column = "process_instance_priority", javaType = Priority.class, typeHandler = EnumOrdinalTypeHandler.class, jdbcType = JdbcType.TINYINT)
|
||||
|
||||
})
|
||||
|
|
@ -437,6 +449,8 @@ public interface ProcessInstanceMapper {
|
|||
@Result(property = "dependenceScheduleTimes", column = "dependence_schedule_times", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "duration", column = "duration", javaType = Long.class, jdbcType = JdbcType.BIGINT),
|
||||
@Result(property = "processInstanceJson", column = "process_instance_json", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "workerGroupId", column = "worker_group_id", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "timeout", column = "timeout", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "processInstancePriority", column = "process_instance_priority", javaType = Priority.class, typeHandler = EnumOrdinalTypeHandler.class, jdbcType = JdbcType.TINYINT)
|
||||
|
||||
})
|
||||
|
|
@ -480,6 +494,8 @@ public interface ProcessInstanceMapper {
|
|||
@Result(property = "dependenceScheduleTimes", column = "dependence_schedule_times", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "duration", column = "duration", javaType = Long.class, jdbcType = JdbcType.BIGINT),
|
||||
@Result(property = "processInstanceJson", column = "process_instance_json", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "workerGroupId", column = "worker_group_id", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "timeout", column = "timeout", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "processInstancePriority", column = "process_instance_priority", javaType = Priority.class, typeHandler = EnumOrdinalTypeHandler.class, jdbcType = JdbcType.TINYINT)
|
||||
|
||||
})
|
||||
|
|
@ -523,6 +539,8 @@ public interface ProcessInstanceMapper {
|
|||
@Result(property = "historyCmd", column = "history_cmd", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "dependenceScheduleTimes", column = "dependence_schedule_times", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "processInstanceJson", column = "process_instance_json", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "workerGroupId", column = "worker_group_id", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "timeout", column = "timeout", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "processInstancePriority", column = "process_instance_priority", javaType = Priority.class, typeHandler = EnumOrdinalTypeHandler.class, jdbcType = JdbcType.TINYINT)
|
||||
|
||||
})
|
||||
|
|
@ -564,6 +582,8 @@ public interface ProcessInstanceMapper {
|
|||
@Result(property = "historyCmd", column = "history_cmd", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "dependenceScheduleTimes", column = "dependence_schedule_times", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "processInstanceJson", column = "process_instance_json", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "workerGroupId", column = "worker_group_id", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "timeout", column = "timeout", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "processInstancePriority", column = "process_instance_priority", javaType = Priority.class, typeHandler = EnumOrdinalTypeHandler.class, jdbcType = JdbcType.TINYINT)
|
||||
})
|
||||
@SelectProvider(type = ProcessInstanceMapperProvider.class, method = "queryLastRunningProcess")
|
||||
|
|
@ -605,6 +625,8 @@ public interface ProcessInstanceMapper {
|
|||
@Result(property = "historyCmd", column = "history_cmd", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "dependenceScheduleTimes", column = "dependence_schedule_times", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "processInstanceJson", column = "process_instance_json", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "workerGroupId", column = "worker_group_id", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "timeout", column = "timeout", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "processInstancePriority", column = "process_instance_priority", javaType = Priority.class, typeHandler = EnumOrdinalTypeHandler.class, jdbcType = JdbcType.TINYINT)
|
||||
})
|
||||
@SelectProvider(type = ProcessInstanceMapperProvider.class, method = "queryLastManualProcess")
|
||||
|
|
|
|||
|
|
@ -67,6 +67,8 @@ public class ProcessInstanceMapperProvider {
|
|||
VALUES("`dependence_schedule_times`", "#{processInstance.dependenceScheduleTimes}");
|
||||
VALUES("`is_sub_process`", EnumFieldUtil.genFieldStr("processInstance.isSubProcess", Flag.class));
|
||||
VALUES("`executor_id`", "#{processInstance.executorId}");
|
||||
VALUES("`worker_group_id`", "#{processInstance.workerGroupId}");
|
||||
VALUES("`timeout`", "#{processInstance.timeout}");
|
||||
VALUES("`process_instance_priority`", EnumFieldUtil.genFieldStr("processInstance.processInstancePriority", Priority.class));
|
||||
}
|
||||
}.toString();
|
||||
|
|
@ -139,6 +141,8 @@ public class ProcessInstanceMapperProvider {
|
|||
SET("`dependence_schedule_times`=#{processInstance.dependenceScheduleTimes}");
|
||||
SET("`is_sub_process`="+EnumFieldUtil.genFieldStr("processInstance.isSubProcess", Flag.class));
|
||||
SET("`executor_id`=#{processInstance.executorId}");
|
||||
SET("`worker_group_id`=#{processInstance.workerGroupId}");
|
||||
SET("`timeout`=#{processInstance.timeout}");
|
||||
|
||||
WHERE("`id`=#{processInstance.id}");
|
||||
|
||||
|
|
|
|||
|
|
@ -75,6 +75,7 @@ public interface ScheduleMapper {
|
|||
@Result(property = "userName", column = "user_name", javaType = String.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "releaseState", column = "release_state", typeHandler = EnumOrdinalTypeHandler.class, javaType = ReleaseState.class, jdbcType = JdbcType.TINYINT),
|
||||
@Result(property = "warningGroupId", column = "warning_group_id", javaType = int.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "workerGroupId", column = "worker_group_id", javaType = int.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "processInstancePriority", column = "process_instance_priority", javaType = Priority.class, typeHandler = EnumOrdinalTypeHandler.class, jdbcType = JdbcType.TINYINT)
|
||||
})
|
||||
@SelectProvider(type = ScheduleMapperProvider.class, method = "queryByProcessDefineIdPaging")
|
||||
|
|
@ -117,6 +118,7 @@ public interface ScheduleMapper {
|
|||
@Result(property = "userName", column = "user_name", javaType = String.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "releaseState", column = "release_state", typeHandler = EnumOrdinalTypeHandler.class, javaType = ReleaseState.class, jdbcType = JdbcType.TINYINT),
|
||||
@Result(property = "warningGroupId", column = "warning_group_id", javaType = int.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "workerGroupId", column = "worker_group_id", javaType = int.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "processInstancePriority", column = "process_instance_priority", javaType = Priority.class, typeHandler = EnumOrdinalTypeHandler.class, jdbcType = JdbcType.TINYINT)
|
||||
})
|
||||
@SelectProvider(type = ScheduleMapperProvider.class, method = "querySchedulerListByProjectName")
|
||||
|
|
@ -141,6 +143,7 @@ public interface ScheduleMapper {
|
|||
@Result(property = "userId", column = "user_id", javaType = int.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "releaseState", column = "release_state", typeHandler = EnumOrdinalTypeHandler.class, javaType = ReleaseState.class, jdbcType = JdbcType.TINYINT),
|
||||
@Result(property = "warningGroupId", column = "warning_group_id", javaType = int.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "workerGroupId", column = "worker_group_id", javaType = int.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "processInstancePriority", column = "process_instance_priority", javaType = Priority.class, typeHandler = EnumOrdinalTypeHandler.class, jdbcType = JdbcType.TINYINT)
|
||||
})
|
||||
@SelectProvider(type = ScheduleMapperProvider.class, method = "queryById")
|
||||
|
|
@ -164,6 +167,7 @@ public interface ScheduleMapper {
|
|||
@Result(property = "userId", column = "user_id", javaType = int.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "releaseState", column = "release_state", typeHandler = EnumOrdinalTypeHandler.class, javaType = ReleaseState.class, jdbcType = JdbcType.TINYINT),
|
||||
@Result(property = "warningGroupId", column = "warning_group_id", javaType = int.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "workerGroupId", column = "worker_group_id", javaType = int.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "processInstancePriority", column = "process_instance_priority", javaType = Priority.class, typeHandler = EnumOrdinalTypeHandler.class, jdbcType = JdbcType.TINYINT)
|
||||
})
|
||||
@SelectProvider(type = ScheduleMapperProvider.class, method = "selectAllByProcessDefineArray")
|
||||
|
|
|
|||
|
|
@ -48,6 +48,7 @@ public class ScheduleMapperProvider {
|
|||
VALUES("`user_id`", "#{schedule.userId}");
|
||||
VALUES("`release_state`", EnumFieldUtil.genFieldStr("schedule.releaseState", ReleaseState.class));
|
||||
VALUES("`warning_group_id`", "#{schedule.warningGroupId}");
|
||||
VALUES("`worker_group_id`", "#{schedule.workerGroupId}");
|
||||
VALUES("`process_instance_priority`", EnumFieldUtil.genFieldStr("schedule.processInstancePriority", Priority.class));
|
||||
}}.toString();
|
||||
}
|
||||
|
|
@ -67,6 +68,7 @@ public class ScheduleMapperProvider {
|
|||
SET("`user_id`=#{schedule.userId}");
|
||||
SET("`release_state`=" + EnumFieldUtil.genFieldStr("schedule.releaseState", ReleaseState.class));
|
||||
SET("`warning_group_id`=#{schedule.warningGroupId}");
|
||||
SET("`worker_group_id`=#{schedule.workerGroupId}");
|
||||
SET("`process_instance_priority`="+ EnumFieldUtil.genFieldStr("schedule.processInstancePriority", Priority.class));
|
||||
|
||||
WHERE("`id` = #{schedule.id}");
|
||||
|
|
|
|||
|
|
@ -88,6 +88,7 @@ public interface TaskInstanceMapper {
|
|||
@Result(property = "appLink", column = "app_link", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "duration", column = "duration", javaType = Long.class, jdbcType = JdbcType.BIGINT),
|
||||
@Result(property = "flag", column = "flag", typeHandler = EnumOrdinalTypeHandler.class, javaType = Flag.class, jdbcType = JdbcType.TINYINT),
|
||||
@Result(property = "workerGroupId", column = "worker_group_id", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "taskInstancePriority", column = "task_instance_priority", javaType = Priority.class, typeHandler = EnumOrdinalTypeHandler.class, jdbcType = JdbcType.TINYINT)
|
||||
})
|
||||
@SelectProvider(type = TaskInstanceMapperProvider.class, method = "queryById")
|
||||
|
|
@ -131,6 +132,7 @@ public interface TaskInstanceMapper {
|
|||
@Result(property = "appLink", column = "app_link", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "duration", column = "duration", javaType = Long.class, jdbcType = JdbcType.BIGINT),
|
||||
@Result(property = "flag", column = "flag", typeHandler = EnumOrdinalTypeHandler.class, javaType = Flag.class, jdbcType = JdbcType.TINYINT),
|
||||
@Result(property = "workerGroupId", column = "worker_group_id", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "taskInstancePriority", column = "task_instance_priority", javaType = Priority.class, typeHandler = EnumOrdinalTypeHandler.class, jdbcType = JdbcType.TINYINT)
|
||||
})
|
||||
@SelectProvider(type = TaskInstanceMapperProvider.class, method = "findValidTaskListByProcessId")
|
||||
|
|
@ -164,6 +166,7 @@ public interface TaskInstanceMapper {
|
|||
@Result(property = "appLink", column = "app_link", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "duration", column = "duration", javaType = Long.class, jdbcType = JdbcType.BIGINT),
|
||||
@Result(property = "flag", column = "flag", typeHandler = EnumOrdinalTypeHandler.class, javaType = Flag.class, jdbcType = JdbcType.TINYINT),
|
||||
@Result(property = "workerGroupId", column = "worker_group_id", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "taskInstancePriority", column = "task_instance_priority", javaType = Priority.class, typeHandler = EnumOrdinalTypeHandler.class, jdbcType = JdbcType.TINYINT)
|
||||
})
|
||||
@SelectProvider(type = TaskInstanceMapperProvider.class, method = "queryByHostAndStatus")
|
||||
|
|
@ -255,6 +258,7 @@ public interface TaskInstanceMapper {
|
|||
@Result(property = "appLink", column = "app_link", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "duration", column = "duration", javaType = Long.class, jdbcType = JdbcType.BIGINT),
|
||||
@Result(property = "flag", column = "flag", typeHandler = EnumOrdinalTypeHandler.class, javaType = Flag.class, jdbcType = JdbcType.TINYINT),
|
||||
@Result(property = "workerGroupId", column = "worker_group_id", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "taskInstancePriority", column = "task_instance_priority", javaType = Priority.class, typeHandler = EnumOrdinalTypeHandler.class, jdbcType = JdbcType.TINYINT)
|
||||
})
|
||||
@SelectProvider(type = TaskInstanceMapperProvider.class, method = "queryTaskInstanceListPaging")
|
||||
|
|
@ -299,9 +303,24 @@ public interface TaskInstanceMapper {
|
|||
@Result(property = "appLink", column = "app_link", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "duration", column = "duration", javaType = Long.class, jdbcType = JdbcType.BIGINT),
|
||||
@Result(property = "flag", column = "flag", typeHandler = EnumOrdinalTypeHandler.class, javaType = Flag.class, jdbcType = JdbcType.TINYINT),
|
||||
@Result(property = "workerGroupId", column = "worker_group_id", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "taskInstancePriority", column = "task_instance_priority", javaType = Priority.class, typeHandler = EnumOrdinalTypeHandler.class, jdbcType = JdbcType.TINYINT)
|
||||
})
|
||||
@SelectProvider(type = TaskInstanceMapperProvider.class, method = "queryByInstanceIdAndName")
|
||||
TaskInstance queryByInstanceIdAndName(@Param("processInstanceId") int processInstanceId,
|
||||
@Param("name") String name);
|
||||
|
||||
|
||||
/**
|
||||
* count task
|
||||
* @param userId
|
||||
* @param userType
|
||||
* @param projectId
|
||||
* @return
|
||||
*/
|
||||
@SelectProvider(type = TaskInstanceMapperProvider.class, method = "countTask")
|
||||
Integer countTask(@Param("userId") int userId,
|
||||
@Param("userType") UserType userType,
|
||||
@Param("projectId") int projectId,
|
||||
@Param("taskIds") int[] taskIds);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -62,6 +62,7 @@ public class TaskInstanceMapperProvider {
|
|||
VALUES("`max_retry_times`", "#{taskInstance.maxRetryTimes}");
|
||||
VALUES("`retry_interval`", "#{taskInstance.retryInterval}");
|
||||
VALUES("`app_link`", "#{taskInstance.appLink}");
|
||||
VALUES("`worker_group_id`", "#{taskInstance.workerGroupId}");
|
||||
VALUES("`flag`", EnumFieldUtil.genFieldStr("taskInstance.flag", Flag.class));
|
||||
VALUES("`task_instance_priority`", EnumFieldUtil.genFieldStr("taskInstance.taskInstancePriority", Priority.class));
|
||||
|
||||
|
|
@ -114,6 +115,7 @@ public class TaskInstanceMapperProvider {
|
|||
SET("`max_retry_times`=#{taskInstance.maxRetryTimes}");
|
||||
SET("`retry_interval`=#{taskInstance.retryInterval}");
|
||||
SET("`app_link`=#{taskInstance.appLink}");
|
||||
SET("`worker_group_id`=#{taskInstance.workerGroupId}");
|
||||
SET("`flag`="+ EnumFieldUtil.genFieldStr("taskInstance.flag", Flag.class));
|
||||
SET("`task_instance_priority`="+ EnumFieldUtil.genFieldStr("taskInstance.taskInstancePriority", Priority.class));
|
||||
|
||||
|
|
@ -185,7 +187,7 @@ public class TaskInstanceMapperProvider {
|
|||
{
|
||||
SELECT ("state, count(0) as count");
|
||||
FROM(TABLE_NAME + " t");
|
||||
LEFT_OUTER_JOIN(DEFINE_TABLE_NAME+ " d on d.id=t.process_definition_id");
|
||||
LEFT_OUTER_JOIN(DEFINE_TABLE_NAME + " d on d.id=t.process_definition_id");
|
||||
LEFT_OUTER_JOIN("t_escheduler_project p on p.id=d.project_id");
|
||||
if(parameter.get("projectId") != null && (int)parameter.get("projectId") != 0){
|
||||
WHERE( "p.id = #{projectId} ");
|
||||
|
|
@ -404,4 +406,42 @@ public class TaskInstanceMapperProvider {
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* count task
|
||||
* @param parameter
|
||||
* @return
|
||||
*/
|
||||
public String countTask(Map<String, Object> parameter){
|
||||
|
||||
StringBuffer taskIdsStr = new StringBuffer();
|
||||
int[] stateArray = (int[]) parameter.get("taskIds");
|
||||
for(int i=0;i<stateArray.length;i++){
|
||||
taskIdsStr.append(stateArray[i]);
|
||||
if(i<stateArray.length-1){
|
||||
taskIdsStr.append(",");
|
||||
}
|
||||
}
|
||||
|
||||
return new SQL(){
|
||||
{
|
||||
SELECT("count(1) as count");
|
||||
FROM(TABLE_NAME + " task,t_escheduler_process_definition process");
|
||||
WHERE("task.process_definition_id=process.id");
|
||||
if(parameter.get("projectId") != null && (int)parameter.get("projectId") != 0){
|
||||
WHERE( "process.project_id = #{projectId} ");
|
||||
}else{
|
||||
if(parameter.get("userType") != null && String.valueOf(parameter.get("userType")) == "GENERAL_USER") {
|
||||
AND();
|
||||
WHERE("process.project_id in (select id as project_id from t_escheduler_project tp where tp.user_id= #{userId} " +
|
||||
"union select project_id from t_escheduler_relation_project_user tr where tr.user_id= #{userId} )");
|
||||
|
||||
}
|
||||
}
|
||||
WHERE("task.id in (" + taskIdsStr.toString() + ")");
|
||||
}
|
||||
}.toString();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -222,4 +222,33 @@ public interface UserMapper {
|
|||
})
|
||||
@SelectProvider(type = UserMapperProvider.class, method = "queryTenantCodeByUserId")
|
||||
User queryTenantCodeByUserId(@Param("userId") int userId);
|
||||
|
||||
|
||||
/**
|
||||
* query user queue by process instance id
|
||||
* @param processInstanceId
|
||||
* @return
|
||||
*/
|
||||
@SelectProvider(type = UserMapperProvider.class, method = "queryQueueByProcessInstanceId")
|
||||
String queryQueueByProcessInstanceId(@Param("processInstanceId") int processInstanceId);
|
||||
|
||||
|
||||
/**
|
||||
* query user by token
|
||||
* @param token
|
||||
* @return
|
||||
*/
|
||||
@Results(value = {
|
||||
@Result(property = "id", column = "id", id = true, javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "userName", column = "user_name", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "userPassword", column = "user_password", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "email", column = "email", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "phone", column = "phone", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "userType", column = "user_type", typeHandler = EnumOrdinalTypeHandler.class, javaType = UserType.class, jdbcType = JdbcType.TINYINT),
|
||||
@Result(property = "tenantId", column = "tenant_id", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "createTime", column = "create_time", javaType = Timestamp.class, jdbcType = JdbcType.DATE),
|
||||
@Result(property = "updateTime", column = "update_time", javaType = Timestamp.class, jdbcType = JdbcType.DATE)
|
||||
})
|
||||
@SelectProvider(type = UserMapperProvider.class, method = "queryUserByToken")
|
||||
User queryUserByToken(@Param("token") String token);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@ public class UserMapperProvider {
|
|||
VALUES("`phone`", "#{user.phone}");
|
||||
VALUES("`user_type`", EnumFieldUtil.genFieldStr("user.userType", UserType.class));
|
||||
VALUES("`tenant_id`", "#{user.tenantId}");
|
||||
VALUES("`queue`", "#{user.queue}");
|
||||
VALUES("`create_time`", "#{user.createTime}");
|
||||
VALUES("`update_time`", "#{user.updateTime}");
|
||||
}
|
||||
|
|
@ -86,6 +87,7 @@ public class UserMapperProvider {
|
|||
SET("`phone`=#{user.phone}");
|
||||
SET("`user_type`="+EnumFieldUtil.genFieldStr("user.userType", UserType.class));
|
||||
SET("`tenant_id`=#{user.tenantId}");
|
||||
SET("`queue`=#{user.queue}");
|
||||
SET("`create_time`=#{user.createTime}");
|
||||
SET("`update_time`=#{user.updateTime}");
|
||||
|
||||
|
|
@ -247,4 +249,36 @@ public class UserMapperProvider {
|
|||
}.toString();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* query tenant code by user id
|
||||
* @param parameter
|
||||
* @return
|
||||
*/
|
||||
public String queryQueueByProcessInstanceId(Map<String, Object> parameter) {
|
||||
return new SQL() {
|
||||
{
|
||||
SELECT("queue");
|
||||
FROM(TABLE_NAME + " u,t_escheduler_process_instance p");
|
||||
WHERE("u.id = p.executor_id and p.id=#{processInstanceId}");
|
||||
}
|
||||
}.toString();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* query user by id
|
||||
* @param parameter
|
||||
* @return
|
||||
*/
|
||||
public String queryUserByToken(Map<String, Object> parameter) {
|
||||
return new SQL() {
|
||||
{
|
||||
SELECT("u.*");
|
||||
FROM(TABLE_NAME + " u ,t_escheduler_access_token t");
|
||||
WHERE(" u.id = t.user_id and token=#{token} and t.expire_time > NOW()");
|
||||
}
|
||||
}.toString();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,131 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package cn.escheduler.dao.mapper;
|
||||
|
||||
import cn.escheduler.dao.model.WorkerGroup;
|
||||
import org.apache.ibatis.annotations.*;
|
||||
import org.apache.ibatis.type.JdbcType;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* worker group mapper
|
||||
*/
|
||||
public interface WorkerGroupMapper {
|
||||
|
||||
/**
|
||||
* query all worker group list
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Results(value = {
|
||||
@Result(property = "id", column = "id", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "ipList", column = "ip_list", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "name", column = "name", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "createTime", column = "create_time", javaType = Date.class, jdbcType = JdbcType.TIMESTAMP),
|
||||
@Result(property = "updateTime", column = "update_time", javaType = Date.class, jdbcType = JdbcType.TIMESTAMP),
|
||||
})
|
||||
@SelectProvider(type = WorkerGroupMapperProvider.class, method = "queryAllWorkerGroup")
|
||||
List<WorkerGroup> queryAllWorkerGroup();
|
||||
|
||||
/**
|
||||
* query worker group by name
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Results(value = {
|
||||
@Result(property = "id", column = "id", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "ipList", column = "ip_list", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "name", column = "name", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "createTime", column = "create_time", javaType = Date.class, jdbcType = JdbcType.TIMESTAMP),
|
||||
@Result(property = "updateTime", column = "update_time", javaType = Date.class, jdbcType = JdbcType.TIMESTAMP),
|
||||
})
|
||||
@SelectProvider(type = WorkerGroupMapperProvider.class, method = "queryWorkerGroupByName")
|
||||
List<WorkerGroup> queryWorkerGroupByName(@Param("name") String name);
|
||||
|
||||
/**
|
||||
* query worker group paging by search value
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Results(value = {
|
||||
@Result(property = "id", column = "id", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "ipList", column = "ip_list", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "name", column = "name", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "createTime", column = "create_time", javaType = Date.class, jdbcType = JdbcType.TIMESTAMP),
|
||||
@Result(property = "updateTime", column = "update_time", javaType = Date.class, jdbcType = JdbcType.TIMESTAMP),
|
||||
})
|
||||
@SelectProvider(type = WorkerGroupMapperProvider.class, method = "queryListPaging")
|
||||
List<WorkerGroup> queryListPaging(@Param("offset") int offset,
|
||||
@Param("pageSize") int pageSize,
|
||||
@Param("searchVal") String searchVal);
|
||||
|
||||
/**
|
||||
* count worker group by search value
|
||||
* @param searchVal
|
||||
* @return
|
||||
*/
|
||||
@SelectProvider(type = WorkerGroupMapperProvider.class, method = "countPaging")
|
||||
int countPaging(@Param("searchVal") String searchVal);
|
||||
|
||||
/**
|
||||
* insert worker server
|
||||
*
|
||||
* @param workerGroup
|
||||
* @return
|
||||
*/
|
||||
@InsertProvider(type = WorkerGroupMapperProvider.class, method = "insert")
|
||||
@Options(useGeneratedKeys = true,keyProperty = "workerGroup.id")
|
||||
@SelectKey(statement = "SELECT LAST_INSERT_ID()", keyProperty = "workerGroup.id", before = false, resultType = int.class)
|
||||
int insert(@Param("workerGroup") WorkerGroup workerGroup);
|
||||
|
||||
/**
|
||||
* update worker
|
||||
*
|
||||
* @param workerGroup
|
||||
* @return
|
||||
*/
|
||||
@UpdateProvider(type = WorkerGroupMapperProvider.class, method = "update")
|
||||
int update(@Param("workerGroup") WorkerGroup workerGroup);
|
||||
|
||||
/**
|
||||
* delete work group by id
|
||||
* @param id
|
||||
* @return
|
||||
*/
|
||||
@DeleteProvider(type = WorkerGroupMapperProvider.class, method = "deleteById")
|
||||
int deleteById(@Param("id") int id);
|
||||
|
||||
/**
|
||||
* query work group by id
|
||||
* @param id
|
||||
* @return
|
||||
*/
|
||||
@Results(value = {
|
||||
@Result(property = "id", column = "id", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
|
||||
@Result(property = "ipList", column = "ip_list", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "name", column = "name", javaType = String.class, jdbcType = JdbcType.VARCHAR),
|
||||
@Result(property = "createTime", column = "create_time", javaType = Date.class, jdbcType = JdbcType.TIMESTAMP),
|
||||
@Result(property = "updateTime", column = "update_time", javaType = Date.class, jdbcType = JdbcType.TIMESTAMP),
|
||||
})
|
||||
@SelectProvider(type = WorkerGroupMapperProvider.class, method = "queryById")
|
||||
WorkerGroup queryById(@Param("id") int id);
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,160 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package cn.escheduler.dao.mapper;
|
||||
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.ibatis.jdbc.SQL;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* worker group mapper provider
|
||||
*/
|
||||
public class WorkerGroupMapperProvider {
|
||||
|
||||
private static final String TABLE_NAME = "t_escheduler_worker_group";
|
||||
|
||||
/**
|
||||
* query worker list
|
||||
* @return
|
||||
*/
|
||||
public String queryAllWorkerGroup() {
|
||||
return new SQL() {{
|
||||
SELECT("*");
|
||||
|
||||
FROM(TABLE_NAME);
|
||||
|
||||
ORDER_BY("update_time desc");
|
||||
}}.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* insert worker server
|
||||
* @param parameter
|
||||
* @return
|
||||
*/
|
||||
public String insert(Map<String, Object> parameter) {
|
||||
return new SQL() {{
|
||||
INSERT_INTO(TABLE_NAME);
|
||||
|
||||
VALUES("id", "#{workerGroup.id}");
|
||||
VALUES("name", "#{workerGroup.name}");
|
||||
VALUES("ip_list", "#{workerGroup.ipList}");
|
||||
VALUES("create_time", "#{workerGroup.createTime}");
|
||||
VALUES("update_time", "#{workerGroup.updateTime}");
|
||||
}}.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* update worker group
|
||||
*
|
||||
* @param parameter
|
||||
* @return
|
||||
*/
|
||||
public String update(Map<String, Object> parameter) {
|
||||
return new SQL() {{
|
||||
UPDATE(TABLE_NAME);
|
||||
|
||||
SET("name = #{workerGroup.name}");
|
||||
SET("ip_list = #{workerGroup.ipList}");
|
||||
SET("create_time = #{workerGroup.createTime}");
|
||||
SET("update_time = #{workerGroup.updateTime}");
|
||||
|
||||
WHERE("id = #{workerGroup.id}");
|
||||
}}.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* delete worker group by id
|
||||
* @param parameter
|
||||
* @return
|
||||
*/
|
||||
public String deleteById(Map<String, Object> parameter) {
|
||||
return new SQL() {{
|
||||
DELETE_FROM(TABLE_NAME);
|
||||
|
||||
WHERE("id = #{id}");
|
||||
}}.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* query worker group by name
|
||||
* @param parameter
|
||||
* @return
|
||||
*/
|
||||
public String queryWorkerGroupByName(Map<String, Object> parameter) {
|
||||
return new SQL() {{
|
||||
|
||||
SELECT("*");
|
||||
FROM(TABLE_NAME);
|
||||
|
||||
WHERE("name = #{name}");
|
||||
}}.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* query worker group by id
|
||||
* @param parameter
|
||||
* @return
|
||||
*/
|
||||
public String queryById(Map<String, Object> parameter) {
|
||||
return new SQL() {{
|
||||
|
||||
SELECT("*");
|
||||
FROM(TABLE_NAME);
|
||||
|
||||
WHERE("id = #{id}");
|
||||
}}.toString();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* query worker group by id
|
||||
* @param parameter
|
||||
* @return
|
||||
*/
|
||||
public String queryListPaging(Map<String, Object> parameter) {
|
||||
return new SQL() {{
|
||||
|
||||
SELECT("*");
|
||||
FROM(TABLE_NAME);
|
||||
|
||||
Object searchVal = parameter.get("searchVal");
|
||||
if(searchVal != null && StringUtils.isNotEmpty(searchVal.toString())){
|
||||
WHERE( " name like concat('%', #{searchVal}, '%') ");
|
||||
}
|
||||
ORDER_BY(" update_time desc limit #{offset},#{pageSize} ");
|
||||
}}.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* count worker group number by search value
|
||||
* @param parameter
|
||||
* @return
|
||||
*/
|
||||
public String countPaging(Map<String, Object> parameter) {
|
||||
return new SQL() {{
|
||||
SELECT("count(0)");
|
||||
FROM(TABLE_NAME);
|
||||
Object searchVal = parameter.get("searchVal");
|
||||
if(searchVal != null && StringUtils.isNotEmpty(searchVal.toString())){
|
||||
WHERE( " name like concat('%', #{searchVal}, '%') ");
|
||||
}
|
||||
}}.toString();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,126 @@
|
|||
package cn.escheduler.dao.model;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
public class AccessToken {
|
||||
|
||||
/**
|
||||
* id
|
||||
*/
|
||||
private int id;
|
||||
|
||||
/**
|
||||
* user id
|
||||
*/
|
||||
private int userId;
|
||||
|
||||
/**
|
||||
* user name
|
||||
*/
|
||||
private String userName;
|
||||
|
||||
/**
|
||||
* user token
|
||||
*/
|
||||
private String token;
|
||||
|
||||
/**
|
||||
* token expire time
|
||||
*/
|
||||
private Date expireTime;
|
||||
|
||||
/**
|
||||
* create time
|
||||
*/
|
||||
private Date createTime;
|
||||
|
||||
/**
|
||||
* update time
|
||||
*/
|
||||
private Date updateTime;
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public int getUserId() {
|
||||
return userId;
|
||||
}
|
||||
|
||||
public void setUserId(int userId) {
|
||||
this.userId = userId;
|
||||
}
|
||||
|
||||
public String getToken() {
|
||||
return token;
|
||||
}
|
||||
|
||||
public void setToken(String token) {
|
||||
this.token = token;
|
||||
}
|
||||
|
||||
public Date getExpireTime() {
|
||||
return expireTime;
|
||||
}
|
||||
|
||||
public void setExpireTime(Date expireTime) {
|
||||
this.expireTime = expireTime;
|
||||
}
|
||||
|
||||
public Date getCreateTime() {
|
||||
return createTime;
|
||||
}
|
||||
|
||||
public void setCreateTime(Date createTime) {
|
||||
this.createTime = createTime;
|
||||
}
|
||||
|
||||
public Date getUpdateTime() {
|
||||
return updateTime;
|
||||
}
|
||||
|
||||
public void setUpdateTime(Date updateTime) {
|
||||
this.updateTime = updateTime;
|
||||
}
|
||||
|
||||
public String getUserName() {
|
||||
return userName;
|
||||
}
|
||||
|
||||
public void setUserName(String userName) {
|
||||
this.userName = userName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "AccessToken{" +
|
||||
"id=" + id +
|
||||
", userId=" + userId +
|
||||
", userName='" + userName + '\'' +
|
||||
", token='" + token + '\'' +
|
||||
", expireTime=" + expireTime +
|
||||
", createTime=" + createTime +
|
||||
", updateTime=" + updateTime +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
|
@ -91,6 +91,12 @@ public class Command {
|
|||
private Date updateTime;
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private int workerGroupId;
|
||||
|
||||
|
||||
public Command(){
|
||||
this.taskDependType = TaskDependType.TASK_POST;
|
||||
this.failureStrategy = FailureStrategy.CONTINUE;
|
||||
|
|
@ -229,6 +235,15 @@ public class Command {
|
|||
this.updateTime = updateTime;
|
||||
}
|
||||
|
||||
|
||||
public int getWorkerGroupId() {
|
||||
return workerGroupId;
|
||||
}
|
||||
|
||||
public void setWorkerGroupId(int workerGroupId) {
|
||||
this.workerGroupId = workerGroupId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Command{" +
|
||||
|
|
@ -245,6 +260,7 @@ public class Command {
|
|||
", startTime=" + startTime +
|
||||
", processInstancePriority=" + processInstancePriority +
|
||||
", updateTime=" + updateTime +
|
||||
", workerGroupId=" + workerGroupId +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,290 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package cn.escheduler.dao.model;
|
||||
|
||||
import cn.escheduler.common.enums.*;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* command
|
||||
*/
|
||||
public class ErrorCommand {
|
||||
|
||||
/**
|
||||
* id
|
||||
*/
|
||||
private int id;
|
||||
|
||||
/**
|
||||
* command type
|
||||
*/
|
||||
private CommandType commandType;
|
||||
|
||||
/**
|
||||
* process definition id
|
||||
*/
|
||||
private int processDefinitionId;
|
||||
|
||||
/**
|
||||
* executor id
|
||||
*/
|
||||
private int executorId;
|
||||
|
||||
/**
|
||||
* command parameter, format json
|
||||
*/
|
||||
private String commandParam;
|
||||
|
||||
/**
|
||||
* task depend type
|
||||
*/
|
||||
private TaskDependType taskDependType;
|
||||
|
||||
/**
|
||||
* failure strategy
|
||||
*/
|
||||
private FailureStrategy failureStrategy;
|
||||
|
||||
/**
|
||||
* warning type
|
||||
*/
|
||||
private WarningType warningType;
|
||||
|
||||
/**
|
||||
* warning group id
|
||||
*/
|
||||
private Integer warningGroupId;
|
||||
|
||||
/**
|
||||
* schedule time
|
||||
*/
|
||||
private Date scheduleTime;
|
||||
|
||||
/**
|
||||
* start time
|
||||
*/
|
||||
private Date startTime;
|
||||
|
||||
/**
|
||||
* process instance priority
|
||||
*/
|
||||
private Priority processInstancePriority;
|
||||
|
||||
/**
|
||||
* update time
|
||||
*/
|
||||
private Date updateTime;
|
||||
|
||||
/**
|
||||
* 执行信息
|
||||
*/
|
||||
private String message;
|
||||
|
||||
/**
|
||||
* worker group id
|
||||
*/
|
||||
private int workerGroupId;
|
||||
|
||||
|
||||
public ErrorCommand(Command command, String message){
|
||||
this.commandType = command.getCommandType();
|
||||
this.executorId = command.getExecutorId();
|
||||
this.processDefinitionId = command.getProcessDefinitionId();
|
||||
this.commandParam = command.getCommandParam();
|
||||
this.warningType = command.getWarningType();
|
||||
this.warningGroupId = command.getWarningGroupId();
|
||||
this.scheduleTime = command.getScheduleTime();
|
||||
this.taskDependType = command.getTaskDependType();
|
||||
this.failureStrategy = command.getFailureStrategy();
|
||||
this.startTime = command.getStartTime();
|
||||
this.updateTime = command.getUpdateTime();
|
||||
this.processInstancePriority = command.getProcessInstancePriority();
|
||||
this.message = message;
|
||||
}
|
||||
|
||||
public ErrorCommand(
|
||||
CommandType commandType,
|
||||
TaskDependType taskDependType,
|
||||
FailureStrategy failureStrategy,
|
||||
int executorId,
|
||||
int processDefinitionId,
|
||||
String commandParam,
|
||||
WarningType warningType,
|
||||
int warningGroupId,
|
||||
Date scheduleTime,
|
||||
Priority processInstancePriority,
|
||||
String message){
|
||||
this.commandType = commandType;
|
||||
this.executorId = executorId;
|
||||
this.processDefinitionId = processDefinitionId;
|
||||
this.commandParam = commandParam;
|
||||
this.warningType = warningType;
|
||||
this.warningGroupId = warningGroupId;
|
||||
this.scheduleTime = scheduleTime;
|
||||
this.taskDependType = taskDependType;
|
||||
this.failureStrategy = failureStrategy;
|
||||
this.startTime = new Date();
|
||||
this.updateTime = new Date();
|
||||
this.processInstancePriority = processInstancePriority;
|
||||
this.message = message;
|
||||
}
|
||||
|
||||
|
||||
public TaskDependType getTaskDependType() {
|
||||
return taskDependType;
|
||||
}
|
||||
|
||||
public void setTaskDependType(TaskDependType taskDependType) {
|
||||
this.taskDependType = taskDependType;
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public CommandType getCommandType() {
|
||||
return commandType;
|
||||
}
|
||||
|
||||
public void setCommandType(CommandType commandType) {
|
||||
this.commandType = commandType;
|
||||
}
|
||||
|
||||
public int getProcessDefinitionId() {
|
||||
return processDefinitionId;
|
||||
}
|
||||
|
||||
public void setProcessDefinitionId(int processDefinitionId) {
|
||||
this.processDefinitionId = processDefinitionId;
|
||||
}
|
||||
|
||||
|
||||
public FailureStrategy getFailureStrategy() {
|
||||
return failureStrategy;
|
||||
}
|
||||
|
||||
public void setFailureStrategy(FailureStrategy failureStrategy) {
|
||||
this.failureStrategy = failureStrategy;
|
||||
}
|
||||
|
||||
public void setCommandParam(String commandParam) {
|
||||
this.commandParam = commandParam;
|
||||
}
|
||||
|
||||
public String getCommandParam() {
|
||||
return commandParam;
|
||||
}
|
||||
|
||||
public WarningType getWarningType() {
|
||||
return warningType;
|
||||
}
|
||||
|
||||
public void setWarningType(WarningType warningType) {
|
||||
this.warningType = warningType;
|
||||
}
|
||||
|
||||
public Integer getWarningGroupId() {
|
||||
return warningGroupId;
|
||||
}
|
||||
|
||||
public void setWarningGroupId(Integer warningGroupId) {
|
||||
this.warningGroupId = warningGroupId;
|
||||
}
|
||||
|
||||
public Date getScheduleTime() {
|
||||
return scheduleTime;
|
||||
}
|
||||
|
||||
public void setScheduleTime(Date scheduleTime) {
|
||||
this.scheduleTime = scheduleTime;
|
||||
}
|
||||
|
||||
public Date getStartTime() {
|
||||
return startTime;
|
||||
}
|
||||
|
||||
public void setStartTime(Date startTime) {
|
||||
this.startTime = startTime;
|
||||
}
|
||||
|
||||
public int getExecutorId() {
|
||||
return executorId;
|
||||
}
|
||||
|
||||
public void setExecutorId(int executorId) {
|
||||
this.executorId = executorId;
|
||||
}
|
||||
|
||||
public Priority getProcessInstancePriority() {
|
||||
return processInstancePriority;
|
||||
}
|
||||
|
||||
public void setProcessInstancePriority(Priority processInstancePriority) {
|
||||
this.processInstancePriority = processInstancePriority;
|
||||
}
|
||||
|
||||
public Date getUpdateTime() {
|
||||
return updateTime;
|
||||
}
|
||||
|
||||
public void setUpdateTime(Date updateTime) {
|
||||
this.updateTime = updateTime;
|
||||
}
|
||||
|
||||
public int getWorkerGroupId() {
|
||||
return workerGroupId;
|
||||
}
|
||||
|
||||
public void setWorkerGroupId(int workerGroupId) {
|
||||
this.workerGroupId = workerGroupId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Command{" +
|
||||
"id=" + id +
|
||||
", commandType=" + commandType +
|
||||
", processDefinitionId=" + processDefinitionId +
|
||||
", executorId=" + executorId +
|
||||
", commandParam='" + commandParam + '\'' +
|
||||
", taskDependType=" + taskDependType +
|
||||
", failureStrategy=" + failureStrategy +
|
||||
", warningType=" + warningType +
|
||||
", warningGroupId=" + warningGroupId +
|
||||
", scheduleTime=" + scheduleTime +
|
||||
", startTime=" + startTime +
|
||||
", processInstancePriority=" + processInstancePriority +
|
||||
", updateTime=" + updateTime +
|
||||
", message=" + message +
|
||||
'}';
|
||||
}
|
||||
|
||||
public String getMessage() {
|
||||
return message;
|
||||
}
|
||||
|
||||
public void setMessage(String message) {
|
||||
this.message = message;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -50,4 +50,12 @@ public class ExecuteStatusCount {
|
|||
public void setCount(int count) {
|
||||
this.count = count;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "ExecuteStatusCount{" +
|
||||
"state=" + state +
|
||||
", count=" + count +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,115 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package cn.escheduler.dao.model;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* monitor record for database
|
||||
*/
|
||||
public class MonitorRecord {
|
||||
|
||||
/**
|
||||
* is normal or not , 1: normal
|
||||
*/
|
||||
private int state;
|
||||
|
||||
/**
|
||||
* max connections
|
||||
*/
|
||||
private long maxConnections;
|
||||
|
||||
/**
|
||||
* max used connections
|
||||
*/
|
||||
private long maxUsedConnections;
|
||||
|
||||
/**
|
||||
* threads connections
|
||||
*/
|
||||
private long threadsConnections;
|
||||
|
||||
/**
|
||||
* threads running connections
|
||||
*/
|
||||
private long threadsRunningConnections;
|
||||
|
||||
/**
|
||||
* start date
|
||||
*/
|
||||
private Date date;
|
||||
|
||||
public int getState() {
|
||||
return state;
|
||||
}
|
||||
|
||||
public void setState(int state) {
|
||||
this.state = state;
|
||||
}
|
||||
|
||||
public long getMaxConnections() {
|
||||
return maxConnections;
|
||||
}
|
||||
|
||||
public void setMaxConnections(long maxConnections) {
|
||||
this.maxConnections = maxConnections;
|
||||
}
|
||||
|
||||
public long getMaxUsedConnections() {
|
||||
return maxUsedConnections;
|
||||
}
|
||||
|
||||
public void setMaxUsedConnections(long maxUsedConnections) {
|
||||
this.maxUsedConnections = maxUsedConnections;
|
||||
}
|
||||
|
||||
public long getThreadsConnections() {
|
||||
return threadsConnections;
|
||||
}
|
||||
|
||||
public void setThreadsConnections(long threadsConnections) {
|
||||
this.threadsConnections = threadsConnections;
|
||||
}
|
||||
|
||||
public long getThreadsRunningConnections() {
|
||||
return threadsRunningConnections;
|
||||
}
|
||||
|
||||
public void setThreadsRunningConnections(long threadsRunningConnections) {
|
||||
this.threadsRunningConnections = threadsRunningConnections;
|
||||
}
|
||||
|
||||
public Date getDate() {
|
||||
return date;
|
||||
}
|
||||
|
||||
public void setDate(Date date) {
|
||||
this.date = date;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "MonitorRecord{" +
|
||||
"state=" + state +
|
||||
", maxConnections=" + maxConnections +
|
||||
", maxUsedConnections=" + maxUsedConnections +
|
||||
", threadsConnections=" + threadsConnections +
|
||||
", threadsRunningConnections=" + threadsRunningConnections +
|
||||
", date=" + date +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
|
@ -37,6 +37,9 @@ public class ProcessData {
|
|||
private List<Property> globalParams;
|
||||
|
||||
|
||||
private int timeout;
|
||||
|
||||
|
||||
public ProcessData() {
|
||||
}
|
||||
|
||||
|
|
@ -82,4 +85,11 @@ public class ProcessData {
|
|||
this.globalParams = globalParams;
|
||||
}
|
||||
|
||||
public int getTimeout() {
|
||||
return timeout;
|
||||
}
|
||||
|
||||
public void setTimeout(int timeout) {
|
||||
this.timeout = timeout;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -136,6 +136,11 @@ public class ProcessDefinition {
|
|||
*/
|
||||
private ReleaseState scheduleReleaseState;
|
||||
|
||||
/**
|
||||
* process warning time out. unit: minute
|
||||
*/
|
||||
private int timeout;
|
||||
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
|
|
@ -316,6 +321,14 @@ public class ProcessDefinition {
|
|||
this.scheduleReleaseState = scheduleReleaseState;
|
||||
}
|
||||
|
||||
public int getTimeout() {
|
||||
return timeout;
|
||||
}
|
||||
|
||||
public void setTimeout(int timeout) {
|
||||
this.timeout = timeout;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "ProcessDefinition{" +
|
||||
|
|
@ -340,6 +353,8 @@ public class ProcessDefinition {
|
|||
", receivers='" + receivers + '\'' +
|
||||
", receiversCc='" + receiversCc + '\'' +
|
||||
", scheduleReleaseState=" + scheduleReleaseState +
|
||||
", timeout=" + timeout +
|
||||
'}';
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -177,6 +177,17 @@ public class ProcessInstance {
|
|||
*/
|
||||
private Priority processInstancePriority;
|
||||
|
||||
|
||||
/**
|
||||
* worker group id
|
||||
*/
|
||||
private int workerGroupId;
|
||||
|
||||
/**
|
||||
* process timeout for warning
|
||||
*/
|
||||
private int timeout;
|
||||
|
||||
public ProcessInstance(){
|
||||
|
||||
}
|
||||
|
|
@ -481,6 +492,21 @@ public class ProcessInstance {
|
|||
this.duration = duration;
|
||||
}
|
||||
|
||||
public int getWorkerGroupId() {
|
||||
return workerGroupId;
|
||||
}
|
||||
|
||||
public void setWorkerGroupId(int workerGroupId) {
|
||||
this.workerGroupId = workerGroupId;
|
||||
}
|
||||
|
||||
public int getTimeout() {
|
||||
return timeout;
|
||||
}
|
||||
|
||||
public void setTimeout(int timeout) {
|
||||
this.timeout = timeout;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
|
|
@ -515,7 +541,9 @@ public class ProcessInstance {
|
|||
", historyCmd='" + historyCmd + '\'' +
|
||||
", dependenceScheduleTimes='" + dependenceScheduleTimes + '\'' +
|
||||
", duration=" + duration +
|
||||
", timeout=" + timeout +
|
||||
", processInstancePriority=" + processInstancePriority +
|
||||
'}';
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -111,6 +111,11 @@ public class Schedule {
|
|||
*/
|
||||
private Priority processInstancePriority;
|
||||
|
||||
/**
|
||||
* worker group id
|
||||
*/
|
||||
private int workerGroupId;
|
||||
|
||||
public int getWarningGroupId() {
|
||||
return warningGroupId;
|
||||
}
|
||||
|
|
@ -256,6 +261,15 @@ public class Schedule {
|
|||
this.processInstancePriority = processInstancePriority;
|
||||
}
|
||||
|
||||
|
||||
public int getWorkerGroupId() {
|
||||
return workerGroupId;
|
||||
}
|
||||
|
||||
public void setWorkerGroupId(int workerGroupId) {
|
||||
this.workerGroupId = workerGroupId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Schedule{" +
|
||||
|
|
@ -276,6 +290,8 @@ public class Schedule {
|
|||
", releaseState=" + releaseState +
|
||||
", warningGroupId=" + warningGroupId +
|
||||
", processInstancePriority=" + processInstancePriority +
|
||||
", workerGroupId=" + workerGroupId +
|
||||
'}';
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -182,6 +182,13 @@ public class TaskInstance {
|
|||
private String dependentResult;
|
||||
|
||||
|
||||
/**
|
||||
* worker group id
|
||||
* @return
|
||||
*/
|
||||
private int workerGroupId;
|
||||
|
||||
|
||||
public ProcessInstance getProcessInstance() {
|
||||
return processInstance;
|
||||
}
|
||||
|
|
@ -439,6 +446,14 @@ public class TaskInstance {
|
|||
this.processInstancePriority = processInstancePriority;
|
||||
}
|
||||
|
||||
public int getWorkerGroupId() {
|
||||
return workerGroupId;
|
||||
}
|
||||
|
||||
public void setWorkerGroupId(int workerGroupId) {
|
||||
this.workerGroupId = workerGroupId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "TaskInstance{" +
|
||||
|
|
@ -470,6 +485,7 @@ public class TaskInstance {
|
|||
", retryInterval=" + retryInterval +
|
||||
", taskInstancePriority=" + taskInstancePriority +
|
||||
", processInstancePriority=" + processInstancePriority +
|
||||
", workGroupId=" + workerGroupId +
|
||||
'}';
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -46,12 +46,12 @@ public class TaskRecord {
|
|||
/**
|
||||
* start date
|
||||
*/
|
||||
private Date startDate;
|
||||
private Date startTime;
|
||||
|
||||
/**
|
||||
* end date
|
||||
*/
|
||||
private Date endDate;
|
||||
private Date endTime;
|
||||
|
||||
/**
|
||||
* result
|
||||
|
|
@ -136,20 +136,20 @@ public class TaskRecord {
|
|||
this.procDate = procDate;
|
||||
}
|
||||
|
||||
public Date getStartDate() {
|
||||
return startDate;
|
||||
public Date getStartTime() {
|
||||
return startTime;
|
||||
}
|
||||
|
||||
public void setStartDate(Date startDate) {
|
||||
this.startDate = startDate;
|
||||
public void setStartTime(Date startTime) {
|
||||
this.startTime = startTime;
|
||||
}
|
||||
|
||||
public Date getEndDate() {
|
||||
return endDate;
|
||||
public Date getEndTime() {
|
||||
return endTime;
|
||||
}
|
||||
|
||||
public void setEndDate(Date endDate) {
|
||||
this.endDate = endDate;
|
||||
public void setEndTime(Date endTime) {
|
||||
this.endTime = endTime;
|
||||
}
|
||||
|
||||
public String getResult() {
|
||||
|
|
@ -238,8 +238,8 @@ public class TaskRecord {
|
|||
+" proc id:" + procId
|
||||
+ " proc name:" + procName
|
||||
+ " proc date: " + procDate
|
||||
+ " start date:" + startDate
|
||||
+ " end date:" + endDate
|
||||
+ " start date:" + startTime
|
||||
+ " end date:" + endTime
|
||||
+ " result : " + result
|
||||
+ " duration : " + duration
|
||||
+ " note : " + note
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue