Compare commits
10 Commits
4cd8636b7d
...
d438062486
Author | SHA1 | Date |
---|---|---|
aikai | d438062486 | |
xuxueli | 761de38a0b | |
xuxueli | c6a4df2a7b | |
xuxueli | 09d2a46245 | |
xuxueli | f160e067cd | |
许雪里 | 72963e4716 | |
xuxueli | 6effc8b98f | |
xuxueli | 0f867352fa | |
xuxueli | 9293c61ca0 | |
xuxueli | 730c1066b8 |
4
NOTICE
4
NOTICE
|
@ -17,12 +17,12 @@ Netty:
|
||||||
* HOMEPAGE:
|
* HOMEPAGE:
|
||||||
* https://github.com/netty/netty
|
* https://github.com/netty/netty
|
||||||
|
|
||||||
Hessian:
|
Mybatis:
|
||||||
|
|
||||||
* LICENSE:
|
* LICENSE:
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0 (Apache License 2.0)
|
* http://www.apache.org/licenses/LICENSE-2.0 (Apache License 2.0)
|
||||||
* HOMEPAGE:
|
* HOMEPAGE:
|
||||||
* http://hessian.caucho.com
|
* https://mybatis.org/mybatis-3/
|
||||||
|
|
||||||
SLF4J:
|
SLF4J:
|
||||||
|
|
||||||
|
|
39
README.md
39
README.md
|
@ -727,6 +727,45 @@ XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅
|
||||||
- 601、杭州海康机器人股份有限公司【海康】
|
- 601、杭州海康机器人股份有限公司【海康】
|
||||||
- 602、河南宸邦信息技术有限公司
|
- 602、河南宸邦信息技术有限公司
|
||||||
- 603、成都次元节点网络科技有限公司
|
- 603、成都次元节点网络科技有限公司
|
||||||
|
- 604、富士康科技集团【富士康】
|
||||||
|
- 605、青岛东软载波科技股份有限公司
|
||||||
|
- 606、小菊快跑科技有限公司
|
||||||
|
- 607、视源股份
|
||||||
|
- 608、宁波聚臻智能科技有限公司
|
||||||
|
- 609、阔天科技有限公司
|
||||||
|
- 610、网宿科技有限公司
|
||||||
|
- 611、南京梵鼎信息技术有限公司
|
||||||
|
- 612、房天下【房天下】
|
||||||
|
- 613、特瓦特能源科技有限公司
|
||||||
|
- 614、拓迪智能科技有限公司
|
||||||
|
- 615、东软集团【东软】
|
||||||
|
- 616、开普云
|
||||||
|
- 617、领课网络
|
||||||
|
- 618、南京特维软件有限公司
|
||||||
|
- 619、福建易联众保睿通信息科技有限公司
|
||||||
|
- 620、浙江核心同花顺金融科技有限公司【同花顺】
|
||||||
|
- 621、浙江博观瑞思科技有限公司
|
||||||
|
- 622、北京新美互通科技有限公司
|
||||||
|
- 623、北京有生博大软件股份有限公司
|
||||||
|
- 624、时代中国
|
||||||
|
- 625、鱼泡网
|
||||||
|
- 626、一粒方糖(安徽)科技有限公司
|
||||||
|
- 627、北京外研在线数字科技有限公司
|
||||||
|
- 628、德电(中国)通信技术有限公司
|
||||||
|
- 629、杭州寻联网络科技有限公司
|
||||||
|
- 630、橙联(中国)有限公司
|
||||||
|
- 631、北京承启通科技有限公司
|
||||||
|
- 632、银联数据服务有限公司【银联】
|
||||||
|
- 633、上海晶确科技有限公司
|
||||||
|
- 634、亚信科技有限公司
|
||||||
|
- 635、福建新航物联网科技有限公司
|
||||||
|
- 636、上扬软件
|
||||||
|
- 637、深蓝汽车科技有限公司
|
||||||
|
- 638、南昌节点汇智科技有限公司
|
||||||
|
- 639、锐明技术
|
||||||
|
- 640、再造再生健康科技有限公司
|
||||||
|
- 641、华宝证券
|
||||||
|
- 642、卓正医疗
|
||||||
- ……
|
- ……
|
||||||
|
|
||||||
> 更多接入的公司,欢迎在 [登记地址](https://github.com/xuxueli/xxl-job/issues/1 ) 登记,登记仅仅为了产品推广。
|
> 更多接入的公司,欢迎在 [登记地址](https://github.com/xuxueli/xxl-job/issues/1 ) 登记,登记仅仅为了产品推广。
|
||||||
|
|
|
@ -697,6 +697,45 @@ XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅
|
||||||
- 601、杭州海康机器人股份有限公司【海康】
|
- 601、杭州海康机器人股份有限公司【海康】
|
||||||
- 602、河南宸邦信息技术有限公司
|
- 602、河南宸邦信息技术有限公司
|
||||||
- 603、成都次元节点网络科技有限公司
|
- 603、成都次元节点网络科技有限公司
|
||||||
|
- 604、富士康科技集团【富士康】
|
||||||
|
- 605、青岛东软载波科技股份有限公司
|
||||||
|
- 606、小菊快跑科技有限公司
|
||||||
|
- 607、视源股份
|
||||||
|
- 608、宁波聚臻智能科技有限公司
|
||||||
|
- 609、阔天科技有限公司
|
||||||
|
- 610、网宿科技有限公司
|
||||||
|
- 611、南京梵鼎信息技术有限公司
|
||||||
|
- 612、房天下【房天下】
|
||||||
|
- 613、特瓦特能源科技有限公司
|
||||||
|
- 614、拓迪智能科技有限公司
|
||||||
|
- 615、东软集团【东软】
|
||||||
|
- 616、开普云
|
||||||
|
- 617、领课网络
|
||||||
|
- 618、南京特维软件有限公司
|
||||||
|
- 619、福建易联众保睿通信息科技有限公司
|
||||||
|
- 620、浙江核心同花顺金融科技有限公司【同花顺】
|
||||||
|
- 621、浙江博观瑞思科技有限公司
|
||||||
|
- 622、北京新美互通科技有限公司
|
||||||
|
- 623、北京有生博大软件股份有限公司
|
||||||
|
- 624、时代中国
|
||||||
|
- 625、鱼泡网
|
||||||
|
- 626、一粒方糖(安徽)科技有限公司
|
||||||
|
- 627、北京外研在线数字科技有限公司
|
||||||
|
- 628、德电(中国)通信技术有限公司
|
||||||
|
- 629、杭州寻联网络科技有限公司
|
||||||
|
- 630、橙联(中国)有限公司
|
||||||
|
- 631、北京承启通科技有限公司
|
||||||
|
- 632、银联数据服务有限公司【银联】
|
||||||
|
- 633、上海晶确科技有限公司
|
||||||
|
- 634、亚信科技有限公司
|
||||||
|
- 635、福建新航物联网科技有限公司
|
||||||
|
- 636、上扬软件
|
||||||
|
- 637、深蓝汽车科技有限公司
|
||||||
|
- 638、南昌节点汇智科技有限公司
|
||||||
|
- 639、锐明技术
|
||||||
|
- 640、再造再生健康科技有限公司
|
||||||
|
- 641、华宝证券
|
||||||
|
- 642、卓正医疗
|
||||||
- ……
|
- ……
|
||||||
|
|
||||||
> 更多接入的公司,欢迎在 [登记地址](https://github.com/xuxueli/xxl-job/issues/1 ) 登记,登记仅仅为了产品推广。
|
> 更多接入的公司,欢迎在 [登记地址](https://github.com/xuxueli/xxl-job/issues/1 ) 登记,登记仅仅为了产品推广。
|
||||||
|
@ -734,7 +773,7 @@ XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅
|
||||||
### 1.6 环境
|
### 1.6 环境
|
||||||
- Maven3+
|
- Maven3+
|
||||||
- Jdk1.8+
|
- Jdk1.8+
|
||||||
- Mysql5.7+
|
- Mysql8.0+
|
||||||
|
|
||||||
|
|
||||||
## 二、快速入门
|
## 二、快速入门
|
||||||
|
@ -1046,7 +1085,7 @@ Bean模式任务,支持基于方法的开发方式,每个任务对应一个
|
||||||
- 优点:
|
- 优点:
|
||||||
- 每个任务只需要开发一个方法,并添加"@XxlJob"注解即可,更加方便、快速。
|
- 每个任务只需要开发一个方法,并添加"@XxlJob"注解即可,更加方便、快速。
|
||||||
- 支持自动扫描任务并注入到执行器容器。
|
- 支持自动扫描任务并注入到执行器容器。
|
||||||
- 缺点:要求Spring容器环境;
|
- 缺点:略。
|
||||||
|
|
||||||
>基于方法开发的任务,底层会生成JobHandler代理,和基于类的方式一样,任务也会以JobHandler的形式存在于执行器任务容器中。
|
>基于方法开发的任务,底层会生成JobHandler代理,和基于类的方式一样,任务也会以JobHandler的形式存在于执行器任务容器中。
|
||||||
|
|
||||||
|
@ -2301,56 +2340,49 @@ public void execute() {
|
||||||
- 4、【优化】合并多项PR,项目代码结构、健壮性优化:PR-2833、PR-2812、PR-2541、PR-2537、PR-2514、PR-2509、PR-2591。
|
- 4、【优化】合并多项PR,项目代码结构、健壮性优化:PR-2833、PR-2812、PR-2541、PR-2537、PR-2514、PR-2509、PR-2591。
|
||||||
- 5、【优化】任务线程名优化,提升可读性与问题定位效率(ISSUE-2527)。
|
- 5、【优化】任务线程名优化,提升可读性与问题定位效率(ISSUE-2527)。
|
||||||
|
|
||||||
### 7.33 版本 v2.4.0 Release Notes[规划中]
|
### 7.33 版本 v2.4.0 Release Notes[2023-03-23]
|
||||||
- 1、【优化】执行器任务Bean扫描逻辑优化:解决懒加载注解失效问题。
|
- 1、【优化】执行器任务Bean扫描逻辑优化:解决懒加载注解失效问题。
|
||||||
- 2、【优化】[规划中]任务日志重构:一次调度只记录一条主任务,维护起止时间和状态。
|
- 2、【优化】多个项目依赖升级至较新稳定版本,涉及netty、groovy、spring、springboot、mybatis等;
|
||||||
|
- 3、【修复】"CVE-2022-36157" 授权漏洞修复。
|
||||||
|
- 4、【修复】"CVE-2022-43183" SSRF漏洞修复。
|
||||||
|
|
||||||
|
### 7.34 版本 v2.4.1 Release Notes[规划中]
|
||||||
|
- 1、【优化】多个项目依赖升级至较新稳定版本,涉及netty、groovy、springboot、mybatis等;
|
||||||
|
- 2、【修复】"CVE-2022-43402" groovy低版本漏洞修复。
|
||||||
|
- 3、【修复】调度日志页面XSS漏洞修复(ISSUE-3360)。
|
||||||
|
- 4、[规划中]注册节点,弹框分页展示;解决注册节点过多时无法展示问题;
|
||||||
|
|
||||||
|
|
||||||
|
### TODO LIST
|
||||||
|
- 1、调度隔离:调度中心针对不同执行器,各自维护不同的调度和远程触发组件。
|
||||||
|
- 2、任务优先级:调度与执行阶段按照优先级分配资源。
|
||||||
|
- 3、多数据库支持,DAO层通过JPA实现,不限制数据库类型。
|
||||||
|
- 4、执行器Log清理功能:调度中心Log删除时同步删除执行器中的Log文件;
|
||||||
|
- 5、性能优化:任务、执行器数据全量本地缓存;新增消息表广播通知;
|
||||||
|
- 6、DAG流程任务
|
||||||
|
- 子任务:废弃
|
||||||
|
- DAG任务创建、管理,DAG任务日志查看、操作;
|
||||||
|
- 支持参数传递,共享数据;
|
||||||
|
- 分片任务:全部完成后才会出发后置节点;
|
||||||
|
- 配置并列的"a-b、b-c"路径列表,构成串行、并行、dag任务流程,"dagre-d3"绘图;任务依赖,流程图,子任务+会签任务,各节点日志;支持根据成功、失败选择分支;
|
||||||
|
- 7、任务标签:方便搜索;
|
||||||
|
- 8、告警增强:
|
||||||
|
- 邮件告警:支持自定义标题、模板格式;
|
||||||
|
- webhook告警:支持自定义告警URL、请求体格式;
|
||||||
|
- 9、安全强化:AccessToken动态生成、动态启停;控制调度、回调;
|
||||||
|
- 10、任务导入导出工具,灵活支持版本升级、迁移等场景。
|
||||||
|
- 11、任务日志重构:一次调度只记录一条主任务,维护起止时间和状态。
|
||||||
- 普通任务:只记录一条主任务;
|
- 普通任务:只记录一条主任务;
|
||||||
- 广播任务:记录一条主任务,每个分片任务记录一条次任务,关联在主任务上;
|
- 广播任务:记录一条主任务,每个分片任务记录一条次任务,关联在主任务上;
|
||||||
- 重试任务:失败时,新增主任务。所有调度记录,包括入口调度和重试调度,均挂载主任务上。
|
- 重试任务:失败时,新增主任务。所有调度记录,包括入口调度和重试调度,均挂载主任务上。
|
||||||
- 3、【优化】[规划中]分片任务:全部完成后才会出发后置节点;
|
- 12、分片任务:全部完成后才会出发后置节点;
|
||||||
|
|
||||||
### 7.34 新版本规划 [规划中]
|
|
||||||
- 1、[规划中]DAG流程任务
|
|
||||||
- DAG任务:支持参数传递,共享数据:DAG任务创建、管理,DAG任务日志查看、操作;
|
|
||||||
- 子任务:废弃
|
|
||||||
- 2、[规划中]多数据库支持,DAO层通过JPA实现,不限制数据库类型;
|
|
||||||
- 3、[规划中]告警增强:邮件告警 + webhook告警;
|
|
||||||
- 4、[规划中]安全强化:AccessToken动态生成、动态启停;控制调度、回调;
|
|
||||||
- 5、[规划中]任务导入导出工具,灵活支持版本升级、迁移等场景。
|
|
||||||
|
|
||||||
### TODO LIST
|
|
||||||
- 1、任务分片路由:分片采用一致性Hash算法计算出尽量稳定的分片顺序,即使注册机器存在波动也不会引起分批分片顺序大的波动;目前采用IP自然排序,可以满足需求,待定;
|
|
||||||
- 2、调度隔离:调度中心针对不同执行器,各自维护不同的调度和远程触发组件。
|
|
||||||
- 3、调度任务优先级;
|
|
||||||
- 4、多数据库支持,DAO层通过JPA实现,不限制数据库类型;
|
|
||||||
- 5、执行器Log清理功能:调度中心Log删除时同步删除执行器中的Log文件;
|
|
||||||
- 6、延时任务:API触发,支持"动态传参、延时消费";该功能与 XXL-MQ 冲突,该场景建议用后者;
|
|
||||||
- 7、调度线程池改为协程方式实现,大幅降低系统内存消耗;
|
|
||||||
- 8、任务、执行器数据全量本地缓存;新增消息表广播通知;
|
|
||||||
- 9、忙碌转移优化,全部机器忙碌时不再直接失败;
|
|
||||||
- 10、任务触发参数优化:支持选择 "Cron触发"、"固定间隔时间触发"、"指定时间点触发"、"不选择" 等;
|
|
||||||
- 11、调度日志列表加上执行时长列,并支持排序;
|
|
||||||
- 12、DAG流程任务:
|
|
||||||
- 替换子任务,支持参数传递,共享数据:
|
|
||||||
- 配置并列的"a-b、b-c"路径列表,构成串行、并行、dag任务流程,"dagre-d3"绘图;任务依赖,流程图,子任务+会签任务,各节点日志;支持根据成功、失败选择分支;
|
|
||||||
- 分片任务:全部完成后才会出发后置节点;
|
|
||||||
- 13、日期过滤:支持多个时间段排除;
|
- 13、日期过滤:支持多个时间段排除;
|
||||||
- 14、告警增强:
|
- 13、GLUE 模式 Web Ide 版本对比功能;
|
||||||
- 邮件告警:支持自定义标题、模板格式;
|
- 14、提供执行器Docker镜像;
|
||||||
- webhook告警:支持自定义告警URL、请求体格式;
|
- 15、脚本任务,支持数据参数,新版本仅支持单参数不支持需要兼容;
|
||||||
- 15、新增任务运行模式 "GLUE模式(GO) ",支持GO任务;
|
- 17、批量调度:调度请求入queue,调度线程批量获取调度请求并发起远程调度;提高线程效率;
|
||||||
- 16、GLUE 模式 Web Ide 版本对比功能;
|
- 18、执行器端口复用,复用容器端口提供通讯服务;
|
||||||
- 17、注册中心优化,实时性注册发现:心跳注册间隔10s,refresh失败则首次注册并立即更新注册信息,心跳类似;30s过期销毁;
|
- 19、自定义失败重试时间间隔;
|
||||||
- 18、提供执行器Docker镜像;
|
|
||||||
- 19、脚本任务,支持数据参数,新版本仅支持单参数不支持需要兼容;
|
|
||||||
- 20、批量调度:调度请求入queue,调度线程批量获取调度请求并发起远程调度;提高线程效率;
|
|
||||||
- 21、执行器端口复用,复用容器端口提供通讯服务;
|
|
||||||
- 22、分片任务全部成功后触发子任务;
|
|
||||||
- 23、新增执行器描述属性;任务名称属性;
|
|
||||||
- 24、自定义失败重试时间间隔;
|
|
||||||
- 25、任务标签:方便搜索;
|
|
||||||
- 26、执行器:dag执行器,不需要注册机器;
|
|
||||||
|
|
||||||
|
|
||||||
## 八、其他
|
## 八、其他
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#
|
#
|
||||||
# XXL-JOB v2.4.0-SNAPSHOT
|
# XXL-JOB v2.4.1-SNAPSHOT
|
||||||
# Copyright (c) 2015-present, xuxueli.
|
# Copyright (c) 2015-present, xuxueli.
|
||||||
|
|
||||||
CREATE database if NOT EXISTS `xxl_job` default character set utf8mb4 collate utf8mb4_unicode_ci;
|
CREATE database if NOT EXISTS `xxl_job` default character set utf8mb4 collate utf8mb4_unicode_ci;
|
||||||
|
|
24
pom.xml
24
pom.xml
|
@ -3,7 +3,7 @@
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>com.xuxueli</groupId>
|
<groupId>com.xuxueli</groupId>
|
||||||
<artifactId>xxl-job</artifactId>
|
<artifactId>xxl-job</artifactId>
|
||||||
<version>2.4.0-SNAPSHOT</version>
|
<version>2.4.1-SNAPSHOT</version>
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
|
|
||||||
<name>${project.artifactId}</name>
|
<name>${project.artifactId}</name>
|
||||||
|
@ -24,24 +24,24 @@
|
||||||
<maven.compiler.target>1.8</maven.compiler.target>
|
<maven.compiler.target>1.8</maven.compiler.target>
|
||||||
<maven.test.skip>true</maven.test.skip>
|
<maven.test.skip>true</maven.test.skip>
|
||||||
|
|
||||||
<netty.version>4.1.90.Final</netty.version>
|
<netty.version>4.1.106.Final</netty.version>
|
||||||
<gson.version>2.10.1</gson.version>
|
<gson.version>2.10.1</gson.version>
|
||||||
|
|
||||||
<spring.version>5.3.26</spring.version>
|
<spring.version>5.3.31</spring.version>
|
||||||
<spring-boot.version>2.7.9</spring-boot.version>
|
<spring-boot.version>2.7.18</spring-boot.version>
|
||||||
|
|
||||||
<mybatis-spring-boot-starter.version>2.3.0</mybatis-spring-boot-starter.version>
|
<mybatis-spring-boot-starter.version>2.3.2</mybatis-spring-boot-starter.version>
|
||||||
<mysql-connector-j.version>8.0.32</mysql-connector-j.version>
|
<mysql-connector-j.version>8.3.0</mysql-connector-j.version>
|
||||||
|
|
||||||
<slf4j-api.version>1.7.36</slf4j-api.version>
|
<slf4j-api.version>2.0.11</slf4j-api.version>
|
||||||
<junit-jupiter.version>5.9.2</junit-jupiter.version>
|
<junit-jupiter.version>5.10.1</junit-jupiter.version>
|
||||||
<javax.annotation-api.version>1.3.2</javax.annotation-api.version>
|
<javax.annotation-api.version>1.3.2</javax.annotation-api.version>
|
||||||
|
|
||||||
<groovy.version>4.0.10</groovy.version>
|
<groovy.version>4.0.18</groovy.version>
|
||||||
|
|
||||||
<maven-source-plugin.version>3.2.1</maven-source-plugin.version>
|
<maven-source-plugin.version>3.3.0</maven-source-plugin.version>
|
||||||
<maven-javadoc-plugin.version>3.5.0</maven-javadoc-plugin.version>
|
<maven-javadoc-plugin.version>3.6.3</maven-javadoc-plugin.version>
|
||||||
<maven-gpg-plugin.version>3.0.1</maven-gpg-plugin.version>
|
<maven-gpg-plugin.version>3.1.0</maven-gpg-plugin.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>com.xuxueli</groupId>
|
<groupId>com.xuxueli</groupId>
|
||||||
<artifactId>xxl-job</artifactId>
|
<artifactId>xxl-job</artifactId>
|
||||||
<version>2.4.0-SNAPSHOT</version>
|
<version>2.4.1-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
<artifactId>xxl-job-admin</artifactId>
|
<artifactId>xxl-job-admin</artifactId>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package com.xxl.job.admin.controller;
|
package com.xxl.job.admin.controller;
|
||||||
|
|
||||||
|
import com.xxl.job.admin.controller.annotation.PermissionLimit;
|
||||||
import com.xxl.job.admin.core.model.XxlJobGroup;
|
import com.xxl.job.admin.core.model.XxlJobGroup;
|
||||||
import com.xxl.job.admin.core.model.XxlJobRegistry;
|
import com.xxl.job.admin.core.model.XxlJobRegistry;
|
||||||
import com.xxl.job.admin.core.util.I18nUtil;
|
import com.xxl.job.admin.core.util.I18nUtil;
|
||||||
|
@ -34,12 +35,14 @@ public class JobGroupController {
|
||||||
private XxlJobRegistryDao xxlJobRegistryDao;
|
private XxlJobRegistryDao xxlJobRegistryDao;
|
||||||
|
|
||||||
@RequestMapping
|
@RequestMapping
|
||||||
|
@PermissionLimit(adminuser = true)
|
||||||
public String index(Model model) {
|
public String index(Model model) {
|
||||||
return "jobgroup/jobgroup.index";
|
return "jobgroup/jobgroup.index";
|
||||||
}
|
}
|
||||||
|
|
||||||
@RequestMapping("/pageList")
|
@RequestMapping("/pageList")
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
|
@PermissionLimit(adminuser = true)
|
||||||
public Map<String, Object> pageList(HttpServletRequest request,
|
public Map<String, Object> pageList(HttpServletRequest request,
|
||||||
@RequestParam(required = false, defaultValue = "0") int start,
|
@RequestParam(required = false, defaultValue = "0") int start,
|
||||||
@RequestParam(required = false, defaultValue = "10") int length,
|
@RequestParam(required = false, defaultValue = "10") int length,
|
||||||
|
@ -59,6 +62,7 @@ public class JobGroupController {
|
||||||
|
|
||||||
@RequestMapping("/save")
|
@RequestMapping("/save")
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
|
@PermissionLimit(adminuser = true)
|
||||||
public ReturnT<String> save(XxlJobGroup xxlJobGroup){
|
public ReturnT<String> save(XxlJobGroup xxlJobGroup){
|
||||||
|
|
||||||
// valid
|
// valid
|
||||||
|
@ -102,6 +106,7 @@ public class JobGroupController {
|
||||||
|
|
||||||
@RequestMapping("/update")
|
@RequestMapping("/update")
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
|
@PermissionLimit(adminuser = true)
|
||||||
public ReturnT<String> update(XxlJobGroup xxlJobGroup){
|
public ReturnT<String> update(XxlJobGroup xxlJobGroup){
|
||||||
// valid
|
// valid
|
||||||
if (xxlJobGroup.getAppname()==null || xxlJobGroup.getAppname().trim().length()==0) {
|
if (xxlJobGroup.getAppname()==null || xxlJobGroup.getAppname().trim().length()==0) {
|
||||||
|
@ -170,6 +175,7 @@ public class JobGroupController {
|
||||||
|
|
||||||
@RequestMapping("/remove")
|
@RequestMapping("/remove")
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
|
@PermissionLimit(adminuser = true)
|
||||||
public ReturnT<String> remove(int id){
|
public ReturnT<String> remove(int id){
|
||||||
|
|
||||||
// valid
|
// valid
|
||||||
|
@ -189,6 +195,7 @@ public class JobGroupController {
|
||||||
|
|
||||||
@RequestMapping("/loadById")
|
@RequestMapping("/loadById")
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
|
@PermissionLimit(adminuser = true)
|
||||||
public ReturnT<XxlJobGroup> loadById(int id){
|
public ReturnT<XxlJobGroup> loadById(int id){
|
||||||
XxlJobGroup jobGroup = xxlJobGroupDao.load(id);
|
XxlJobGroup jobGroup = xxlJobGroupDao.load(id);
|
||||||
return jobGroup!=null?new ReturnT<XxlJobGroup>(jobGroup):new ReturnT<XxlJobGroup>(ReturnT.FAIL_CODE, null);
|
return jobGroup!=null?new ReturnT<XxlJobGroup>(jobGroup):new ReturnT<XxlJobGroup>(ReturnT.FAIL_CODE, null);
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package com.xxl.job.admin.controller;
|
package com.xxl.job.admin.controller;
|
||||||
|
|
||||||
import com.xxl.job.admin.core.exception.XxlJobException;
|
|
||||||
import com.xxl.job.admin.core.complete.XxlJobCompleter;
|
import com.xxl.job.admin.core.complete.XxlJobCompleter;
|
||||||
|
import com.xxl.job.admin.core.exception.XxlJobException;
|
||||||
import com.xxl.job.admin.core.model.XxlJobGroup;
|
import com.xxl.job.admin.core.model.XxlJobGroup;
|
||||||
import com.xxl.job.admin.core.model.XxlJobInfo;
|
import com.xxl.job.admin.core.model.XxlJobInfo;
|
||||||
import com.xxl.job.admin.core.model.XxlJobLog;
|
import com.xxl.job.admin.core.model.XxlJobLog;
|
||||||
|
@ -20,9 +20,11 @@ import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.stereotype.Controller;
|
import org.springframework.stereotype.Controller;
|
||||||
import org.springframework.ui.Model;
|
import org.springframework.ui.Model;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
import org.springframework.web.bind.annotation.ResponseBody;
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
|
import org.springframework.web.util.HtmlUtils;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
@ -129,27 +131,38 @@ public class JobLogController {
|
||||||
|
|
||||||
model.addAttribute("triggerCode", jobLog.getTriggerCode());
|
model.addAttribute("triggerCode", jobLog.getTriggerCode());
|
||||||
model.addAttribute("handleCode", jobLog.getHandleCode());
|
model.addAttribute("handleCode", jobLog.getHandleCode());
|
||||||
model.addAttribute("executorAddress", jobLog.getExecutorAddress());
|
|
||||||
model.addAttribute("triggerTime", jobLog.getTriggerTime().getTime());
|
|
||||||
model.addAttribute("logId", jobLog.getId());
|
model.addAttribute("logId", jobLog.getId());
|
||||||
return "joblog/joblog.detail";
|
return "joblog/joblog.detail";
|
||||||
}
|
}
|
||||||
|
|
||||||
@RequestMapping("/logDetailCat")
|
@RequestMapping("/logDetailCat")
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public ReturnT<LogResult> logDetailCat(String executorAddress, long triggerTime, long logId, int fromLineNum){
|
public ReturnT<LogResult> logDetailCat(long logId, int fromLineNum){
|
||||||
try {
|
try {
|
||||||
ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(executorAddress);
|
// valid
|
||||||
ReturnT<LogResult> logResult = executorBiz.log(new LogParam(triggerTime, logId, fromLineNum));
|
XxlJobLog jobLog = xxlJobLogDao.load(logId); // todo, need to improve performance
|
||||||
|
if (jobLog == null) {
|
||||||
|
return new ReturnT<LogResult>(ReturnT.FAIL_CODE, I18nUtil.getString("joblog_logid_unvalid"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// log cat
|
||||||
|
ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(jobLog.getExecutorAddress());
|
||||||
|
ReturnT<LogResult> logResult = executorBiz.log(new LogParam(jobLog.getTriggerTime().getTime(), logId, fromLineNum));
|
||||||
|
|
||||||
// is end
|
// is end
|
||||||
if (logResult.getContent()!=null && logResult.getContent().getFromLineNum() > logResult.getContent().getToLineNum()) {
|
if (logResult.getContent()!=null && logResult.getContent().getFromLineNum() > logResult.getContent().getToLineNum()) {
|
||||||
XxlJobLog jobLog = xxlJobLogDao.load(logId);
|
|
||||||
if (jobLog.getHandleCode() > 0) {
|
if (jobLog.getHandleCode() > 0) {
|
||||||
logResult.getContent().setEnd(true);
|
logResult.getContent().setEnd(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// fix xss
|
||||||
|
if (logResult.getContent()!=null && StringUtils.hasText(logResult.getContent().getLogContent())) {
|
||||||
|
String newLogContent = logResult.getContent().getLogContent();
|
||||||
|
newLogContent = HtmlUtils.htmlEscape(newLogContent, "UTF-8");
|
||||||
|
logResult.getContent().setLogContent(newLogContent);
|
||||||
|
}
|
||||||
|
|
||||||
return logResult;
|
return logResult;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
logger.error(e.getMessage(), e);
|
logger.error(e.getMessage(), e);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
### web
|
### web
|
||||||
server.port=8080
|
server.port=9090
|
||||||
server.servlet.context-path=/xxl-job-admin
|
server.servlet.context-path=/xxl-job-admin
|
||||||
|
|
||||||
### actuator
|
### actuator
|
||||||
|
@ -25,7 +25,7 @@ mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml
|
||||||
### xxl-job, datasource
|
### xxl-job, datasource
|
||||||
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
|
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
|
||||||
spring.datasource.username=root
|
spring.datasource.username=root
|
||||||
spring.datasource.password=root_pwd
|
spring.datasource.password=root
|
||||||
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
|
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
|
||||||
|
|
||||||
### datasource-pool
|
### datasource-pool
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
admin_name=Scheduling Center
|
admin_name=Scheduling Center
|
||||||
admin_name_full=Distributed Task Scheduling Platform XXL-JOB
|
admin_name_full=Distributed Task Scheduling Platform XXL-JOB
|
||||||
admin_version=2.4.0-SNAPSHOT
|
admin_version=2.4.1-SNAPSHOT
|
||||||
admin_i18n=en
|
admin_i18n=en
|
||||||
|
|
||||||
## system
|
## system
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
admin_name=任务调度中心
|
admin_name=任务调度中心
|
||||||
admin_name_full=分布式任务调度平台XXL-JOB
|
admin_name_full=分布式任务调度平台XXL-JOB
|
||||||
admin_version=2.4.0-SNAPSHOT
|
admin_version=2.4.1-SNAPSHOT
|
||||||
admin_i18n=
|
admin_i18n=
|
||||||
|
|
||||||
## system
|
## system
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
admin_name=任務調度中心
|
admin_name=任務調度中心
|
||||||
admin_name_full=分布式任務調度平臺XXL-JOB
|
admin_name_full=分布式任務調度平臺XXL-JOB
|
||||||
admin_version=2.4.0-SNAPSHOT
|
admin_version=2.4.1-SNAPSHOT
|
||||||
admin_i18n=
|
admin_i18n=
|
||||||
|
|
||||||
## system
|
## system
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
<configuration debug="false" scan="true" scanPeriod="1 seconds">
|
<configuration debug="false" scan="true" scanPeriod="1 seconds">
|
||||||
|
|
||||||
<contextName>logback</contextName>
|
<contextName>logback</contextName>
|
||||||
<property name="log.path" value="/data/applogs/xxl-job/xxl-job-admin.log"/>
|
<property name="log.path" value="./xxl-job/xxl-job-admin.log"/>
|
||||||
|
|
||||||
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
|
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
<encoder>
|
<encoder>
|
||||||
|
|
|
@ -25,8 +25,6 @@ $(function() {
|
||||||
async: false, // sync, make log ordered
|
async: false, // sync, make log ordered
|
||||||
url : base_url + '/joblog/logDetailCat',
|
url : base_url + '/joblog/logDetailCat',
|
||||||
data : {
|
data : {
|
||||||
"executorAddress":executorAddress,
|
|
||||||
"triggerTime":triggerTime,
|
|
||||||
"logId":logId,
|
"logId":logId,
|
||||||
"fromLineNum":fromLineNum
|
"fromLineNum":fromLineNum
|
||||||
},
|
},
|
||||||
|
|
|
@ -62,8 +62,6 @@
|
||||||
// 参数
|
// 参数
|
||||||
var triggerCode = '${triggerCode}';
|
var triggerCode = '${triggerCode}';
|
||||||
var handleCode = '${handleCode}';
|
var handleCode = '${handleCode}';
|
||||||
var executorAddress = '${executorAddress!}';
|
|
||||||
var triggerTime = '${triggerTime?c}';
|
|
||||||
var logId = '${logId}';
|
var logId = '${logId}';
|
||||||
</script>
|
</script>
|
||||||
<script src="${request.contextPath}/static/js/joblog.detail.1.js"></script>
|
<script src="${request.contextPath}/static/js/joblog.detail.1.js"></script>
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>com.xuxueli</groupId>
|
<groupId>com.xuxueli</groupId>
|
||||||
<artifactId>xxl-job</artifactId>
|
<artifactId>xxl-job</artifactId>
|
||||||
<version>2.4.0-SNAPSHOT</version>
|
<version>2.4.1-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
<artifactId>xxl-job-core</artifactId>
|
<artifactId>xxl-job-core</artifactId>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>com.xuxueli</groupId>
|
<groupId>com.xuxueli</groupId>
|
||||||
<artifactId>xxl-job</artifactId>
|
<artifactId>xxl-job</artifactId>
|
||||||
<version>2.4.0-SNAPSHOT</version>
|
<version>2.4.1-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
<artifactId>xxl-job-executor-samples</artifactId>
|
<artifactId>xxl-job-executor-samples</artifactId>
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>com.xuxueli</groupId>
|
<groupId>com.xuxueli</groupId>
|
||||||
<artifactId>xxl-job-executor-samples</artifactId>
|
<artifactId>xxl-job-executor-samples</artifactId>
|
||||||
<version>2.4.0-SNAPSHOT</version>
|
<version>2.4.1-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
<artifactId>xxl-job-executor-sample-frameless</artifactId>
|
<artifactId>xxl-job-executor-sample-frameless</artifactId>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>com.xuxueli</groupId>
|
<groupId>com.xuxueli</groupId>
|
||||||
<artifactId>xxl-job-executor-samples</artifactId>
|
<artifactId>xxl-job-executor-samples</artifactId>
|
||||||
<version>2.4.0-SNAPSHOT</version>
|
<version>2.4.1-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
<artifactId>xxl-job-executor-sample-springboot</artifactId>
|
<artifactId>xxl-job-executor-sample-springboot</artifactId>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
Loading…
Reference in New Issue