Merge remote-tracking branch 'origin/master'

# Conflicts:
#	doc/db/tables_xxl_job.sql
#	xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java
#	xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java
#	xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java
#	xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java
#	xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobClusterDao.java
#	xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobInfoDao.java
#	xxl-job-admin/src/main/java/com/xxl/job/admin/service/JobAllocation.java
#	xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AverageJobAllocation.java
#	xxl-job-admin/src/main/resources/application.properties
#	xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml
#	xxl-job-core/src/main/java/com/xxl/job/core/server/EmbedServer.java
pull/56/head
yong.li07 2 years ago
commit 139c8e3a9f

@ -117,6 +117,8 @@ XXL-JOB是一个分布式任务调度平台其核心设计目标是开发迅
于2020-11-16XXL-JOB参与"[2020年度最受欢迎中国开源软件](https://www.oschina.net/project/top_cn_2020)"评比,在当时已录入的一万多个开源项目中角逐,最终排名"开发框架和基础组件类"第8名。
于2021-12-06XXL-JOB参与"[2021年度OSC中国开源项目评选](https://www.oschina.net/project/top_cn_2021) "评比,在当时已录入的一万多个开源项目中角逐,最终当选"最受欢迎项目"。
> 我司大众点评目前已接入XXL-JOB内部别名《Ferrari》Ferrari基于XXL-JOB的V1.1版本定制而成,新接入应用推荐升级最新版本)。
据最新统计, 自2016-01-21接入至2017-12-01期间该系统已调度约100万次表现优异。新接入应用推荐使用最新版本因为经过数十个版本的更新系统的任务模型、UI交互模型以及底层调度通讯模型都有了较大的优化和提升核心功能更加稳定高效。
@ -610,6 +612,121 @@ XXL-JOB是一个分布式任务调度平台其核心设计目标是开发迅
- 486、IT实战联盟
- 487、杭州尤拉夫科技有限公司
- 488、中大检测(湖南)股份有限公司
- 489、江苏电老虎工业互联网股份有限公司
- 490、上海助通信息科技有限公司
- 491、北京符节科技有限公司
- 492、杭州英祐科技有限公司
- 493、江苏电老虎工业互联网股份有限公司
- 494、深圳市点猫科技有限公司
- 495、杭州天音
- 496、深圳市二十一科技互联网有限公司
- 497、海南海口翎度科技
- 498、北京小趣智品科技有限公司
- 499、广州石竹计算机软件有限公司
- 500、深圳市惟客数据科技有限公司
- 501、中国医疗器械有限公司
- 502、上海云谦科技有限公司
- 503、上海磐农信息科技有限公司
- 504、广州领航食品有限公司
- 505、青岛掌讯通区块链科技有限公司
- 506、北京新网数码信息技术有限公司
- 507、超体信息科技(深圳)有限公司
- 508、长沙店帮手信息科技有限公司
- 509、上海助弓装饰工程有限公司
- 510、杭州寻联网络科技有限公司
- 511、成都大淘客科技有限公司
- 512、松果出行
- 513、深圳市唤梦科技有限公司
- 514、上汽集团商用车技术中心
- 515、北京中航讯科技股份有限公司
- 516、北龙中网(北京)科技有限责任公司
- 517、前海超级前台(深圳)信息技术有限公司
- 518、上海中商网络股份有限公司
- 519、上海助通信息科技有限公司
- 520、宁波聚臻智能科技有限公司
- 521、上海零动数码科技股份有限公司
- 522、浙江学海教育科技有限公司
- 523、聚学云(山东)信息技术有限公司
- 524、多氟多新材料股份有限公司
- 525、智慧眼科技股份有限公司
- 526、广东智通人才连锁股份有限公司
- 527、世纪开元智印互联科技集团股份有限公司
- 528、北京理想汽车【理想汽车】
- 529、巽逸科技(重庆)有限公司
- 530、义乌购电子商务有限公司
- 531、深圳市珂莱蒂尔服饰有限公司
- 532、江西国泰利民信息科技有限公司
- 533、广西广电大数据科技有限公司
- 534、杭州艾麦科技有限公司
- 535、广州小滴科技有限公司
- 536、佳缘科技股份有限公司
- 537、上海深擎信息科技有限公司
- 538、武商网
- 539、福建民本信息科技有限公司
- 540、杭州惠合信息科技有限公司
- 541、厦门爱立得科技有限公司
- 542、成都拟合未来科技有限公司
- 543、宁波聚臻智能科技有限公司
- 544、广东百慧科技有限公司
- 545、笨马网络
- 546、深圳市信安数字科技有限公司
- 547、深圳市思乐数据技术有限公司
- 548、四川绿源集科技有限公司
- 549、湖南云医链生物科技有限公司
- 550、杭州源诚科技有限公司
- 551、北京开课吧科技有限公司
- 552、北京多来点信息技术有限公司
- 553、JEECG BOOT低代码开发平台
- 554、苏州同元软控信息技术有限公司
- 555、江苏大泰信息技术有限公司
- 556、北京大禹汇智
- 557、北京盛哲科技有限公司
- 558、广州钛动科技有限公司
- 559、北京大禹汇智科技有限公司
- 560、湖南鼎翰文化股份有限公司
- 561、苏州安软信息科技有限公司
- 562、芒果tv
- 563、上海艺赛旗软件股份有限公司
- 564、中盈优创资讯科技有限公司
- 565、乐乎公寓
- 566、启明信息
- 567、苏州安软
- 568、南京富金的软件科技有限公司
- 569、深圳市新科聚合网络技术有限公司
- 570、你好现在(北京)科技股份有限公司
- 571、360考试宝典
- 572、北京一零科技有限公司
- 573、厦门星纵信息
- 574、Dalligent Solusi Indonesia
- 575、深圳华普物联科技有限公司
- 576、深圳行健自动化股份有限公司
- 577、深圳市富融信息科技服务有限公司
- 578、蓝鸟云
- 579、上海澎博财经资讯有限公司
- 580、北京小鸦科技有限公司
- 581、杭州盈泉云科技有限公司
- 582、惟客数据
- 583、GOSO香蜜闺秀
- 584、普乐师上海数字科技有限公司
- 585、西安市雁塔区咖北堂网络科技部
- 586、宁波聚臻智能科技有限公司
- 587、普乐师数字科技有限公司
- 588、江苏蟹联网科技有限公司
- 589、杭州未智科技有限公司
- 590、安吉智行物流有限公司
- 591、华生大家居集团有限公司
- 592、美心食品广州有限公司
- 593、货拉拉【货拉拉APP】
- 594、杭州思韬瑞科技有限公司
- 595、杭州玖融科技有限公司
- 596、北京优海网络科技有限公司
- 597、浙江大维高新技术股份有限公司
- 598、粤港澳大湾区数字经济研究院
- 599、普康杭州健康科技有限公司
- 600、华西证券股份有限公司【华西证券】
- 601、杭州海康机器人股份有限公司【海康】
- 602、河南宸邦信息技术有限公司
- 603、成都次元节点网络科技有限公司
- ……
> 更多接入的公司,欢迎在 [登记地址](https://github.com/xuxueli/xxl-job/issues/1 ) 登记,登记仅仅为了产品推广。
@ -629,7 +746,7 @@ This product is open source and free, and will continue to provide free communit
- Licensed under the GNU General Public License (GPL) v3.
- Copyright (c) 2015-present, xuxueli.
产品开源免费,并且将持续提供免费的社区技术支持。个人或企业内部可自由的接入和使用。
产品开源免费,并且将持续提供免费的社区技术支持。个人或企业内部可自由的接入和使用。如有需要可邮件联系作者免费获取项目授权。
## Donate

@ -87,6 +87,8 @@ XXL-JOB是一个分布式任务调度平台其核心设计目标是开发迅
于2020-11-16XXL-JOB参与"[2020年度最受欢迎中国开源软件](https://www.oschina.net/project/top_cn_2020)"评比,在当时已录入的一万多个开源项目中角逐,最终排名"开发框架和基础组件类"第8名。
于2021-12-06XXL-JOB参与"[2021年度OSC中国开源项目评选](https://www.oschina.net/project/top_cn_2021) "评比,在当时已录入的一万多个开源项目中角逐,最终当选"最受欢迎项目"。
> 我司大众点评目前已接入XXL-JOB内部别名《Ferrari》Ferrari基于XXL-JOB的V1.1版本定制而成,新接入应用推荐升级最新版本)。
据最新统计, 自2016-01-21接入至2017-12-01期间该系统已调度约100万次表现优异。新接入应用推荐使用最新版本因为经过数十个版本的更新系统的任务模型、UI交互模型以及底层调度通讯模型都有了较大的优化和提升核心功能更加稳定高效。
@ -580,6 +582,121 @@ XXL-JOB是一个分布式任务调度平台其核心设计目标是开发迅
- 486、IT实战联盟
- 487、杭州尤拉夫科技有限公司
- 488、中大检测(湖南)股份有限公司
- 489、江苏电老虎工业互联网股份有限公司
- 490、上海助通信息科技有限公司
- 491、北京符节科技有限公司
- 492、杭州英祐科技有限公司
- 493、江苏电老虎工业互联网股份有限公司
- 494、深圳市点猫科技有限公司
- 495、杭州天音
- 496、深圳市二十一科技互联网有限公司
- 497、海南海口翎度科技
- 498、北京小趣智品科技有限公司
- 499、广州石竹计算机软件有限公司
- 500、深圳市惟客数据科技有限公司
- 501、中国医疗器械有限公司
- 502、上海云谦科技有限公司
- 503、上海磐农信息科技有限公司
- 504、广州领航食品有限公司
- 505、青岛掌讯通区块链科技有限公司
- 506、北京新网数码信息技术有限公司
- 507、超体信息科技(深圳)有限公司
- 508、长沙店帮手信息科技有限公司
- 509、上海助弓装饰工程有限公司
- 510、杭州寻联网络科技有限公司
- 511、成都大淘客科技有限公司
- 512、松果出行
- 513、深圳市唤梦科技有限公司
- 514、上汽集团商用车技术中心
- 515、北京中航讯科技股份有限公司
- 516、北龙中网(北京)科技有限责任公司
- 517、前海超级前台(深圳)信息技术有限公司
- 518、上海中商网络股份有限公司
- 519、上海助通信息科技有限公司
- 520、宁波聚臻智能科技有限公司
- 521、上海零动数码科技股份有限公司
- 522、浙江学海教育科技有限公司
- 523、聚学云(山东)信息技术有限公司
- 524、多氟多新材料股份有限公司
- 525、智慧眼科技股份有限公司
- 526、广东智通人才连锁股份有限公司
- 527、世纪开元智印互联科技集团股份有限公司
- 528、北京理想汽车【理想汽车】
- 529、巽逸科技(重庆)有限公司
- 530、义乌购电子商务有限公司
- 531、深圳市珂莱蒂尔服饰有限公司
- 532、江西国泰利民信息科技有限公司
- 533、广西广电大数据科技有限公司
- 534、杭州艾麦科技有限公司
- 535、广州小滴科技有限公司
- 536、佳缘科技股份有限公司
- 537、上海深擎信息科技有限公司
- 538、武商网
- 539、福建民本信息科技有限公司
- 540、杭州惠合信息科技有限公司
- 541、厦门爱立得科技有限公司
- 542、成都拟合未来科技有限公司
- 543、宁波聚臻智能科技有限公司
- 544、广东百慧科技有限公司
- 545、笨马网络
- 546、深圳市信安数字科技有限公司
- 547、深圳市思乐数据技术有限公司
- 548、四川绿源集科技有限公司
- 549、湖南云医链生物科技有限公司
- 550、杭州源诚科技有限公司
- 551、北京开课吧科技有限公司
- 552、北京多来点信息技术有限公司
- 553、JEECG BOOT低代码开发平台
- 554、苏州同元软控信息技术有限公司
- 555、江苏大泰信息技术有限公司
- 556、北京大禹汇智
- 557、北京盛哲科技有限公司
- 558、广州钛动科技有限公司
- 559、北京大禹汇智科技有限公司
- 560、湖南鼎翰文化股份有限公司
- 561、苏州安软信息科技有限公司
- 562、芒果tv
- 563、上海艺赛旗软件股份有限公司
- 564、中盈优创资讯科技有限公司
- 565、乐乎公寓
- 566、启明信息
- 567、苏州安软
- 568、南京富金的软件科技有限公司
- 569、深圳市新科聚合网络技术有限公司
- 570、你好现在(北京)科技股份有限公司
- 571、360考试宝典
- 572、北京一零科技有限公司
- 573、厦门星纵信息
- 574、Dalligent Solusi Indonesia
- 575、深圳华普物联科技有限公司
- 576、深圳行健自动化股份有限公司
- 577、深圳市富融信息科技服务有限公司
- 578、蓝鸟云
- 579、上海澎博财经资讯有限公司
- 580、北京小鸦科技有限公司
- 581、杭州盈泉云科技有限公司
- 582、惟客数据
- 583、GOSO香蜜闺秀
- 584、普乐师上海数字科技有限公司
- 585、西安市雁塔区咖北堂网络科技部
- 586、宁波聚臻智能科技有限公司
- 587、普乐师数字科技有限公司
- 588、江苏蟹联网科技有限公司
- 589、杭州未智科技有限公司
- 590、安吉智行物流有限公司
- 591、华生大家居集团有限公司
- 592、美心食品广州有限公司
- 593、货拉拉【货拉拉APP】
- 594、杭州思韬瑞科技有限公司
- 595、杭州玖融科技有限公司
- 596、北京优海网络科技有限公司
- 597、浙江大维高新技术股份有限公司
- 598、粤港澳大湾区数字经济研究院
- 599、普康杭州健康科技有限公司
- 600、华西证券股份有限公司【华西证券】
- 601、杭州海康机器人股份有限公司【海康】
- 602、河南宸邦信息技术有限公司
- 603、成都次元节点网络科技有限公司
- ……
> 更多接入的公司,欢迎在 [登记地址](https://github.com/xuxueli/xxl-job/issues/1 ) 登记,登记仅仅为了产品推广。
@ -745,7 +862,7 @@ docker run -e PARAMS="--spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_jo
执行器配置,配置内容说明:
### 调度中心部署地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;
### 调度中心部署地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
### 执行器通讯TOKEN [选填]:非空时启用;
@ -859,8 +976,8 @@ public XxlJobSpringExecutor xxlJobExecutor() {
固定速度:该类型将会以固定速度,触发任务调度;按照固定的间隔时间,周期性触发;
固定延迟:该类型将会以固定延迟,触发任务调度;按照固定的延迟时间,从上次调度结束后开始计算延迟时间,到达延迟时间后触发下次调度;
- CRON触发任务执行的Cron表达式
- 固定速度:固速度的时间间隔,单位为秒;
- 固定延迟:固延迟的时间间隔,单位为秒;
- 固定速度:固速度的时间间隔,单位为秒;
- 固定延迟:固延迟的时间间隔,单位为秒;
任务配置:
- 运行模式:
@ -1324,7 +1441,7 @@ XXL-JOB会为每次调度请求生成一个单独的日志文件需要通过
日志文件存放的位置可在“执行器”配置文件进行自定义,默认目录格式为:/data/applogs/xxl-job/jobhandler/“格式化日期”/“数据库调度日志记录的主键ID.log”。
在JobHandler中开启子线程时子线程将会将会把日志打印在父线程即JobHandler的执行日志中方便日志追踪。
在JobHandler中开启子线程时子线程将会把日志打印在父线程即JobHandler的执行日志中方便日志追踪。
### 5.6 通讯模块剖析
@ -1483,7 +1600,7 @@ API服务请求参考代码com.xxl.job.adminbiz.AdminBizTest
------
地址格式:{调度中心跟地址}/callback
地址格式:{调度中心根地址}/api/callback
Header
XXL-JOB-ACCESS-TOKEN : {请求令牌}
@ -1492,9 +1609,8 @@ Header
[{
"logId":1, // 本次调度日志ID
"logDateTim":0, // 本次调度日志时间
"executeResult":{
"code": 200, // 200 表示任务执行正常500表示失败
"msg": null
"handleCode":200, // 200 表示任务执行正常500表示失败
"handleMsg": null
}
}]
@ -1511,7 +1627,7 @@ Header
------
地址格式:{调度中心跟地址}/registry
地址格式:{调度中心根地址}/api/registry
Header
XXL-JOB-ACCESS-TOKEN : {请求令牌}
@ -1536,7 +1652,7 @@ Header
------
地址格式:{调度中心跟地址}/registryRemove
地址格式:{调度中心根地址}/api/registryRemove
Header
XXL-JOB-ACCESS-TOKEN : {请求令牌}
@ -1566,7 +1682,7 @@ API服务请求参考代码com.xxl.job.executorbiz.ExecutorBizTest
------
地址格式:{执行器内嵌服务地址}/beat
地址格式:{执行器内嵌服务地址}/beat
Header
XXL-JOB-ACCESS-TOKEN : {请求令牌}
@ -1586,7 +1702,7 @@ Header
------
地址格式:{执行器内嵌服务地址}/idleBeat
地址格式:{执行器内嵌服务地址}/idleBeat
Header
XXL-JOB-ACCESS-TOKEN : {请求令牌}
@ -1609,7 +1725,7 @@ Header
------
地址格式:{执行器内嵌服务地址}/run
地址格式:{执行器内嵌服务地址}/run
Header
XXL-JOB-ACCESS-TOKEN : {请求令牌}
@ -1643,7 +1759,7 @@ Header
------
地址格式:{执行器内嵌服务地址}/kill
地址格式:{执行器内嵌服务地址}/kill
Header
XXL-JOB-ACCESS-TOKEN : {请求令牌}
@ -1667,7 +1783,7 @@ Header
------
地址格式:{执行器内嵌服务地址}/log
地址格式:{执行器内嵌服务地址}/log
Header
XXL-JOB-ACCESS-TOKEN : {请求令牌}
@ -2178,24 +2294,35 @@ public void execute() {
- 26、【修复】页面redirect跳转后https变为http问题修复
- 27、【修复】执行器日志清理优化修复小概率下日志文件为空导致清理异常问题
### 7.32 版本 v2.3.1 Release Notes[规划中]
### 7.32 版本 v2.3.1 Release Notes[2022-05-21]
- 1、【修复】修复风险漏洞升级问题低版本项目依赖CVE-2021-2471、CVE-2022-22965等。
- 2、【修复】修复故障告警逻辑邮箱校验逻辑下放至EmailJobAlarm中避免对其他告警方式的干扰。
- 3、【优化】调度通讯默认启用accessToken提升系统安全性建议生产环境自定义accessToken
- 4、【优化】合并多项PR项目代码结构、健壮性优化PR-2833、PR-2812、PR-2541、PR-2537、PR-2514、PR-2509、PR-2591。
- 5、【优化】任务线程名优化提升可读性与问题定位效率(ISSUE-2527)。
### 7.33 版本 v2.4.0 Release Notes[2022-03-23]
- 1、【优化】执行器任务Bean扫描逻辑优化解决懒加载注解失效问题。
- 2、【优化】多个项目依赖升级至较新稳定版本涉及netty、groovy、spring、springboot、mybatis等
- 3、【修复】"CVE-2022-36157" 授权漏洞修复。
- 4、【修复】"CVE-2022-43183" SSRF漏洞修复。
### 7.34 版本 v2.4.1 Release Notes[规划中]
- 1、【优化】[规划中]任务日志重构:一次调度只记录一条主任务,维护起止时间和状态。
- 普通任务:只记录一条主任务;
- 广播任务:记录一条主任务,每个分片任务记录一条次任务,关联在主任务上;
- 重试任务:失败时,新增主任务。所有调度记录,包括入口调度和重试调度,均挂载主任务上。
- 2、【优化】[规划中]分片任务:全部完成后才会出发后置节点;
- 3、【优化】多个项目依赖升级至较新稳定版本如netty、groovy、spring、springboot等
- 4、【优化】合并多项PR代码结构、代码变量和注释等多项优化调整
- 5、【优化】任务线程名优化(ISSUE-2527)
- 6、【修复】邮箱校验逻辑下放至EmailJobAlarm中避免对其他告警方式的干扰
### 7.33 版本 v2.4.0 Release Notes[规划中]
### 7.35 新版本规划 [规划中]
- 1、[规划中]DAG流程任务
- DAG任务支持参数传递共享数据DAG任务创建、管理DAG任务日志查看、操作
- 子任务:废弃
- 2、[规划中]多数据库支持DAO层通过JPA实现不限制数据库类型
- 3、[规划中]告警增强:邮件告警 + webhook告警
- 4、[规划中]安全强化AccessToken动态生成、动态启停控制调度、回调
- 5、[规划中]任务导入导出工具,灵活支持版本升级、迁移等场景。
### TODO LIST
- 1、任务分片路由分片采用一致性Hash算法计算出尽量稳定的分片顺序即使注册机器存在波动也不会引起分批分片顺序大的波动目前采用IP自然排序可以满足需求待定
@ -2240,7 +2367,7 @@ public void execute() {
更多接入的公司,欢迎在 [登记地址](https://github.com/xuxueli/xxl-job/issues/1 ) 登记,登记仅仅为了产品推广。
### 8.3 开源协议和版权
产品开源免费,并且将持续提供免费的社区技术支持。个人或企业内部可自由的接入和使用。
产品开源免费,并且将持续提供免费的社区技术支持。个人或企业内部可自由的接入和使用。如有需要可邮件联系作者免费获取项目授权。
- Licensed under the GNU General Public License (GPL) v3.
- Copyright (c) 2015-present, xuxueli.

@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job</artifactId>
<version>2.3.1-SNAPSHOT</version>
<version>2.4.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>${project.artifactId}</name>
@ -24,25 +24,24 @@
<maven.compiler.target>1.8</maven.compiler.target>
<maven.test.skip>true</maven.test.skip>
<netty-all.version>4.1.63.Final</netty-all.version>
<gson.version>2.8.6</gson.version>
<netty.version>4.1.90.Final</netty.version>
<gson.version>2.10.1</gson.version>
<spring.version>5.3.6</spring.version>
<spring-boot.version>2.4.5</spring-boot.version>
<spring.version>5.3.26</spring.version>
<spring-boot.version>2.7.9</spring-boot.version>
<mybatis-spring-boot-starter.version>2.1.4</mybatis-spring-boot-starter.version>
<mysql-connector-java.version>8.0.24</mysql-connector-java.version>
<mybatis-spring-boot-starter.version>2.3.0</mybatis-spring-boot-starter.version>
<mysql-connector-j.version>8.0.32</mysql-connector-j.version>
<slf4j-api.version>1.7.30</slf4j-api.version>
<junit-jupiter.version>5.7.1</junit-jupiter.version>
<slf4j-api.version>1.7.36</slf4j-api.version>
<junit-jupiter.version>5.9.2</junit-jupiter.version>
<javax.annotation-api.version>1.3.2</javax.annotation-api.version>
<groovy.version>3.0.8</groovy.version>
<groovy.version>4.0.10</groovy.version>
<maven-source-plugin.version>3.2.1</maven-source-plugin.version>
<maven-javadoc-plugin.version>3.2.0</maven-javadoc-plugin.version>
<maven-gpg-plugin.version>1.6</maven-gpg-plugin.version>
<maven-war-plugin.version>3.3.1</maven-war-plugin.version>
<maven-javadoc-plugin.version>3.5.0</maven-javadoc-plugin.version>
<maven-gpg-plugin.version>3.0.1</maven-gpg-plugin.version>
</properties>
<build>

@ -4,7 +4,7 @@
<parent>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job</artifactId>
<version>2.3.1-SNAPSHOT</version>
<version>2.4.1-SNAPSHOT</version>
</parent>
<artifactId>xxl-job-admin</artifactId>
<packaging>jar</packaging>
@ -61,9 +61,9 @@
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector-java.version}</version>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>${mysql-connector-j.version}</version>
</dependency>
<!-- xxl-job-core -->

@ -1,5 +1,6 @@
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.XxlJobRegistry;
import com.xxl.job.admin.core.util.I18nUtil;
@ -34,12 +35,14 @@ public class JobGroupController {
private XxlJobRegistryDao xxlJobRegistryDao;
@RequestMapping
@PermissionLimit(adminuser = true)
public String index(Model model) {
return "jobgroup/jobgroup.index";
}
@RequestMapping("/pageList")
@ResponseBody
@PermissionLimit(adminuser = true)
public Map<String, Object> pageList(HttpServletRequest request,
@RequestParam(required = false, defaultValue = "0") int start,
@RequestParam(required = false, defaultValue = "10") int length,
@ -59,6 +62,7 @@ public class JobGroupController {
@RequestMapping("/save")
@ResponseBody
@PermissionLimit(adminuser = true)
public ReturnT<String> save(XxlJobGroup xxlJobGroup){
// valid
@ -102,6 +106,7 @@ public class JobGroupController {
@RequestMapping("/update")
@ResponseBody
@PermissionLimit(adminuser = true)
public ReturnT<String> update(XxlJobGroup xxlJobGroup){
// valid
if (xxlJobGroup.getAppname()==null || xxlJobGroup.getAppname().trim().length()==0) {
@ -170,6 +175,7 @@ public class JobGroupController {
@RequestMapping("/remove")
@ResponseBody
@PermissionLimit(adminuser = true)
public ReturnT<String> remove(int id){
// valid
@ -189,6 +195,7 @@ public class JobGroupController {
@RequestMapping("/loadById")
@ResponseBody
@PermissionLimit(adminuser = true)
public ReturnT<XxlJobGroup> loadById(int id){
XxlJobGroup jobGroup = xxlJobGroupDao.load(id);
return jobGroup!=null?new ReturnT<XxlJobGroup>(jobGroup):new ReturnT<XxlJobGroup>(ReturnT.FAIL_CODE, null);

@ -1,7 +1,7 @@
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.exception.XxlJobException;
import com.xxl.job.admin.core.model.XxlJobGroup;
import com.xxl.job.admin.core.model.XxlJobInfo;
import com.xxl.job.admin.core.model.XxlJobLog;
@ -129,22 +129,26 @@ public class JobLogController {
model.addAttribute("triggerCode", jobLog.getTriggerCode());
model.addAttribute("handleCode", jobLog.getHandleCode());
model.addAttribute("executorAddress", jobLog.getExecutorAddress());
model.addAttribute("triggerTime", jobLog.getTriggerTime().getTime());
model.addAttribute("logId", jobLog.getId());
return "joblog/joblog.detail";
}
@RequestMapping("/logDetailCat")
@ResponseBody
public ReturnT<LogResult> logDetailCat(String executorAddress, long triggerTime, long logId, int fromLineNum){
public ReturnT<LogResult> logDetailCat(long logId, int fromLineNum){
try {
ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(executorAddress);
ReturnT<LogResult> logResult = executorBiz.log(new LogParam(triggerTime, logId, fromLineNum));
// valid
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
if (logResult.getContent()!=null && logResult.getContent().getFromLineNum() > logResult.getContent().getToLineNum()) {
XxlJobLog jobLog = xxlJobLogDao.load(logId);
if (jobLog.getHandleCode() > 0) {
logResult.getContent().setEnd(true);
}

@ -3,8 +3,8 @@ package com.xxl.job.admin.controller.interceptor;
import com.xxl.job.admin.core.util.FtlUtil;
import com.xxl.job.admin.core.util.I18nUtil;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.AsyncHandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
@ -17,7 +17,7 @@ import java.util.HashMap;
* @author xuxueli 2015-12-12 18:09:04
*/
@Component
public class CookieInterceptor extends HandlerInterceptorAdapter {
public class CookieInterceptor implements AsyncHandlerInterceptor {
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@ -36,8 +36,7 @@ public class CookieInterceptor extends HandlerInterceptorAdapter {
if (modelAndView != null) {
modelAndView.addObject("I18nUtil", FtlUtil.generateStaticModel(I18nUtil.class.getName()));
}
super.postHandle(request, response, handler, modelAndView);
}
}

@ -6,7 +6,7 @@ import com.xxl.job.admin.core.util.I18nUtil;
import com.xxl.job.admin.service.LoginService;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import org.springframework.web.servlet.AsyncHandlerInterceptor;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
@ -18,7 +18,7 @@ import javax.servlet.http.HttpServletResponse;
* @author xuxueli 2015-12-12 18:09:04
*/
@Component
public class PermissionInterceptor extends HandlerInterceptorAdapter {
public class PermissionInterceptor implements AsyncHandlerInterceptor {
@Resource
private LoginService loginService;
@ -27,7 +27,7 @@ public class PermissionInterceptor extends HandlerInterceptorAdapter {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (!(handler instanceof HandlerMethod)) {
return super.preHandle(request, response, handler);
return true; // proceed with the next interceptor
}
// if need login
@ -53,7 +53,7 @@ public class PermissionInterceptor extends HandlerInterceptorAdapter {
request.setAttribute(LoginService.LOGIN_IDENTITY_KEY, loginUser);
}
return super.preHandle(request, response, handler);
return true; // proceed with the next interceptor
}
}

@ -80,7 +80,7 @@ public class AverageJobAllocation implements JobAllocation {
recursion(0, conn);
} catch (Exception e) {
logger.error(">>>>>>>>>>> xxl-job, JobScheduleHelper#scheduleThread error:{}", e);
logger.error(">>>>>>>>>>> xxl-job, cluster flush error:{}", e);
} finally {
// commit
if (conn != null) {
@ -147,3 +147,4 @@ public class AverageJobAllocation implements JobAllocation {
}
}

@ -1,6 +1,6 @@
admin_name=Scheduling Center
admin_name_full=Distributed Task Scheduling Platform XXL-JOB
admin_version=2.3.1-SNAPSHOT
admin_version=2.4.1-SNAPSHOT
admin_i18n=en
## system

@ -1,6 +1,6 @@
admin_name=任务调度中心
admin_name_full=分布式任务调度平台XXL-JOB
admin_version=2.3.1-SNAPSHOT
admin_version=2.4.1-SNAPSHOT
admin_i18n=
## system

@ -1,6 +1,6 @@
admin_name=任務調度中心
admin_name_full=分布式任務調度平臺XXL-JOB
admin_version=2.3.1-SNAPSHOT
admin_version=2.4.1-SNAPSHOT
admin_i18n=
## system

@ -25,8 +25,6 @@ $(function() {
async: false, // sync, make log ordered
url : base_url + '/joblog/logDetailCat',
data : {
"executorAddress":executorAddress,
"triggerTime":triggerTime,
"logId":logId,
"fromLineNum":fromLineNum
},

@ -62,8 +62,6 @@
// 参数
var triggerCode = '${triggerCode}';
var handleCode = '${handleCode}';
var executorAddress = '${executorAddress!}';
var triggerTime = '${triggerTime?c}';
var logId = '${logId}';
</script>
<script src="${request.contextPath}/static/js/joblog.detail.1.js"></script>

@ -3,6 +3,8 @@ package com.xxl.job.admin.controller;
import com.xxl.job.admin.service.LoginService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.util.LinkedMultiValueMap;
@ -13,6 +15,7 @@ import javax.servlet.http.Cookie;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
public class JobInfoControllerTest extends AbstractSpringMvcTest {
private static Logger logger = LoggerFactory.getLogger(JobInfoControllerTest.class);
private Cookie cookie;
@ -41,7 +44,7 @@ public class JobInfoControllerTest extends AbstractSpringMvcTest {
.cookie(cookie)
).andReturn();
System.out.println(ret.getResponse().getContentAsString());
logger.info(ret.getResponse().getContentAsString());
}
}

@ -4,6 +4,8 @@ import com.xxl.job.admin.core.model.XxlJobInfo;
import com.xxl.job.admin.core.scheduler.MisfireStrategyEnum;
import com.xxl.job.admin.core.scheduler.ScheduleTypeEnum;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
@ -12,6 +14,7 @@ import java.util.List;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class XxlJobInfoDaoTest {
private static Logger logger = LoggerFactory.getLogger(XxlJobInfoDaoTest.class);
@Resource
private XxlJobInfoDao xxlJobInfoDao;
@ -20,9 +23,9 @@ public class XxlJobInfoDaoTest {
public void pageList(){
List<XxlJobInfo> list = xxlJobInfoDao.pageList(0, 20, 0, -1, null, null, null);
int list_count = xxlJobInfoDao.pageListCount(0, 20, 0, -1, null, null, null);
System.out.println(list);
System.out.println(list_count);
logger.info("", list);
logger.info("", list_count);
List<XxlJobInfo> list2 = xxlJobInfoDao.getJobsByGroup(1);
}

@ -2,6 +2,8 @@ package com.xxl.job.admin.util;
import com.xxl.job.admin.core.util.I18nUtil;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
/**
@ -11,12 +13,13 @@ import org.springframework.boot.test.context.SpringBootTest;
*/
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class I18nUtilTest {
private static Logger logger = LoggerFactory.getLogger(I18nUtilTest.class);
@Test
public void test(){
System.out.println(I18nUtil.getString("admin_name"));
System.out.println(I18nUtil.getMultString("admin_name", "admin_name_full"));
System.out.println(I18nUtil.getMultString());
logger.info(I18nUtil.getString("admin_name"));
logger.info(I18nUtil.getMultString("admin_name", "admin_name_full"));
logger.info(I18nUtil.getMultString());
}
}

@ -4,7 +4,7 @@
<parent>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job</artifactId>
<version>2.3.1-SNAPSHOT</version>
<version>2.4.1-SNAPSHOT</version>
</parent>
<artifactId>xxl-job-core</artifactId>
<packaging>jar</packaging>
@ -18,8 +18,8 @@
<!-- ********************** embed server: netty + gson ********************** -->
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>${netty-all.version}</version>
<artifactId>netty-codec-http</artifactId>
<version>${netty.version}</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
@ -30,7 +30,7 @@
<!-- ********************** plugin ********************** -->
<!-- groovy-all -->
<dependency>
<groupId>org.codehaus.groovy</groupId>
<groupId>org.apache.groovy</groupId>
<artifactId>groovy</artifactId>
<version>${groovy.version}</version>
</dependency>

@ -85,6 +85,7 @@ public class XxlJobExecutor {
//TODO 初始化XXLJOB服务
initEmbedServer(address, ip, port, appname, accessToken);
}
public void destroy(){
// destroy executor-server
stopEmbedServer();
@ -140,6 +141,7 @@ public class XxlJobExecutor {
}
}
}
public static List<AdminBiz> getAdminBizList(){
return adminBizList;
}
@ -265,6 +267,7 @@ public class XxlJobExecutor {
return newJobThread;
}
public static JobThread removeJobThread(int jobId, String removeOldReason){
JobThread oldJobThread = jobThreadRepository.remove(jobId);
if (oldJobThread != null) {
@ -275,9 +278,8 @@ public class XxlJobExecutor {
}
return null;
}
public static JobThread loadJobThread(int jobId){
JobThread jobThread = jobThreadRepository.get(jobId);
return jobThread;
return jobThreadRepository.get(jobId);
}
}

@ -3,7 +3,6 @@ package com.xxl.job.core.executor.impl;
import com.xxl.job.core.executor.XxlJobExecutor;
import com.xxl.job.core.glue.GlueFactory;
import com.xxl.job.core.handler.annotation.XxlJob;
import com.xxl.job.core.handler.impl.MethodJobHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
@ -11,6 +10,7 @@ import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.SmartInitializingSingleton;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Lazy;
import org.springframework.core.MethodIntrospector;
import org.springframework.core.annotation.AnnotatedElementUtils;
@ -94,8 +94,18 @@ public class XxlJobSpringExecutor extends XxlJobExecutor implements ApplicationC
// init job handler from method
String[] beanDefinitionNames = applicationContext.getBeanNamesForType(Object.class, false, true);
for (String beanDefinitionName : beanDefinitionNames) {
Object bean = applicationContext.getBean(beanDefinitionName);
// get bean
Object bean = null;
Lazy onBean = applicationContext.findAnnotationOnBean(beanDefinitionName, Lazy.class);
if (onBean!=null){
logger.debug("xxl-job annotation scan, skip @Lazy Bean:{}", beanDefinitionName);
continue;
}else {
bean = applicationContext.getBean(beanDefinitionName);
}
// filter method
Map<Method, XxlJob> annotatedMethods = null; // referred to org.springframework.context.event.EventListenerMethodProcessor.processBean
try {
annotatedMethods = MethodIntrospector.selectMethods(bean.getClass(),
@ -112,12 +122,14 @@ public class XxlJobSpringExecutor extends XxlJobExecutor implements ApplicationC
continue;
}
// generate and regist method job handler
for (Map.Entry<Method, XxlJob> methodXxlJobEntry : annotatedMethods.entrySet()) {
Method executeMethod = methodXxlJobEntry.getKey();
XxlJob xxlJob = methodXxlJobEntry.getValue();
// regist
registJobHandler(xxlJob, bean, executeMethod);
}
}
}
@ -133,4 +145,13 @@ public class XxlJobSpringExecutor extends XxlJobExecutor implements ApplicationC
return applicationContext;
}
/*
BeanDefinitionRegistryPostProcessor
registry.getBeanDefine()
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
this.registry = registry;
}
* */
}

@ -5,7 +5,7 @@
<parent>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job</artifactId>
<version>2.3.1-SNAPSHOT</version>
<version>2.4.1-SNAPSHOT</version>
</parent>
<artifactId>xxl-job-executor-samples</artifactId>
<packaging>pom</packaging>

@ -6,7 +6,7 @@
<parent>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-executor-samples</artifactId>
<version>2.3.1-SNAPSHOT</version>
<version>2.4.1-SNAPSHOT</version>
</parent>
<artifactId>xxl-job-executor-sample-frameless</artifactId>
<packaging>jar</packaging>

@ -2,7 +2,7 @@
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
### xxl-job, access token
xxl.job.accessToken=
xxl.job.accessToken=default_token
### xxl-job executor appname
xxl.job.executor.appname=xxl-job-executor-sample

@ -6,7 +6,7 @@
<parent>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-executor-samples</artifactId>
<version>2.3.1-SNAPSHOT</version>
<version>2.4.1-SNAPSHOT</version>
</parent>
<artifactId>xxl-job-executor-sample-springboot</artifactId>
<packaging>jar</packaging>

@ -11,7 +11,7 @@ logging.config=classpath:logback.xml
xxl.job.admin.addresses=http://127.0.0.1:8081/xxl-job-admin
### xxl-job, access token
xxl.job.accessToken=
xxl.job.accessToken=default_token
### xxl-job executor appname
xxl.job.executor.appname=xxl-job-executor-sample

Loading…
Cancel
Save