diff --git a/README.md b/README.md index 6502f6b3..27bbf245 100644 --- a/README.md +++ b/README.md @@ -117,6 +117,8 @@ XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅 于2020-11-16,XXL-JOB参与"[2020年度最受欢迎中国开源软件](https://www.oschina.net/project/top_cn_2020)"评比,在当时已录入的一万多个开源项目中角逐,最终排名"开发框架和基础组件类"第8名。 +于2021-12-06,XXL-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 diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 7077d996..e5ed9587 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -87,6 +87,8 @@ XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅 于2020-11-16,XXL-JOB参与"[2020年度最受欢迎中国开源软件](https://www.oschina.net/project/top_cn_2020)"评比,在当时已录入的一万多个开源项目中角逐,最终排名"开发框架和基础组件类"第8名。 +于2021-12-06,XXL-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. diff --git a/pom.xml b/pom.xml index f60aa5c1..a1ffaf2d 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.xuxueli xxl-job - 2.3.1-SNAPSHOT + 2.4.1-SNAPSHOT pom ${project.artifactId} @@ -24,25 +24,24 @@ 1.8 true - 4.1.63.Final - 2.8.6 + 4.1.90.Final + 2.10.1 - 5.3.6 - 2.4.5 + 5.3.26 + 2.7.9 - 2.1.4 - 8.0.24 + 2.3.0 + 8.0.32 - 1.7.30 - 5.7.1 + 1.7.36 + 5.9.2 1.3.2 - 3.0.8 + 4.0.10 3.2.1 - 3.2.0 - 1.6 - 3.3.1 + 3.5.0 + 3.0.1 diff --git a/xxl-job-admin/pom.xml b/xxl-job-admin/pom.xml index 5ff4f5c8..4d316707 100644 --- a/xxl-job-admin/pom.xml +++ b/xxl-job-admin/pom.xml @@ -4,7 +4,7 @@ com.xuxueli xxl-job - 2.3.1-SNAPSHOT + 2.4.1-SNAPSHOT xxl-job-admin jar @@ -61,9 +61,9 @@ - mysql - mysql-connector-java - ${mysql-connector-java.version} + com.mysql + mysql-connector-j + ${mysql-connector-j.version} diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java index 4bb4b90a..8e0c5a4d 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java @@ -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 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 save(XxlJobGroup xxlJobGroup){ // valid @@ -102,6 +106,7 @@ public class JobGroupController { @RequestMapping("/update") @ResponseBody + @PermissionLimit(adminuser = true) public ReturnT 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 remove(int id){ // valid @@ -189,6 +195,7 @@ public class JobGroupController { @RequestMapping("/loadById") @ResponseBody + @PermissionLimit(adminuser = true) public ReturnT loadById(int id){ XxlJobGroup jobGroup = xxlJobGroupDao.load(id); return jobGroup!=null?new ReturnT(jobGroup):new ReturnT(ReturnT.FAIL_CODE, null); diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java index dcf5bb83..67faebcc 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java @@ -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 logDetailCat(String executorAddress, long triggerTime, long logId, int fromLineNum){ + public ReturnT logDetailCat(long logId, int fromLineNum){ try { - ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(executorAddress); - ReturnT 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(ReturnT.FAIL_CODE, I18nUtil.getString("joblog_logid_unvalid")); + } + + // log cat + ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(jobLog.getExecutorAddress()); + ReturnT 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); } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/CookieInterceptor.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/CookieInterceptor.java index 8c2437ef..930b9e8a 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/CookieInterceptor.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/CookieInterceptor.java @@ -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); + } } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java index 8ac2e40b..ecb28114 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java @@ -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 } } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AverageJobAllocation.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AverageJobAllocation.java index 42a6e3e6..4f8c15d6 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AverageJobAllocation.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AverageJobAllocation.java @@ -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 { } } + diff --git a/xxl-job-admin/src/main/resources/i18n/message_en.properties b/xxl-job-admin/src/main/resources/i18n/message_en.properties index 7d67636d..2ca59155 100644 --- a/xxl-job-admin/src/main/resources/i18n/message_en.properties +++ b/xxl-job-admin/src/main/resources/i18n/message_en.properties @@ -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 diff --git a/xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties b/xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties index 4897a238..dc00c697 100644 --- a/xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties +++ b/xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties @@ -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 diff --git a/xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties b/xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties index 57d28e4f..2152c298 100755 --- a/xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties +++ b/xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties @@ -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 diff --git a/xxl-job-admin/src/main/resources/static/js/joblog.detail.1.js b/xxl-job-admin/src/main/resources/static/js/joblog.detail.1.js index ddefd466..0638eee2 100644 --- a/xxl-job-admin/src/main/resources/static/js/joblog.detail.1.js +++ b/xxl-job-admin/src/main/resources/static/js/joblog.detail.1.js @@ -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 }, diff --git a/xxl-job-admin/src/main/resources/templates/joblog/joblog.detail.ftl b/xxl-job-admin/src/main/resources/templates/joblog/joblog.detail.ftl index 3881cfa6..bb8072f9 100644 --- a/xxl-job-admin/src/main/resources/templates/joblog/joblog.detail.ftl +++ b/xxl-job-admin/src/main/resources/templates/joblog/joblog.detail.ftl @@ -62,8 +62,6 @@ // 参数 var triggerCode = '${triggerCode}'; var handleCode = '${handleCode}'; - var executorAddress = '${executorAddress!}'; - var triggerTime = '${triggerTime?c}'; var logId = '${logId}'; diff --git a/xxl-job-admin/src/test/java/com/xxl/job/admin/controller/JobInfoControllerTest.java b/xxl-job-admin/src/test/java/com/xxl/job/admin/controller/JobInfoControllerTest.java index a8231cbe..49bf8aec 100644 --- a/xxl-job-admin/src/test/java/com/xxl/job/admin/controller/JobInfoControllerTest.java +++ b/xxl-job-admin/src/test/java/com/xxl/job/admin/controller/JobInfoControllerTest.java @@ -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()); } } diff --git a/xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobInfoDaoTest.java b/xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobInfoDaoTest.java index 4fce17ec..0cb7d53c 100644 --- a/xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobInfoDaoTest.java +++ b/xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobInfoDaoTest.java @@ -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 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 list2 = xxlJobInfoDao.getJobsByGroup(1); } diff --git a/xxl-job-admin/src/test/java/com/xxl/job/admin/util/I18nUtilTest.java b/xxl-job-admin/src/test/java/com/xxl/job/admin/util/I18nUtilTest.java index a62541f7..29079f18 100644 --- a/xxl-job-admin/src/test/java/com/xxl/job/admin/util/I18nUtilTest.java +++ b/xxl-job-admin/src/test/java/com/xxl/job/admin/util/I18nUtilTest.java @@ -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()); } } diff --git a/xxl-job-core/pom.xml b/xxl-job-core/pom.xml index 48f3d50d..a91472be 100644 --- a/xxl-job-core/pom.xml +++ b/xxl-job-core/pom.xml @@ -4,7 +4,7 @@ com.xuxueli xxl-job - 2.3.1-SNAPSHOT + 2.4.1-SNAPSHOT xxl-job-core jar @@ -18,8 +18,8 @@ io.netty - netty-all - ${netty-all.version} + netty-codec-http + ${netty.version} com.google.code.gson @@ -30,7 +30,7 @@ - org.codehaus.groovy + org.apache.groovy groovy ${groovy.version} diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java b/xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java index 9c41e72e..e3fb55c5 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java @@ -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 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); } - } diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/executor/impl/XxlJobSpringExecutor.java b/xxl-job-core/src/main/java/com/xxl/job/core/executor/impl/XxlJobSpringExecutor.java index 30134667..d3c9062c 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/executor/impl/XxlJobSpringExecutor.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/executor/impl/XxlJobSpringExecutor.java @@ -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 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 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; + } + * */ + } diff --git a/xxl-job-executor-samples/pom.xml b/xxl-job-executor-samples/pom.xml index 712daf11..4f98415e 100644 --- a/xxl-job-executor-samples/pom.xml +++ b/xxl-job-executor-samples/pom.xml @@ -5,7 +5,7 @@ com.xuxueli xxl-job - 2.3.1-SNAPSHOT + 2.4.1-SNAPSHOT xxl-job-executor-samples pom diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-frameless/pom.xml b/xxl-job-executor-samples/xxl-job-executor-sample-frameless/pom.xml index 39482c54..500cdb48 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-frameless/pom.xml +++ b/xxl-job-executor-samples/xxl-job-executor-sample-frameless/pom.xml @@ -6,7 +6,7 @@ com.xuxueli xxl-job-executor-samples - 2.3.1-SNAPSHOT + 2.4.1-SNAPSHOT xxl-job-executor-sample-frameless jar diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-frameless/src/main/resources/xxl-job-executor.properties b/xxl-job-executor-samples/xxl-job-executor-sample-frameless/src/main/resources/xxl-job-executor.properties index 15a803a6..9b1ab8a7 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-frameless/src/main/resources/xxl-job-executor.properties +++ b/xxl-job-executor-samples/xxl-job-executor-sample-frameless/src/main/resources/xxl-job-executor.properties @@ -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 diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/pom.xml b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/pom.xml index 16ac25c0..c0570081 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/pom.xml +++ b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/pom.xml @@ -6,7 +6,7 @@ com.xuxueli xxl-job-executor-samples - 2.3.1-SNAPSHOT + 2.4.1-SNAPSHOT xxl-job-executor-sample-springboot jar diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/application.properties b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/application.properties index bfd8eabb..f00e877a 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/application.properties +++ b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/application.properties @@ -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