From 0361025d573bcac59c6fc479da096ca0465559ad Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Thu, 31 Aug 2017 22:43:40 +0800 Subject: [PATCH 01/93] =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E8=A7=A6=E5=8F=91?= =?UTF-8?q?=EF=BC=9A=E9=99=A4=E4=BA=86"Cron=E6=96=B9=E5=BC=8F"=E5=92=8C"?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E4=BE=9D=E8=B5=96=E6=96=B9=E5=BC=8F"?= =?UTF-8?q?=E8=A7=A6=E5=8F=91=E4=BB=BB=E5=8A=A1=E6=89=A7=E8=A1=8C=E4=B9=8B?= =?UTF-8?q?=E5=A4=96=EF=BC=8C=E6=94=AF=E6=8C=81=E5=9F=BA=E4=BA=8E=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=E7=9A=84=E8=A7=A6=E5=8F=91=E4=BB=BB=E5=8A=A1=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=E3=80=82=E8=B0=83=E5=BA=A6=E4=B8=AD=E5=BF=83=E6=8F=90?= =?UTF-8?q?=E4=BE=9B=E8=A7=A6=E5=8F=91=E4=BB=BB=E5=8A=A1=E5=8D=95=E6=AC=A1?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=E7=9A=84API=E6=9C=8D=E5=8A=A1=EF=BC=8C?= =?UTF-8?q?=E5=8F=AF=E6=A0=B9=E6=8D=AE=E4=B8=9A=E5=8A=A1=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E7=81=B5=E6=B4=BB=E8=A7=A6=E5=8F=91=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 32 +++++++++++++++++-- .../com/xxl/job/dao/impl/AdminBizTest.java | 18 ++++++++++- 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 143b1305..d19e3fa3 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -36,6 +36,7 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 - 22、失败处理策略;调度失败时的处理策略,策略包括:失败告警(默认)、失败重试; - 23、分片广播任务:执行器集群部署时,任务路由策略选择"分片广播"情况下,一次任务调度将会广播触发集群中所有执行器执行一次任务,可根据分片参数开发分片任务; - 24、动态分片:分片广播任务以执行器为维度进行分片,支持动态扩容执行器集群从而动态增加分片数量,协同进行业务处理;在进行大数据量业务操作时可显著提升任务处理能力和速度。 +- 25、事件触发:除了"Cron方式"和"任务依赖方式"触发任务执行之外,支持基于事件的触发任务方式。调度中心提供触发任务单次执行的API服务,可根据业务事件灵活触发。 ### 1.3 发展 于2015年中,我在github上创建XXL-JOB项目仓库并提交第一个commit,随之进行系统结构设计,UI选型,交互设计…… @@ -174,7 +175,7 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 ### 2.3 配置部署“调度中心” 调度中心项目:xxl-job-admin - 作用:统一管理任务调度平台上调度任务,负责触发调度执行。 + 作用:统一管理任务调度平台上调度任务,负责触发调度执行,并且提供任务管理平台。 #### 步骤一:调度中心配置: 调度中心配置文件地址: @@ -223,7 +224,7 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 ### 2.4 配置部署“执行器项目” “执行器”项目:xxl-job-executor-sample-spring (如新建执行器项目,可参考该Sample示例执行器项目的配置步骤;) - 作用:负责接收“调度中心”的调度并执行; + 作用:负责接收“调度中心”的调度并执行;可直接部署执行器,也可以将执行器集成到现有业务项目中。 #### 步骤一:maven依赖 确认pom文件中引入了 "xxl-job-core" 的maven依赖; @@ -779,6 +780,31 @@ XXL-JOB会为每次调度请求生成一个单独的日志文件,需要通过 - 设置一:调度中心和执行器,均不设置AccessToken;关闭安全性校验; - 设置二:调度中心和执行器,设置了相同的AccessToken; +### 5.11 调度中心API服务 +调度中心提供了API服务,供执行器和业务方选择使用,目前提供的API服务有: + + 1、任务结果回调服务; + 2、执行器注册服务; + 3、执行器注册摘除服务; + 4、触发任务单次执行器服务; + +调度中心API服务位置:com.xxl.job.core.biz.AdminBiz.java + +调度中心API服务请求参考代码:com.xxl.job.dao.impl.AdminBizTest.java +``` +// 该地址为调度中心部署跟地址,如果调度中心部署地址变动需要做相应调整 +String addressUrl = "http://127.0.0.1:8080/xxl-job-admin".concat(AdminBiz.MAPPING); +String accessToken = null; + +AdminBiz adminBiz = (AdminBiz) new NetComClientProxy(AdminBiz.class, addressUrl, accessToken).getObject(); + +// 任务ID +int jobId = 1; +ReturnT returnT = adminBiz.triggerJob(jobId); +Assert.assertTrue(returnT.getCode() == ReturnT.SUCCESS_CODE); + +``` + ## 六、版本更新日志 ### 6.1 版本 V1.1.x,新特性[2015-12-05] @@ -992,7 +1018,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 7、执行器注册线程销毁时, 主动摘除注册机器信息,提高执行器注册的实时性; - 8、调度中心任务监控线程销毁时,批量对失败任务告警,防止告警信息丢失; - 9、调度中心API服务:支持API方式触发任务执行; -- 10、事件调度:系统支持Cron、子任务触发、事件触发(API)三种方式触发任务调度; +- 10、事件触发:除了"Cron方式"和"任务依赖方式"触发任务执行之外,支持基于事件的触发任务方式。调度中心提供触发任务单次执行的API服务,可根据业务事件灵活触发。 ### TODO LIST - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限; diff --git a/xxl-job-admin/src/test/java/com/xxl/job/dao/impl/AdminBizTest.java b/xxl-job-admin/src/test/java/com/xxl/job/dao/impl/AdminBizTest.java index 6402b8a0..6ccea517 100644 --- a/xxl-job-admin/src/test/java/com/xxl/job/dao/impl/AdminBizTest.java +++ b/xxl-job-admin/src/test/java/com/xxl/job/dao/impl/AdminBizTest.java @@ -9,7 +9,8 @@ import org.junit.Assert; import org.junit.Test; /** - * admin-api client, test + * admin api test + * * @author xuxueli 2017-07-28 22:14:52 */ public class AdminBizTest { @@ -18,6 +19,11 @@ public class AdminBizTest { private static String addressUrl = "http://127.0.0.1:8080/xxl-job-admin".concat(AdminBiz.MAPPING); private static String accessToken = null; + /** + * registry executor + * + * @throws Exception + */ @Test public void registryTest() throws Exception { AdminBiz adminBiz = (AdminBiz) new NetComClientProxy(AdminBiz.class, addressUrl, accessToken).getObject(); @@ -28,6 +34,11 @@ public class AdminBizTest { Assert.assertTrue(returnT.getCode() == ReturnT.SUCCESS_CODE); } + /** + * registry executor remove + * + * @throws Exception + */ @Test public void registryRemove() throws Exception { AdminBiz adminBiz = (AdminBiz) new NetComClientProxy(AdminBiz.class, addressUrl, accessToken).getObject(); @@ -38,6 +49,11 @@ public class AdminBizTest { Assert.assertTrue(returnT.getCode() == ReturnT.SUCCESS_CODE); } + /** + * trigger job for once + * + * @throws Exception + */ @Test public void triggerJob() throws Exception { AdminBiz adminBiz = (AdminBiz) new NetComClientProxy(AdminBiz.class, addressUrl, accessToken).getObject(); From 2f22bb45203f7bca410adf44f28a3203a09e1b22 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Thu, 31 Aug 2017 22:47:45 +0800 Subject: [PATCH 02/93] =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E8=A7=A6=E5=8F=91?= =?UTF-8?q?=EF=BC=9A=E9=99=A4=E4=BA=86"Cron=E6=96=B9=E5=BC=8F"=E5=92=8C"?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E4=BE=9D=E8=B5=96=E6=96=B9=E5=BC=8F"?= =?UTF-8?q?=E8=A7=A6=E5=8F=91=E4=BB=BB=E5=8A=A1=E6=89=A7=E8=A1=8C=E4=B9=8B?= =?UTF-8?q?=E5=A4=96=EF=BC=8C=E6=94=AF=E6=8C=81=E5=9F=BA=E4=BA=8E=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=E7=9A=84=E8=A7=A6=E5=8F=91=E4=BB=BB=E5=8A=A1=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=E3=80=82=E8=B0=83=E5=BA=A6=E4=B8=AD=E5=BF=83=E6=8F=90?= =?UTF-8?q?=E4=BE=9B=E8=A7=A6=E5=8F=91=E4=BB=BB=E5=8A=A1=E5=8D=95=E6=AC=A1?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=E7=9A=84API=E6=9C=8D=E5=8A=A1=EF=BC=8C?= =?UTF-8?q?=E5=8F=AF=E6=A0=B9=E6=8D=AE=E4=B8=9A=E5=8A=A1=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E7=81=B5=E6=B4=BB=E8=A7=A6=E5=8F=91=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index d19e3fa3..50b08719 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -786,7 +786,7 @@ XXL-JOB会为每次调度请求生成一个单独的日志文件,需要通过 1、任务结果回调服务; 2、执行器注册服务; 3、执行器注册摘除服务; - 4、触发任务单次执行器服务; + 4、触发任务单次执行服务,支持任务根据业务事件触发; 调度中心API服务位置:com.xxl.job.core.biz.AdminBiz.java From 7f00d8b8e17f8cc77fc4bd8e280e502280ac1467 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Thu, 31 Aug 2017 23:06:05 +0800 Subject: [PATCH 03/93] =?UTF-8?q?=E6=9B=B4=E6=96=B0RM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +++ doc/XXL-JOB-English-Documentation.md | 17 +++++++++++++++++ doc/XXL-JOB官方文档.md | 15 ++------------- 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 1c9c2678..907bca30 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,7 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 - 22、失败处理策略;调度失败时的处理策略,策略包括:失败告警(默认)、失败重试; - 23、分片广播任务:执行器集群部署时,任务路由策略选择"分片广播"情况下,一次任务调度将会广播触发对应集群中所有执行器执行一次任务,同时传递分片参数;可根据分片参数开发分片任务; - 24、动态分片:分片广播任务以执行器为维度进行分片,支持动态扩容执行器集群从而动态增加分片数量,协同进行业务处理;在进行大数据量业务操作时可显著提升任务处理能力和速度。 +- 25、事件触发:除了"Cron方式"和"任务依赖方式"触发任务执行之外,支持基于事件的触发任务方式。调度中心提供触发任务单次执行的API服务,可根据业务事件灵活触发。 ## Development @@ -127,6 +128,8 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 - 41、广州瀚农网络科技有限公司 - 42、享点科技有限公司 - 43、杭州比智科技有限公司 + - 44、圳临界线网络科技有限公司 + - 45、广州知识圈网络科技有限公司 - …… > 更多接入的公司,欢迎在 [登记地址](https://github.com/xuxueli/xxl-job/issues/1 ) 登记,登记仅仅为了产品推广。 diff --git a/doc/XXL-JOB-English-Documentation.md b/doc/XXL-JOB-English-Documentation.md index d949a5d0..bc760a63 100644 --- a/doc/XXL-JOB-English-Documentation.md +++ b/doc/XXL-JOB-English-Documentation.md @@ -35,6 +35,9 @@ XXL-JOB is a lightweight distributed task scheduling framework, the core design - 22.Failure handling strategy:Handling strategy when scheduling fails, the strategy includes: failure alarm (default), failure retry; - 23.Sharding broadcast task: When an executor cluster is deployed, task routing strategy select "sharding broadcast", a task schedule will broadcast all the actuators in the cluster to perform it once, you can develop sharding tasks based on sharding parameters; - 24.Dynamic sharding: The sharding broadcast task is sharded by the executors to support the dynamic expansion of the executor cluster to dynamically increase the number of shardings and cooperate with the business handle; In the large amount of data operations can significantly improve the task processing capacity and speed. +- 25、Event trigger:In addition to "Cron" and "Task Dependency" to trigger tasks, support event-based triggering tasks. The dispatch center provides API service that triggers a single execution of the task, it can be triggered flexibly according to business events. + + ### 1.3 Development In 2015, I created the XXL-JOB project repository on github and submitted the first commit, followed by the system structure design, UI selection, interactive design ... In 2015 - November, XXL-JOB finally RELEASE the first big version of V1.0, then I will be released to OSCHINA, XXL-JOB OSCHINA won the popular recommendation of @红薯, the same period reached OSCHINA's " Popular move "ranked first and git.oschina open source software monthly heat ranked first, especially thanks for @红薯, thank you for the attention and support. @@ -89,6 +92,8 @@ So far, XXL-JOB has access to a number of companies online product line, access - 41、广州瀚农网络科技有限公司 - 42、享点科技有限公司 - 43、杭州比智科技有限公司 + - 44、圳临界线网络科技有限公司 + - 45、广州知识圈网络科技有限公司 - …… > The company that access and use this product is welcome to register at the [address](https://github.com/xuxueli/xxl-job/issues/1 ), only for product promotion. @@ -758,6 +763,18 @@ There are only two settings when communication between scheduler center and exec - one:do not configure AccessToken on both, close security check. - two:configure the same AccessToken on both; +### 5.11 Dispatching center API services +The scheduling center provides API services for executors and business parties to choose to use, and the currently available API services are available. + + 1. Job result callback service; + 2. Executor registration service; + 3. Executor registration remove services; + 4. Triggers a single execution service, and support the task to be triggered according to the business event; + +The scheduling center API service location: com.xxl.job.core.biz.AdminBiz.java + +The scheduling center API service requests reference code:com.xxl.job.dao.impl.AdminBizTest.java + ## 6 Version update log ### 6.1 version V1.1.x,New features [2015-12-05] diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 50b08719..c205ff9b 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -97,6 +97,8 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 - 41、广州瀚农网络科技有限公司 - 42、享点科技有限公司 - 43、杭州比智科技有限公司 + - 44、圳临界线网络科技有限公司 + - 45、广州知识圈网络科技有限公司 - …… > 更多接入的公司,欢迎在 [登记地址](https://github.com/xuxueli/xxl-job/issues/1 ) 登记,登记仅仅为了产品推广。 @@ -791,19 +793,6 @@ XXL-JOB会为每次调度请求生成一个单独的日志文件,需要通过 调度中心API服务位置:com.xxl.job.core.biz.AdminBiz.java 调度中心API服务请求参考代码:com.xxl.job.dao.impl.AdminBizTest.java -``` -// 该地址为调度中心部署跟地址,如果调度中心部署地址变动需要做相应调整 -String addressUrl = "http://127.0.0.1:8080/xxl-job-admin".concat(AdminBiz.MAPPING); -String accessToken = null; - -AdminBiz adminBiz = (AdminBiz) new NetComClientProxy(AdminBiz.class, addressUrl, accessToken).getObject(); - -// 任务ID -int jobId = 1; -ReturnT returnT = adminBiz.triggerJob(jobId); -Assert.assertTrue(returnT.getCode() == ReturnT.SUCCESS_CODE); - -``` ## 六、版本更新日志 From 2d663371e79cc419f8e99504caa5f40813d384a0 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Thu, 31 Aug 2017 23:26:36 +0800 Subject: [PATCH 04/93] =?UTF-8?q?=E6=9B=B4=E6=96=B0RM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- doc/XXL-JOB官方文档.md | 17 +---------------- 2 files changed, 2 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 907bca30..147fb626 100644 --- a/README.md +++ b/README.md @@ -166,7 +166,7 @@ This product is open source and free, and will continue to provide free communit ## Donate No matter how much the amount is enough to express your thought, thank you very much :) -无论金额多少都足够表达您这份心意,非常感谢 :) +无论金额多少都足够表达您这份心意,非常感谢 :) [XXL系列捐赠记录](http://www.xueli.com/page/donate.html ) 微信: 支付宝: diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index c205ff9b..f231a942 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1038,22 +1038,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 --- ### 捐赠 -无论金额多少都足够表达您这份心意,非常感谢 :) +无论金额多少都足够表达您这份心意,非常感谢 :) [XXL系列捐赠记录](http://www.xueli.com/page/donate.html ) 微信: 支付宝: - -> 自2017-03-29起XXL系列接收用户捐赠,捐赠记录如下, 感谢你们的支持!: - -捐赠时间 | 金额 | 名称 | 留言 ---- | --- | --- | --- -2017-08-17 | 10.00¥ | 微信 | 不行,还得感谢一把 -2017-08-17 | 10.00¥ | 微信 | 感谢,好项目,好作者 -2017-08-16 | 3.00¥ | 微信 | -2017-06-30 | 10.00¥ | 石头哥哥* | 支持下xxl开源系列 -2017-06-16 | 10.00¥ | 劳巴* | xxl-job对我的帮助很大,辛苦你们的帮助,辛苦了! -2017-06-12 | 6.66¥ | 凌浦* | -2017-06-12 | 10.00¥ | Henry* | 支持XXL -2017-06-12 | 10.00¥ | loioi* | 感谢您的开源项目! -2017-05-10 | 10.00¥ | 阿杜杜不是阿木木* | 感谢您的开源项目! - From 2d160021d2473e36ae4b422ba16296abb5930210 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Thu, 31 Aug 2017 23:27:54 +0800 Subject: [PATCH 05/93] =?UTF-8?q?=E6=9B=B4=E6=96=B0RM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- doc/XXL-JOB官方文档.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 147fb626..d20df562 100644 --- a/README.md +++ b/README.md @@ -166,7 +166,7 @@ This product is open source and free, and will continue to provide free communit ## Donate No matter how much the amount is enough to express your thought, thank you very much :) -无论金额多少都足够表达您这份心意,非常感谢 :) [XXL系列捐赠记录](http://www.xueli.com/page/donate.html ) +无论金额多少都足够表达您这份心意,非常感谢 :) [XXL系列捐赠记录](http://www.xuxueli.com/page/donate.html ) 微信: 支付宝: diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index f231a942..8ffe724b 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1038,7 +1038,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 --- ### 捐赠 -无论金额多少都足够表达您这份心意,非常感谢 :) [XXL系列捐赠记录](http://www.xueli.com/page/donate.html ) +无论金额多少都足够表达您这份心意,非常感谢 :) [XXL系列捐赠记录](http://www.xuxueli.com/page/donate.html ) 微信: 支付宝: From f5ebe8f70449b2420af398f69cc847b485a9f994 Mon Sep 17 00:00:00 2001 From: Kevin Date: Fri, 1 Sep 2017 23:28:55 +0800 Subject: [PATCH 06/93] =?UTF-8?q?1.=E6=B7=BB=E5=8A=A0GLUE=5FNODEJS?= =?UTF-8?q?=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../template/jobcode/jobcode.index.ftl | 1 + .../template/jobinfo/jobinfo.index.ftl | 12 +- .../main/webapp/static/js/jobcode.index.1.js | 2 + .../main/webapp/static/js/jobinfo.index.1.js | 4 + .../main/webapp/static/js/joblog.index.1.js | 2 + .../codemirror/mode/javascript/javascript.js | 838 ++++++++++++++++++ .../job/core/biz/impl/ExecutorBizImpl.java | 3 +- .../com/xxl/job/core/glue/GlueTypeEnum.java | 3 +- .../core/handler/impl/ScriptJobHandler.java | 3 + 9 files changed, 865 insertions(+), 3 deletions(-) create mode 100644 xxl-job-admin/src/main/webapp/static/plugins/codemirror/mode/javascript/javascript.js diff --git a/xxl-job-admin/src/main/webapp/WEB-INF/template/jobcode/jobcode.index.ftl b/xxl-job-admin/src/main/webapp/WEB-INF/template/jobcode/jobcode.index.ftl index a07617c7..77cec12e 100644 --- a/xxl-job-admin/src/main/webapp/WEB-INF/template/jobcode/jobcode.index.ftl +++ b/xxl-job-admin/src/main/webapp/WEB-INF/template/jobcode/jobcode.index.ftl @@ -113,6 +113,7 @@ + - - - - + + diff --git a/xxl-job-admin/src/main/webapp/static/js/jobcode.index.1.js b/xxl-job-admin/src/main/webapp/static/js/jobcode.index.1.js index f8ab5abc..9c89237c 100644 --- a/xxl-job-admin/src/main/webapp/static/js/jobcode.index.1.js +++ b/xxl-job-admin/src/main/webapp/static/js/jobcode.index.1.js @@ -8,36 +8,28 @@ $(function() { });*/ var codeEditor; - function initIde(glueType, glueSource) { - var ideMode = "text/x-java"; - if ('GLUE_GROOVY'==glueType){ - ideMode = "text/x-java"; - } else if ('GLUE_SHELL'==glueType){ - ideMode = "text/x-sh"; - } else if ('GLUE_PYTHON'==glueType){ - ideMode = "text/x-python"; - } else if ('GLUE_NODEJS'==glueType){ - ideMode = "text/javascript" + function initIde(glueSource) { + if (codeEditor == null) { + codeEditor = CodeMirror(document.getElementById("ideWindow"), { + mode : ideMode, + lineNumbers : true, + matchBrackets : true, + value: glueSource + }); + } else { + codeEditor.setValue(glueSource); } - - codeEditor = CodeMirror(document.getElementById("ideWindow"), { - mode : ideMode, - lineNumbers : true, - matchBrackets : true, - value: glueSource - }); } - initIde(glueType, $("#version_now").val()); + initIde($("#version_now").val()); // code change $(".source_version").click(function(){ - var glueType = $(this).attr('glueType'); var sourceId = $(this).attr('version'); var temp = $( "#" + sourceId ).val(); - codeEditor.setValue(''); - initIde(glueType, temp); + //codeEditor.setValue(''); + initIde(temp); }); // code source save diff --git a/xxl-job-admin/src/main/webapp/static/plugins/codemirror/mode/javascript/javascript.js b/xxl-job-admin/src/main/webapp/static/plugins/codemirror/mode/javascript/javascript.js old mode 100644 new mode 100755 index d69b187d..7c09476b --- a/xxl-job-admin/src/main/webapp/static/plugins/codemirror/mode/javascript/javascript.js +++ b/xxl-job-admin/src/main/webapp/static/plugins/codemirror/mode/javascript/javascript.js @@ -11,6 +11,11 @@ })(function(CodeMirror) { "use strict"; +function expressionAllowed(stream, state, backUp) { + return /^(?:operator|sof|keyword c|case|new|export|default|[\[{}\(,;:]|=>)$/.test(state.lastType) || + (state.lastType == "quasi" && /\{\s*$/.test(stream.string.slice(0, stream.pos - (backUp || 0)))) +} + CodeMirror.defineMode("javascript", function(config, parserConfig) { var indentUnit = config.indentUnit; var statementIndent = parserConfig.statementIndent; @@ -36,12 +41,12 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) { "true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom, "this": kw("this"), "class": kw("class"), "super": kw("atom"), "yield": C, "export": kw("export"), "import": kw("import"), "extends": C, - "await": C + "await": C, "async": kw("async") }; // Extend the 'normal' keywords with the TypeScript language extensions if (isTS) { - var type = {type: "variable", style: "type"}; + var type = {type: "variable", style: "variable-3"}; var tsKeywords = { // object-like things "interface": kw("class"), @@ -49,13 +54,16 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) { "namespace": C, "module": kw("module"), "enum": kw("module"), + "type": kw("type"), // scope modifiers "public": kw("modifier"), "private": kw("modifier"), "protected": kw("modifier"), "abstract": kw("modifier"), - "readonly": kw("modifier"), + + // operators + "as": operator, // types "string": type, "number": type, "boolean": type, "any": type @@ -143,16 +151,9 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) { return ret("operator", "operator", stream.current()); } else if (wordRE.test(ch)) { stream.eatWhile(wordRE); - var word = stream.current() - if (state.lastType != ".") { - if (keywords.propertyIsEnumerable(word)) { - var kw = keywords[word] - return ret(kw.type, kw.style, word) - } - if (word == "async" && stream.match(/^\s*[\(\w]/, false)) - return ret("async", "keyword", word) - } - return ret("variable", "variable", word) + var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word]; + return (known && state.lastType != ".") ? ret(known.type, known.style, word) : + ret("variable", "variable", word); } } @@ -360,18 +361,8 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) { } if (type == "function") return cont(functiondef); if (type == "for") return cont(pushlex("form"), forspec, statement, poplex); - if (type == "variable") { - if (isTS && value == "type") { - cx.marked = "keyword" - return cont(typeexpr, expect("operator"), typeexpr, expect(";")); - } if (isTS && value == "declare") { - cx.marked = "keyword" - return cont(statement) - } else { - return cont(pushlex("stat"), maybelabel); - } - } - if (type == "switch") return cont(pushlex("form"), parenExpr, expect("{"), pushlex("}", "switch"), + if (type == "variable") return cont(pushlex("stat"), maybelabel); + if (type == "switch") return cont(pushlex("form"), parenExpr, pushlex("}", "switch"), expect("{"), block, poplex, poplex); if (type == "case") return cont(expression, expect(":")); if (type == "default") return cont(expect(":")); @@ -380,7 +371,8 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) { if (type == "class") return cont(pushlex("form"), className, poplex); if (type == "export") return cont(pushlex("stat"), afterExport, poplex); if (type == "import") return cont(pushlex("stat"), afterImport, poplex); - if (type == "module") return cont(pushlex("form"), pattern, expect("{"), pushlex("}"), block, poplex, poplex) + if (type == "module") return cont(pushlex("form"), pattern, pushlex("}"), expect("{"), block, poplex, poplex) + if (type == "type") return cont(typeexpr, expect("operator"), typeexpr, expect(";")); if (type == "async") return cont(statement) if (value == "@") return cont(expression, statement) return pass(pushlex("stat"), expression, expect(";"), poplex); @@ -398,7 +390,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) { function expressionInner(type, noComma) { if (cx.state.fatArrowAt == cx.stream.start) { var body = noComma ? arrowBodyNoComma : arrowBody; - if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, expect("=>"), body, popcontext); + if (type == "(") return cont(pushcontext, pushlex(")"), commasep(pattern, ")"), poplex, expect("=>"), body, popcontext); else if (type == "variable") return pass(pushcontext, pattern, expect("=>"), body, popcontext); } @@ -433,7 +425,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) { var expr = noComma == false ? expression : expressionNoComma; if (type == "=>") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext); if (type == "operator") { - if (/\+\+|--/.test(value) || isTS && value == "!") return cont(me); + if (/\+\+|--/.test(value)) return cont(me); if (value == "?") return cont(expression, expect(":"), expr); return cont(expr); } @@ -442,7 +434,6 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) { if (type == "(") return contCommasep(expressionNoComma, ")", "call", me); if (type == ".") return cont(property, me); if (type == "[") return cont(pushlex("]"), maybeexpression, expect("]"), poplex, me); - if (isTS && value == "as") { cx.marked = "keyword"; return cont(typeexpr, me) } } function quasi(type, value) { if (type != "quasi") return pass(); @@ -467,7 +458,6 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) { function maybeTarget(noComma) { return function(type) { if (type == ".") return cont(noComma ? targetNoComma : target); - else if (type == "variable" && isTS) return cont(maybeTypeArgs, noComma ? maybeoperatorNoComma : maybeoperatorComma) else return pass(noComma ? expressionNoComma : expression); }; } @@ -502,7 +492,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) { } else if (type == "[") { return cont(expression, expect("]"), afterprop); } else if (type == "spread") { - return cont(expression, afterprop); + return cont(expression); } else if (type == ":") { return pass(afterprop) } @@ -549,19 +539,10 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) { if (value == "?") return cont(maybetype); } } - function typeexpr(type, value) { - if (type == "variable") { - if (value == "keyof") { - cx.marked = "keyword" - return cont(typeexpr) - } else { - cx.marked = "type" - return cont(afterType) - } - } + function typeexpr(type) { + if (type == "variable") {cx.marked = "variable-3"; return cont(afterType);} if (type == "string" || type == "number" || type == "atom") return cont(afterType); - if (type == "[") return cont(pushlex("]"), commasep(typeexpr, "]", ","), poplex, afterType) - if (type == "{") return cont(pushlex("}"), commasep(typeprop, "}", ",;"), poplex, afterType) + if (type == "{") return cont(pushlex("}"), commasep(typeprop, "}", ",;"), poplex) if (type == "(") return cont(commasep(typearg, ")"), maybeReturnType) } function maybeReturnType(type) { @@ -575,8 +556,6 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) { return cont(typeprop) } else if (type == ":") { return cont(typeexpr) - } else if (type == "[") { - return cont(expression, maybetype, expect("]"), typeprop) } } function typearg(type) { @@ -587,10 +566,6 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) { if (value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, afterType) if (value == "|" || type == ".") return cont(typeexpr) if (type == "[") return cont(expect("]"), afterType) - if (value == "extends") return cont(typeexpr) - } - function maybeTypeArgs(_, value) { - if (value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, afterType) } function vardef() { return pass(pattern, maybetype, maybeAssign, vardefCont); @@ -649,7 +624,7 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) { if (isTS && value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, functiondef) } function funarg(type) { - if (type == "spread" || type == "modifier") return cont(funarg); + if (type == "spread") return cont(funarg); return pass(pattern, maybetype, maybeAssign); } function classExpression(type, value) { @@ -667,14 +642,13 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) { if (type == "{") return cont(pushlex("}"), classBody, poplex); } function classBody(type, value) { - if (type == "modifier" || type == "async" || - (type == "variable" && - (value == "static" || value == "get" || value == "set") && - cx.stream.match(/^\s+[\w$\xa1-\uffff]/, false))) { - cx.marked = "keyword"; - return cont(classBody); - } if (type == "variable" || cx.style == "keyword") { + if ((value == "async" || value == "static" || value == "get" || value == "set" || + (isTS && (value == "public" || value == "private" || value == "protected" || value == "readonly" || value == "abstract"))) && + cx.stream.match(/^\s+[\w$\xa1-\uffff]/, false)) { + cx.marked = "keyword"; + return cont(classBody); + } cx.marked = "property"; return cont(isTS ? classfield : functiondef, classBody); } @@ -734,12 +708,6 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) { /[,.]/.test(textAfter.charAt(0)); } - function expressionAllowed(stream, state, backUp) { - return state.tokenize == tokenBase && - /^(?:operator|sof|keyword c|case|new|export|default|[\[{}\(,;:]|=>)$/.test(state.lastType) || - (state.lastType == "quasi" && /\{\s*$/.test(stream.string.slice(0, stream.pos - (backUp || 0)))) - } - // Interface return { @@ -814,7 +782,6 @@ CodeMirror.defineMode("javascript", function(config, parserConfig) { jsonMode: jsonMode, expressionAllowed: expressionAllowed, - skipExpression: function(state) { var top = state.cc[state.cc.length - 1] if (top == expression || top == expressionNoComma) state.cc.pop() @@ -835,4 +802,4 @@ CodeMirror.defineMIME("application/ld+json", {name: "javascript", jsonld: true}) CodeMirror.defineMIME("text/typescript", { name: "javascript", typescript: true }); CodeMirror.defineMIME("application/typescript", { name: "javascript", typescript: true }); -}); \ No newline at end of file +}); From 3d3dcd81435ded455f46f4e18c67da67f4d96ee0 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Tue, 5 Sep 2017 18:49:14 +0800 Subject: [PATCH 16/93] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E8=BF=90=E8=A1=8C=E6=A8=A1=E5=BC=8F=20"GLUE=E6=A8=A1=E5=BC=8F(?= =?UTF-8?q?NodeJS)=20"=EF=BC=8C=E6=94=AF=E6=8C=81NodeJS=E8=84=9A=E6=9C=AC?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 80663a5c..3a8b5a4a 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -702,7 +702,7 @@ xxl-job-admin#com.xxl.job.admin.controller.JobApiController.callback 开发步骤:可参考 "章节三" ; 原理:每个 "GLUE模式(Java)" 任务的代码,实际上是“一个继承自“IJobHandler”的实现类的类代码”,“执行器”接收到“调度中心”的调度请求时,会通过Groovy类加载器加载此代码,实例化成Java对象,同时注入此代码中声明的Spring服务(请确保Glue代码中的服务和类引用在“执行器”项目中存在),然后调用该对象的execute方法,执行任务逻辑。 -#### 5.5.3 GLUE模式(Shell) + GLUE模式(Python) +#### 5.5.3 GLUE模式(Shell) + GLUE模式(Python) + GLUE模式(NodeJS) 开发步骤:可参考 "章节三" ; 原理:脚本任务的源码托管在调度中心,脚本逻辑在执行器运行。当触发脚本任务时,执行器会加载脚本源码在执行器机器上生成一份脚本文件,然后通过Java代码调用该脚本;并且实时将脚本输出日志写到任务日志文件中,从而在调度中心可以实时监控脚本运行情况;脚本返回码为0时表示执行成功,其他标示执行失败。 @@ -710,6 +710,7 @@ xxl-job-admin#com.xxl.job.admin.controller.JobApiController.callback - shell脚本:任务运行模式选择为 "GLUE模式(Shell)"时支持 "shell" 脚本任务; - python脚本:任务运行模式选择为 "GLUE模式(Python)"时支持 "python" 脚本任务; + - nodejs脚本:务运行模式选择为 "GLUE模式(NodeJS)"时支持 "nodejs" 脚本任务; #### 5.5.4 执行器 @@ -1012,7 +1013,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 10、任务日志文件路径时间戳格式化时SimpleDateFormat并发问题解决; ### 6.20 版本 V1.9.0 特性[迭代中] -- 1、规划中 +- 1、新增任务运行模式 "GLUE模式(NodeJS) ",支持NodeJS脚本任务; ### TODO LIST - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限; From 2d7c4738a8b7f4ed1c3b2fab1cf1c534da193545 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Thu, 7 Sep 2017 23:05:17 +0800 Subject: [PATCH 17/93] =?UTF-8?q?=E6=9B=B4=E6=96=B0RM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 +------ doc/XXL-JOB-English-Documentation.md | 10 ++-------- doc/XXL-JOB官方文档.md | 9 ++------- 3 files changed, 5 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index d0126b88..be55256d 100644 --- a/README.md +++ b/README.md @@ -141,12 +141,7 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 ## Communication -- 腾讯QQ群(6):399758605 -- 腾讯QQ群(5):138274130 -- 腾讯QQ群(4):464762661 -- 腾讯QQ群(3):242151780 -- 腾讯QQ群(2):438249535 -- 腾讯QQ群(1):367260654 +- [社区交流](http://www.xuxueli.com/page/community.html) - [Gitter](https://gitter.im/xuxueli/xxl-job) diff --git a/doc/XXL-JOB-English-Documentation.md b/doc/XXL-JOB-English-Documentation.md index 5b9ae382..ee97fe81 100644 --- a/doc/XXL-JOB-English-Documentation.md +++ b/doc/XXL-JOB-English-Documentation.md @@ -125,14 +125,8 @@ Source repository address | Release Download ``` -#### Technical exchange group (technical exchange only) - -- Tecent QQ Group 6:399758605 -- Tecent QQ Group 5:138274130 -- Tecent QQ Group 4:464762661 -- Tecent QQ Group 3:242151780 -- Tecent QQ Group 2:438249535 -- Tecent QQ Group 1:367260654 +#### Technical exchange group +- [社区交流](http://www.xuxueli.com/page/community.html) - [Gitter](https://gitter.im/xuxueli/xxl-job) ### 1.5 Environment diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 3a8b5a4a..7f6c6490 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -135,13 +135,8 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 ``` #### 技术交流 - -- 腾讯QQ群(6):399758605 -- 腾讯QQ群(5):138274130 -- 腾讯QQ群(4):464762661 -- 腾讯QQ群(3):242151780 -- 腾讯QQ群(2):438249535 -- 腾讯QQ群(1):367260654 +- [社区交流](http://www.xuxueli.com/page/community.html) +- [Gitter](https://gitter.im/xuxueli/xxl-job) ### 1.5 环境 - JDK:1.7+ From 4050b6630abd2447cb331921a38397a114c81e79 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Wed, 13 Sep 2017 22:22:21 +0800 Subject: [PATCH 18/93] =?UTF-8?q?=E6=9B=B4=E6=96=B0RM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 7f6c6490..b1e22642 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -351,6 +351,7 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 GLUE模式(Java):任务以源码方式维护在调度中心;该模式的任务实际上是一段继承自IJobHandler的Java类代码并 "groovy" 源码方式维护,它在执行器项目中运行,可使用@Resource/@Autowire注入执行器里中的其他服务; GLUE模式(Shell):任务以源码方式维护在调度中心;该模式的任务实际上是一段 "shell" 脚本; GLUE模式(Python):任务以源码方式维护在调度中心;该模式的任务实际上是一段 "python" 脚本; + GLUE模式(NodeJS):任务以源码方式维护在调度中心;该模式的任务实际上是一段 "nodejs" 脚本; - JobHandler:运行模式为 "BEAN模式" 时生效,对应执行器中新开发的JobHandler类“@JobHander”注解自定义的value值; - 子任务Key:每个任务都拥有一个唯一的任务Key(任务Key可以从任务列表获取),当本任务执行结束并且执行成功时,将会触发子任务Key所对应的任务的一次主动调度。 - 阻塞处理策略:调度过于密集执行器来不及处理时的处理策略; @@ -419,6 +420,16 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 ![输入图片说明](https://static.oschina.net/uploads/img/201704/27232305_BPLG.png "在这里输入图片标题") +### 3.5 GLUE模式(NodeJS) + +#### 步骤一:调度中心,新建调度任务 +参考上文“配置属性详细说明”对新建的任务进行参数配置,运行模式选中 "GLUE模式(NodeJS)"; + +#### 步骤二:开发任务代码: +选中指定任务,点击该任务右侧“GLUE”按钮,将会前往GLUE任务的Web IDE界面,在该界面支持对任务代码进行开发(也可以在IDE中开发完成后,复制粘贴到编辑中)。 + +该模式的任务实际上是一段 "nodejS" 脚本; + ## 四、任务管理 From 16509882d904ad30368ae3940e785306f85e9b4e Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Fri, 22 Sep 2017 11:17:59 +0800 Subject: [PATCH 19/93] =?UTF-8?q?=E6=9B=B4=E6=96=B0RM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 2 ++ doc/images/git-osc-热门排行-第一.png | Bin 608503 -> 0 bytes doc/images/gitee-gvp.jpg | Bin 0 -> 133332 bytes .../src/main/webapp/WEB-INF/web.xml | 6 +++++- .../src/main/webapp/WEB-INF/web.xml | 1 + 5 files changed, 8 insertions(+), 1 deletion(-) delete mode 100644 doc/images/git-osc-热门排行-第一.png create mode 100644 doc/images/gitee-gvp.jpg diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index b1e22642..700db9fd 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1032,6 +1032,8 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 8、springboot 和 docker镜像,并且推送docker镜像到中央仓库,更进一步实现产品开箱即用; - 9、国际化:调度中心界面。 - 10、任务类方法"IJobHandler.execute"的参数类型改为"string",进一步方便参数传递;任务注解和任务类统一并改为"JobHandler""; +- 11、任务日志,记录发起调度的机器信息; +- 12、任务告警逻辑调整:任务调度,以及任务回调失败时,均推送监控队列。后期考虑通过任务Log字段控制告警状态; ## 七、其他 diff --git a/doc/images/git-osc-热门排行-第一.png b/doc/images/git-osc-热门排行-第一.png deleted file mode 100644 index 1db893af1f11ed61b9b07918b575d63d71a1ca77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 608503 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

B+?)>(_ZTFL2?87QqQUPtMCDB_%g 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

vX#k4$FkNCI<~ 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 z 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 z%0A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 Zik9y1U`7 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�eNziXoLuCm;o!~(Y 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 - jfinal-demo + xxl-job-executor-sample-jfinal + + webAppRootKey + xxl-job-executor-sample-jfinal + diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/webapp/WEB-INF/web.xml b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/webapp/WEB-INF/web.xml index 7091fff4..55b78eed 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/webapp/WEB-INF/web.xml +++ b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/webapp/WEB-INF/web.xml @@ -3,6 +3,7 @@ xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> + xxl-job-executor-sample-spring webAppRootKey xxl-job-executor-sample-spring From ed31b1b66a405319c76b76854da484a3e3c22d86 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Wed, 11 Oct 2017 21:09:13 +0800 Subject: [PATCH 20/93] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E7=9B=91=E6=8E=A7=E7=BA=BF=E7=A8=8B=E8=A2=AB=E8=80=97=E6=97=B6?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E9=98=BB=E5=A1=9E=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 3 +- .../core/thread/JobFailMonitorHelper.java | 28 +++++++++++-------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 700db9fd..e6ebde76 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -571,7 +571,7 @@ XXL-JOB首先定制了Quartz原生表结构前缀(XXL_JOB_QRTZ_)。 #### 5.3.2 系统组成 - **调度模块(调度中心)**: 负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。调度系统与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块; - 支持可视化、简单且动态的维管理调度信息,包括任务新建,更新,删除,GLUE开发和任务报警等,所有上述操作都会实时生效,同时支持监控调度结果以及执行日志,支持执行器Failover。 + 支持可视化、简单且动态的管理调度信息,包括任务新建,更新,删除,GLUE开发和任务报警等,所有上述操作都会实时生效,同时支持监控调度结果以及执行日志,支持执行器Failover。 - **执行模块(执行器)**: 负责接收调度请求并执行任务逻辑。任务模块专注于任务的执行等操作,开发和维护更加简单和高效; 接收“调度中心”的执行请求、终止请求和日志请求等。 @@ -1020,6 +1020,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 ### 6.20 版本 V1.9.0 特性[迭代中] - 1、新增任务运行模式 "GLUE模式(NodeJS) ",支持NodeJS脚本任务; +- 2、修复任务监控线程被耗时任务阻塞的问题; ### TODO LIST - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限; diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java index 7d7838de..c2a8b23e 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java @@ -6,6 +6,7 @@ import com.xxl.job.admin.core.model.XxlJobLog; import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler; import com.xxl.job.admin.core.util.MailUtil; import com.xxl.job.core.biz.model.ReturnT; +import org.apache.commons.collections.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -35,33 +36,38 @@ public class JobFailMonitorHelper { @Override public void run() { - // monitor while (!toStop) { try { - Integer jobLogId = JobFailMonitorHelper.instance.queue.take(); - if (jobLogId != null && jobLogId > 0) { - XxlJobLog log = XxlJobDynamicScheduler.xxlJobLogDao.load(jobLogId); - if (log!=null) { - if (ReturnT.SUCCESS_CODE==log.getTriggerCode() && log.getHandleCode()==0) { - // job running, wait + again monitor - TimeUnit.SECONDS.sleep(10); + List jobLogIdList = new ArrayList(); + int drainToNum = JobFailMonitorHelper.instance.queue.drainTo(jobLogIdList); + if (CollectionUtils.isNotEmpty(jobLogIdList)) { + for (Integer jobLogId : jobLogIdList) { + if (jobLogId==null || jobLogId==0) { + continue; + } + XxlJobLog log = XxlJobDynamicScheduler.xxlJobLogDao.load(jobLogId); + if (log == null) { + continue; + } + if (ReturnT.SUCCESS_CODE == log.getTriggerCode() && log.getHandleCode() == 0) { JobFailMonitorHelper.monitor(jobLogId); logger.info(">>>>>>>>>>> job monitor, job running, JobLogId:{}", jobLogId); } - if (ReturnT.SUCCESS_CODE==log.getTriggerCode() && ReturnT.SUCCESS_CODE==log.getHandleCode()) { + if (ReturnT.SUCCESS_CODE == log.getTriggerCode() && ReturnT.SUCCESS_CODE == log.getHandleCode()) { // job success, pass logger.info(">>>>>>>>>>> job monitor, job success, JobLogId:{}", jobLogId); } - - if (ReturnT.FAIL_CODE == log.getTriggerCode()|| ReturnT.FAIL_CODE==log.getHandleCode()) { + if (ReturnT.FAIL_CODE == log.getTriggerCode() || ReturnT.FAIL_CODE == log.getHandleCode()) { // job fail, sendMonitorEmail(log); logger.info(">>>>>>>>>>> job monitor, job fail, JobLogId:{}", jobLogId); } } } + + TimeUnit.SECONDS.sleep(10); } catch (Exception e) { logger.error("job monitor error:{}", e); } From b7a2724f1137f7e23a44a950470ec8df362da0fe Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Wed, 11 Oct 2017 21:27:21 +0800 Subject: [PATCH 21/93] =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E5=91=8A=E8=AD=A6?= =?UTF-8?q?=E7=AD=96=E7=95=A5=E6=89=A9=E5=B1=95=EF=BC=9A=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E6=8F=90=E4=BE=9B=E9=82=AE=E4=BB=B6=E5=A4=B1=E8=B4=A5=E5=91=8A?= =?UTF-8?q?=E8=AD=A6=EF=BC=8C=E5=8F=AF=E6=89=A9=E5=B1=95=E7=9F=AD=E4=BF=A1?= =?UTF-8?q?=E7=AD=89=EF=BC=8C=E6=89=A9=E5=B1=95=E4=BB=A3=E7=A0=81=E4=BD=8D?= =?UTF-8?q?=E7=BD=AE=E4=B8=BA=20"JobFailMonitorHelper.failAlarm"=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 1 + .../admin/core/thread/JobFailMonitorHelper.java | 14 ++++++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index e6ebde76..13a15a6d 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1021,6 +1021,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 ### 6.20 版本 V1.9.0 特性[迭代中] - 1、新增任务运行模式 "GLUE模式(NodeJS) ",支持NodeJS脚本任务; - 2、修复任务监控线程被耗时任务阻塞的问题; +- 3、失败告警策略扩展:默认提供邮件失败告警,可扩展短信等,扩展代码位置为 "JobFailMonitorHelper.failAlarm"; ### TODO LIST - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限; diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java index c2a8b23e..797f1b1d 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java @@ -61,7 +61,7 @@ public class JobFailMonitorHelper { } if (ReturnT.FAIL_CODE == log.getTriggerCode() || ReturnT.FAIL_CODE == log.getHandleCode()) { // job fail, - sendMonitorEmail(log); + failAlarm(log); logger.info(">>>>>>>>>>> job monitor, job fail, JobLogId:{}", jobLogId); } } @@ -81,7 +81,7 @@ public class JobFailMonitorHelper { XxlJobLog log = XxlJobDynamicScheduler.xxlJobLogDao.load(jobLogId); if (ReturnT.FAIL_CODE == log.getTriggerCode()|| ReturnT.FAIL_CODE==log.getHandleCode()) { // job fail, - sendMonitorEmail(log); + failAlarm(log); logger.info(">>>>>>>>>>> job monitor last, job fail, JobLogId:{}", jobLogId); } } @@ -94,10 +94,13 @@ public class JobFailMonitorHelper { } /** - * send monitor email + * fail alarm + * * @param jobLog */ - private void sendMonitorEmail(XxlJobLog jobLog){ + private void failAlarm(XxlJobLog jobLog){ + + // send monitor email XxlJobInfo info = XxlJobDynamicScheduler.xxlJobInfoDao.loadById(jobLog.getJobId()); if (info!=null && info.getAlarmEmail()!=null && info.getAlarmEmail().trim().length()>0) { @@ -109,6 +112,9 @@ public class JobFailMonitorHelper { MailUtil.sendMail(email, title, content, false, null); } } + + // TODO, custom alarm strategy, such as sms + } public void toStop(){ From 440116e67ed3f881ec3d228b9c8e73108133cf9f Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Wed, 11 Oct 2017 21:57:59 +0800 Subject: [PATCH 22/93] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E7=9B=91=E6=8E=A7=E7=BA=BF=E7=A8=8B=E6=97=A0=E6=B3=95=E7=9B=91?= =?UTF-8?q?=E6=8E=A7=E4=BB=BB=E5=8A=A1=E8=A7=A6=E5=8F=91=E5=92=8C=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E7=8A=B6=E6=80=81=E5=9D=87=E6=9C=AA0=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 9 +++++++-- .../xxl/job/admin/core/thread/JobFailMonitorHelper.java | 9 +++++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 13a15a6d..a7221e84 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1020,8 +1020,10 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 ### 6.20 版本 V1.9.0 特性[迭代中] - 1、新增任务运行模式 "GLUE模式(NodeJS) ",支持NodeJS脚本任务; -- 2、修复任务监控线程被耗时任务阻塞的问题; -- 3、失败告警策略扩展:默认提供邮件失败告警,可扩展短信等,扩展代码位置为 "JobFailMonitorHelper.failAlarm"; +- 2、失败告警策略扩展:默认提供邮件失败告警,可扩展短信等,扩展代码位置为 "JobFailMonitorHelper.failAlarm"; +- 3、修复任务监控线程被耗时任务阻塞的问题; +- 4、修复任务监控线程无法监控任务触发和执行状态均未0的问题; + ### TODO LIST - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限; @@ -1036,6 +1038,9 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 10、任务类方法"IJobHandler.execute"的参数类型改为"string",进一步方便参数传递;任务注解和任务类统一并改为"JobHandler""; - 11、任务日志,记录发起调度的机器信息; - 12、任务告警逻辑调整:任务调度,以及任务回调失败时,均推送监控队列。后期考虑通过任务Log字段控制告警状态; +- 13、执行器Log清理功能:调度中心Log删除时同步删除执行器中的Log文件; +- 14、脚本任务 Shell、Python和Nodejs,如何友好获取分片参数; +- 15、Bean模式任务,JobHandler自动从执行器中查询展示为下拉框,选择后自动填充任务名称等属性; ## 七、其他 diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java index 797f1b1d..991d5106 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java @@ -54,15 +54,16 @@ public class JobFailMonitorHelper { if (ReturnT.SUCCESS_CODE == log.getTriggerCode() && log.getHandleCode() == 0) { JobFailMonitorHelper.monitor(jobLogId); logger.info(">>>>>>>>>>> job monitor, job running, JobLogId:{}", jobLogId); - } - if (ReturnT.SUCCESS_CODE == log.getTriggerCode() && ReturnT.SUCCESS_CODE == log.getHandleCode()) { + } else if (ReturnT.SUCCESS_CODE == log.getTriggerCode() && ReturnT.SUCCESS_CODE == log.getHandleCode()) { // job success, pass logger.info(">>>>>>>>>>> job monitor, job success, JobLogId:{}", jobLogId); - } - if (ReturnT.FAIL_CODE == log.getTriggerCode() || ReturnT.FAIL_CODE == log.getHandleCode()) { + } else if (ReturnT.FAIL_CODE == log.getTriggerCode() || ReturnT.FAIL_CODE == log.getHandleCode()) { // job fail, failAlarm(log); logger.info(">>>>>>>>>>> job monitor, job fail, JobLogId:{}", jobLogId); + } else { + JobFailMonitorHelper.monitor(jobLogId); + logger.info(">>>>>>>>>>> job monitor, job unknown, JobLogId:{}", jobLogId); } } } From ee1e32ddf342887ecf8323ea9a02c845c8b14b91 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Fri, 13 Oct 2017 16:44:30 +0800 Subject: [PATCH 23/93] =?UTF-8?q?=E8=B0=83=E5=BA=A6=E4=B8=AD=E5=BF=83?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E6=97=A5=E5=BF=97=E9=85=8D=E7=BD=AE=E6=94=B9?= =?UTF-8?q?=E4=B8=BAxml=E6=96=87=E4=BB=B6=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 3 ++- .../src/main/resources/log4j.properties | 10 ------- xxl-job-admin/src/main/resources/log4j.xml | 27 +++++++++++++++++++ 3 files changed, 29 insertions(+), 11 deletions(-) delete mode 100644 xxl-job-admin/src/main/resources/log4j.properties create mode 100644 xxl-job-admin/src/main/resources/log4j.xml diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index a7221e84..a540066f 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1023,7 +1023,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 2、失败告警策略扩展:默认提供邮件失败告警,可扩展短信等,扩展代码位置为 "JobFailMonitorHelper.failAlarm"; - 3、修复任务监控线程被耗时任务阻塞的问题; - 4、修复任务监控线程无法监控任务触发和执行状态均未0的问题; - +- 5、调度中心项目日志配置改为xml文件格式; ### TODO LIST - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限; @@ -1041,6 +1041,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 13、执行器Log清理功能:调度中心Log删除时同步删除执行器中的Log文件; - 14、脚本任务 Shell、Python和Nodejs,如何友好获取分片参数; - 15、Bean模式任务,JobHandler自动从执行器中查询展示为下拉框,选择后自动填充任务名称等属性; +- 16、任务告警邮件优化,调整为表格形式; ## 七、其他 diff --git a/xxl-job-admin/src/main/resources/log4j.properties b/xxl-job-admin/src/main/resources/log4j.properties deleted file mode 100644 index c9455ab0..00000000 --- a/xxl-job-admin/src/main/resources/log4j.properties +++ /dev/null @@ -1,10 +0,0 @@ -log4j.rootLogger=info,console,logFile - -log4j.appender.console=org.apache.log4j.ConsoleAppender -log4j.appender.console.layout=org.apache.log4j.PatternLayout -log4j.appender.console.layout.ConversionPattern=%d - xxl-job-admin - %p [%c] - <%m>%n - -log4j.appender.logFile=org.apache.log4j.DailyRollingFileAppender -log4j.appender.logFile.File=/data/applogs/xxl-job/xxl-job-admin.log -log4j.appender.logFile.layout=org.apache.log4j.PatternLayout -log4j.appender.logFile.layout.ConversionPattern=%d - xxl-job-admin - %p [%c] - <%m>%n diff --git a/xxl-job-admin/src/main/resources/log4j.xml b/xxl-job-admin/src/main/resources/log4j.xml new file mode 100644 index 00000000..b62da198 --- /dev/null +++ b/xxl-job-admin/src/main/resources/log4j.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 87442a5c59893bbca11892bbb4502253af9153ac Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Fri, 13 Oct 2017 18:42:55 +0800 Subject: [PATCH 24/93] =?UTF-8?q?=E6=89=A7=E8=A1=8C=E5=99=A8=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E4=BB=A3=E7=90=86=E5=AF=B9=E8=B1=A1=EF=BC=8C=E6=8B=A6?= =?UTF-8?q?=E6=88=AA=E9=9D=9E=E4=B8=9A=E5=8A=A1=E6=96=B9=E6=B3=95=E7=9A=84?= =?UTF-8?q?=E6=89=A7=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 1 + .../com/xxl/job/core/rpc/netcom/NetComClientProxy.java | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index a540066f..2dde25f4 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1024,6 +1024,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 3、修复任务监控线程被耗时任务阻塞的问题; - 4、修复任务监控线程无法监控任务触发和执行状态均未0的问题; - 5、调度中心项目日志配置改为xml文件格式; +- 6、执行器动态代理对象,拦截非业务方法的执行; ### TODO LIST - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限; diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/NetComClientProxy.java b/xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/NetComClientProxy.java index b71a3534..b0343fc7 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/NetComClientProxy.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/NetComClientProxy.java @@ -36,6 +36,12 @@ public class NetComClientProxy implements FactoryBean { new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + + // filter method like "Object.toString()" + if (Object.class.getName().equals(method.getDeclaringClass().getName())) { + logger.error(">>>>>>>>>>> xxl-rpc proxy class-method not support [{}.{}]", method.getDeclaringClass().getName(), method.getName()); + throw new RuntimeException("xxl-rpc proxy class-method not support"); + } // request RpcRequest request = new RpcRequest(); @@ -46,7 +52,7 @@ public class NetComClientProxy implements FactoryBean { request.setMethodName(method.getName()); request.setParameterTypes(method.getParameterTypes()); request.setParameters(args); - + // send RpcResponse response = client.send(request); From eb4c3c2b18e3a425553852051155581f6c8d9e60 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Tue, 17 Oct 2017 23:09:02 +0800 Subject: [PATCH 25/93] =?UTF-8?q?=E6=9B=B4=E6=96=B0RM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 2dde25f4..28398ced 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1043,6 +1043,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 14、脚本任务 Shell、Python和Nodejs,如何友好获取分片参数; - 15、Bean模式任务,JobHandler自动从执行器中查询展示为下拉框,选择后自动填充任务名称等属性; - 16、任务告警邮件优化,调整为表格形式; +- 17、任务报表,支持时间筛选; ## 七、其他 From 45bac140b78e44cc4f81d990a3126219632db874 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Mon, 30 Oct 2017 10:58:20 +0800 Subject: [PATCH 26/93] =?UTF-8?q?=E5=BA=95=E5=B1=82=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E7=BA=A7=E5=88=AB=E8=B0=83=E6=95=B4=EF=BC=8C?= =?UTF-8?q?=E9=AB=98=E9=A2=91=E9=9D=9E=E6=A0=B8=E5=BF=83=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=B8=BAdebug=E7=BA=A7=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 1 + .../admin/core/jobbean/LocalNomalJobBean.java | 94 ------------------- .../jobbean/impl/DemoConcurrentJobBean.java | 30 ------ .../core/jobbean/impl/DemoNomalJobBean.java | 32 ------- .../core/thread/JobFailMonitorHelper.java | 2 +- .../job/admin/core/trigger/XxlJobTrigger.java | 2 +- .../com/xxl/job/admin/core/util/MailUtil.java | 2 +- .../job/admin/service/impl/AdminBizImpl.java | 2 +- .../com/xxl/job/core/log/XxlJobLogger.java | 2 +- .../rpc/netcom/jetty/server/JettyServer.java | 2 +- .../core/thread/ExecutorRegistryThread.java | 6 +- .../com/xxl/job/core/thread/JobThread.java | 4 +- .../core/thread/TriggerCallbackThread.java | 4 +- .../com/xxl/job/core/util/HttpClientUtil.java | 2 +- 14 files changed, 15 insertions(+), 170 deletions(-) delete mode 100644 xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/LocalNomalJobBean.java delete mode 100644 xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/impl/DemoConcurrentJobBean.java delete mode 100644 xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/impl/DemoNomalJobBean.java diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 28398ced..bc4e06d1 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1025,6 +1025,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 4、修复任务监控线程无法监控任务触发和执行状态均未0的问题; - 5、调度中心项目日志配置改为xml文件格式; - 6、执行器动态代理对象,拦截非业务方法的执行; +- 7、底层系统日志级别规范调整,清理遗留代码; ### TODO LIST - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限; diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/LocalNomalJobBean.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/LocalNomalJobBean.java deleted file mode 100644 index 067e10f4..00000000 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/LocalNomalJobBean.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.xxl.job.admin.core.jobbean; -//package com.xxl.job.action.job; -// -//import java.io.PrintWriter; -//import java.io.StringWriter; -//import java.util.Date; -//import java.util.HashMap; -//import java.util.Map; -// -//import org.apache.commons.lang.StringUtils; -//import org.quartz.JobExecutionContext; -//import org.quartz.JobExecutionException; -//import org.quartz.JobKey; -//import org.slf4j.Logger; -//import org.slf4j.LoggerFactory; -//import org.springframework.scheduling.quartz.QuartzJobBean; -// -//import com.xxl.job.client.handler.HandlerRouter; -//import com.xxl.job.client.util.XxlJobNetCommUtil.RemoteCallBack; -//import com.xxl.job.client.util.JacksonUtil; -//import com.xxl.job.core.model.XxlJobInfo; -//import com.xxl.job.core.model.XxlJobLog; -//import com.xxl.job.core.thread.JobFailMonitorHelper; -//import com.xxl.job.core.util.DynamicSchedulerUtil; -// -///** -// * http job bean -// * @author xuxueli 2015-12-17 18:20:34 -// */ -//@Deprecated -//public abstract class LocalNomalJobBean extends QuartzJobBean { -// private static Logger logger = LoggerFactory.getLogger(LocalNomalJobBean.class); -// -// @Override -// protected void executeInternal(JobExecutionContext context) -// throws JobExecutionException { -// JobKey jobKey = context.getTrigger().getJobKey(); -// -// XxlJobInfo jobInfo = DynamicSchedulerUtil.xxlJobInfoDao.load(jobKey.getGroup(), jobKey.getName()); -// @SuppressWarnings("unchecked") -// HashMap jobDataMap = (HashMap) JacksonUtil.readValueRefer(jobInfo.getJobData(), Map.class); -// -// // save log -// XxlJobLog jobLog = new XxlJobLog(); -// jobLog.setJobGroup(jobInfo.getJobGroup()); -// jobLog.setJobName(jobInfo.getJobName()); -// jobLog.setJobCron(jobInfo.getJobCron()); -// jobLog.setJobDesc(jobInfo.getJobDesc()); -// jobLog.setJobClass(jobInfo.getJobClass()); -// jobLog.setJobData(jobInfo.getJobData()); -// -// jobLog.setJobClass(RemoteHttpJobBean.class.getName()); -// jobLog.setJobData(jobInfo.getJobData()); -// DynamicSchedulerUtil.xxlJobLogDao.save(jobLog); -// logger.info(">>>>>>>>>>> xxl-job trigger start, jobLog:{}", jobLog); -// -// // trigger request -// String handler_params = jobDataMap.get(HandlerRouter.HANDLER_PARAMS); -// String[] handlerParams = null; -// if (StringUtils.isNotBlank(handler_params)) { -// handlerParams = handler_params.split(","); -// } -// -// jobLog.setTriggerTime(new Date()); -// jobLog.setTriggerStatus(RemoteCallBack.SUCCESS); -// jobLog.setTriggerMsg(null); -// -// try { -// Object responseMsg = this.handle(handlerParams); -// -// jobLog.setHandleTime(new Date()); -// jobLog.setHandleStatus(RemoteCallBack.SUCCESS); -// jobLog.setHandleMsg(JacksonUtil.writeValueAsString(responseMsg)); -// } catch (Exception e) { -// logger.info("JobThread Exception:", e); -// StringWriter out = new StringWriter(); -// e.printStackTrace(new PrintWriter(out)); -// -// jobLog.setHandleTime(new Date()); -// jobLog.setHandleStatus(RemoteCallBack.FAIL); -// jobLog.setHandleMsg(out.toString()); -// } -// -// // update trigger info -// DynamicSchedulerUtil.xxlJobLogDao.updateTriggerInfo(jobLog); -// DynamicSchedulerUtil.xxlJobLogDao.updateHandleInfo(jobLog); -// JobFailMonitorHelper.monitor(jobLog.getId()); -// logger.info(">>>>>>>>>>> xxl-job trigger end, jobLog.id:{}, jobLog:{}", jobLog.getId(), jobLog); -// -// } -// -// public abstract Object handle(String... param); -// -//} \ No newline at end of file diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/impl/DemoConcurrentJobBean.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/impl/DemoConcurrentJobBean.java deleted file mode 100644 index a64ef5b7..00000000 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/impl/DemoConcurrentJobBean.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.xxl.job.admin.core.jobbean.impl; -//package com.xxl.job.action.job.impl; -// -//import java.util.concurrent.TimeUnit; -// -//import org.quartz.DisallowConcurrentExecution; -// -//import com.xxl.job.action.job.LocalNomalJobBean; -// -///** -// * demo job bean for no-concurrent -// * @author xuxueli 2016-3-12 14:25:14 -// */ -//@Deprecated -//@DisallowConcurrentExecution // 串行;线程数要多配置几个,否则不生效; -//public class DemoConcurrentJobBean extends LocalNomalJobBean { -// -// @Override -// public Object handle(String... param) { -// -// try { -// TimeUnit.SECONDS.sleep(10); -// } catch (InterruptedException e) { -// logger.error(e.getMessage(), e); -// } -// -// return false; -// } -// -//} diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/impl/DemoNomalJobBean.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/impl/DemoNomalJobBean.java deleted file mode 100644 index ccb7c41d..00000000 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/impl/DemoNomalJobBean.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.xxl.job.admin.core.jobbean.impl; -//package com.xxl.job.action.job.impl; -// -//import java.util.concurrent.TimeUnit; -// -//import org.slf4j.Logger; -//import org.slf4j.LoggerFactory; -// -//import com.xxl.job.action.job.LocalNomalJobBean; -// -///** -// * demo job bean for concurrent -// * @author xuxueli 2016-3-12 14:25:57 -// */ -//@Deprecated -//public class DemoNomalJobBean extends LocalNomalJobBean { -// private static Logger Logger = LoggerFactory.getLogger(DemoNomalJobBean.class); -// -// @Override -// public Object handle(String... param) { -// Logger.info("DemoNomalJobBean run :" + param); -// -// try { -// TimeUnit.SECONDS.sleep(10); -// } catch (InterruptedException e) { -// logger.error(e.getMessage(), e); -// } -// -// return false; -// } -// -//} diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java index 991d5106..a19c1781 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java @@ -63,7 +63,7 @@ public class JobFailMonitorHelper { logger.info(">>>>>>>>>>> job monitor, job fail, JobLogId:{}", jobLogId); } else { JobFailMonitorHelper.monitor(jobLogId); - logger.info(">>>>>>>>>>> job monitor, job unknown, JobLogId:{}", jobLogId); + logger.info(">>>>>>>>>>> job monitor, job status unknown, JobLogId:{}", jobLogId); } } } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java index 48fc850a..6482922f 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java @@ -35,7 +35,7 @@ public class XxlJobTrigger { // load data XxlJobInfo jobInfo = XxlJobDynamicScheduler.xxlJobInfoDao.loadById(jobId); // job info if (jobInfo == null) { - logger.warn(">>>>>>>>>>>> xxl-job trigger fail, jobId invalid,jobId={}", jobId); + logger.warn(">>>>>>>>>>>> trigger fail, jobId invalid,jobId={}", jobId); return; } XxlJobGroup group = XxlJobDynamicScheduler.xxlJobGroupDao.load(jobInfo.getJobGroup()); // group info diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/MailUtil.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/MailUtil.java index 07e5cc21..1bba0ecb 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/MailUtil.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/MailUtil.java @@ -93,7 +93,7 @@ public class MailUtil { javaMailSender.send(mimeMessage); return true; } catch (Exception e) { - logger.info("{}", e); + logger.error(e.getMessage(), e); } return false; } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java index a2f05cae..718b4554 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java @@ -45,7 +45,7 @@ public class AdminBizImpl implements AdminBiz { public ReturnT callback(List callbackParamList) { for (HandleCallbackParam handleCallbackParam: callbackParamList) { ReturnT callbackResult = callback(handleCallbackParam); - logger.info("JobApiController.callback {}, handleCallbackParam={}, callbackResult={}", + logger.info(">>>>>>>>> JobApiController.callback {}, handleCallbackParam={}, callbackResult={}", (callbackResult.getCode()==ReturnT.SUCCESS_CODE?"success":"fail"), handleCallbackParam, callbackResult); } diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobLogger.java b/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobLogger.java index 6c82a3d7..f9b970ca 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobLogger.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobLogger.java @@ -43,7 +43,7 @@ public class XxlJobLogger { // appendlog XxlJobFileAppender.appendLog(logFileName, formatAppendLog); - logger.warn("[{}]: {}", logFileName, formatAppendLog); + logger.debug(">>>>>>>>>>> [{}]: {}", logFileName, formatAppendLog); } /** diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/jetty/server/JettyServer.java b/xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/jetty/server/JettyServer.java index 76730ec0..ae9dfec9 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/jetty/server/JettyServer.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/jetty/server/JettyServer.java @@ -44,7 +44,7 @@ public class JettyServer { try { // Start server server.start(); - logger.info(">>>>>>>>>>>> xxl-job jetty server start success at port:{}.", port); + logger.info(">>>>>>>>>>> xxl-job jetty server start success at port:{}.", port); // Start Registry-Server ExecutorRegistryThread.getInstance().start(port, ip, appName); diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/thread/ExecutorRegistryThread.java b/xxl-job-core/src/main/java/com/xxl/job/core/thread/ExecutorRegistryThread.java index 02ccf23b..1e3b1377 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/thread/ExecutorRegistryThread.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/thread/ExecutorRegistryThread.java @@ -28,11 +28,11 @@ public class ExecutorRegistryThread extends Thread { // valid if (appName==null || appName.trim().length()==0) { - logger.warn(">>>>>>>>>>>> xxl-job, executor registry config fail, appName is null."); + logger.warn(">>>>>>>>>>> xxl-job, executor registry config fail, appName is null."); return; } if (XxlJobExecutor.getAdminBizList() == null) { - logger.warn(">>>>>>>>>>>> xxl-job, executor registry config fail, adminAddresses is null."); + logger.warn(">>>>>>>>>>> xxl-job, executor registry config fail, adminAddresses is null."); return; } @@ -99,7 +99,7 @@ public class ExecutorRegistryThread extends Thread { } catch (Exception e) { logger.error(e.getMessage(), e); } - logger.warn(">>>>>>>>>>>> xxl-job, executor registry thread destory."); + logger.info(">>>>>>>>>>> xxl-job, executor registry thread destory."); } }); diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java b/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java index 37c840b1..ae385f3f 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java @@ -57,7 +57,7 @@ public class JobThread extends Thread{ public ReturnT pushTriggerQueue(TriggerParam triggerParam) { // avoid repeat if (triggerLogIdSet.contains(triggerParam.getLogId())) { - logger.debug("repeate trigger job, logId:{}", triggerParam.getLogId()); + logger.info(">>>>>>>>>>> repeate trigger job, logId:{}", triggerParam.getLogId()); return new ReturnT(ReturnT.FAIL_CODE, "repeate trigger job, logId:" + triggerParam.getLogId()); } @@ -171,6 +171,6 @@ public class JobThread extends Thread{ } } - logger.info(">>>>>>>>>>>> xxl-job JobThread stoped, hashCode:{}", Thread.currentThread()); + logger.info(">>>>>>>>>>> xxl-job JobThread stoped, hashCode:{}", Thread.currentThread()); } } diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/thread/TriggerCallbackThread.java b/xxl-job-core/src/main/java/com/xxl/job/core/thread/TriggerCallbackThread.java index 9126c4a3..23b56c93 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/thread/TriggerCallbackThread.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/thread/TriggerCallbackThread.java @@ -40,7 +40,7 @@ public class TriggerCallbackThread { // valid if (XxlJobExecutor.getAdminBizList() == null) { - logger.warn(">>>>>>>>>>>> xxl-job, executor callback config fail, adminAddresses is null."); + logger.warn(">>>>>>>>>>> xxl-job, executor callback config fail, adminAddresses is null."); return; } @@ -80,7 +80,7 @@ public class TriggerCallbackThread { } catch (Exception e) { logger.error(e.getMessage(), e); } - logger.warn(">>>>>>>>>>>> xxl-job, executor callback thread destory."); + logger.info(">>>>>>>>>>> xxl-job, executor callback thread destory."); } }); diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/util/HttpClientUtil.java b/xxl-job-core/src/main/java/com/xxl/job/core/util/HttpClientUtil.java index 417a80ff..cbb846a8 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/util/HttpClientUtil.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/util/HttpClientUtil.java @@ -64,7 +64,7 @@ public class HttpClientUtil { EntityUtils.consume(entity); } } catch (Exception e) { - logger.error("", e); + logger.error(e.getMessage(), e); throw e; } finally { httpPost.releaseConnection(); From 58abecc7ddcef5bfe4a1caf0f503cee636df3b5b Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Tue, 31 Oct 2017 12:03:03 +0800 Subject: [PATCH 27/93] =?UTF-8?q?=E6=9B=B4=E6=96=B0RM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index bc4e06d1..2bc8dc1b 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1031,7 +1031,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限; - 2、任务分片路由:分片采用一致性Hash算法计算出尽量稳定的分片顺序,即使注册机器存在波动也不会引起分批分片顺序大的波动;目前采用IP自然排序,可以满足需求,待定; - 3、失败重试优化:目前失败重试逻辑为,在本次调度请求失败后重新执行一次请求逻辑。优化点为针对调度和执行失败时均做失败重试,重试时重新触发一次完整调度,这将可能导致失败是调度死循环,待定。 -- 4、回调失败写文件,查看日志时读文件确认,重启后回调确认; +- 4、回调失败丢包问题:执行器回调失败写文件,重启或周期性回调重试;调度中心周期性请求并同步未回调的执行结果; - 5、任务依赖,流程图,子任务+会签任务,各节点日志; - 6、调度任务优先级; - 7、移除quartz依赖,重写调度模块:新增或恢复任务时将下次执行记录插入delayqueue,调度中心集群竞争分布式锁,成功节点批量加载到期delayqueue数据,批量执行。 From be926f81aa0b60b74a96d603c3ef655484949d1b Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Wed, 8 Nov 2017 15:57:25 +0800 Subject: [PATCH 28/93] =?UTF-8?q?=E6=9B=B4=E6=96=B0RM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 2bc8dc1b..81d0dedc 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -803,6 +803,18 @@ XXL-JOB会为每次调度请求生成一个单独的日志文件,需要通过 调度中心API服务请求参考代码:com.xxl.job.dao.impl.AdminBizTest.java +### 5.12 执行器API服务 +执行器提供了API服务,供调度中心选择使用,目前提供的API服务有: + + 1、心跳检测 + 2、忙碌检测 + 3、触发任务执行 + 4、获取Rolling Log + 5、终止任务 + +执行器API服务位置:com.xxl.job.core.biz.ExecutorBiz + +执行器API服务请求参考代码:com.xxl.executor.test.DemoJobHandlerTest ## 六、版本更新日志 ### 6.1 版本 V1.1.x,新特性[2015-12-05] From abb4474fbb700d78e4bdcc9ebc93f76fb3d44aee Mon Sep 17 00:00:00 2001 From: anthow Date: Fri, 10 Nov 2017 11:43:36 +0800 Subject: [PATCH 29/93] =?UTF-8?q?=E4=BF=AE=E6=94=B9JobThread=E6=8D=95?= =?UTF-8?q?=E8=8E=B7Error=E9=94=99=E8=AF=AF=E4=B8=8D=E6=9B=B4=E6=96=B0JobL?= =?UTF-8?q?og?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xxl/job/core/thread/JobThread.java | 172 +++++++++--------- 1 file changed, 90 insertions(+), 82 deletions(-) diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java b/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java index ae385f3f..3114d933 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java @@ -91,86 +91,94 @@ public class JobThread extends Thread{ @Override public void run() { - while(!toStop){ - running = false; - idleTimes++; - try { - // to check toStop signal, we need cycle, so wo cannot use queue.take(), instand of poll(timeout) - TriggerParam triggerParam = triggerQueue.poll(3L, TimeUnit.SECONDS); - if (triggerParam!=null) { - running = true; - idleTimes = 0; - triggerLogIdSet.remove(triggerParam.getLogId()); - - // parse param - String[] handlerParams = (triggerParam.getExecutorParams()!=null && triggerParam.getExecutorParams().trim().length()>0) - ? (String[])(Arrays.asList(triggerParam.getExecutorParams().split(",")).toArray()) : null; - - // handle job - ReturnT executeResult = null; - try { - // log filename: yyyy-MM-dd/9999.log - String logFileName = XxlJobFileAppender.makeLogFileName(new Date(triggerParam.getLogDateTim()), triggerParam.getLogId()); - - XxlJobFileAppender.contextHolder.set(logFileName); - ShardingUtil.setShardingVo(new ShardingUtil.ShardingVO(triggerParam.getBroadcastIndex(), triggerParam.getBroadcastTotal())); - XxlJobLogger.log("
----------- xxl-job job execute start -----------
----------- Params:" + Arrays.toString(handlerParams)); - - executeResult = handler.execute(handlerParams); - if (executeResult == null) { - executeResult = ReturnT.FAIL; - } - - XxlJobLogger.log("
----------- xxl-job job execute end(finish) -----------
----------- ReturnT:" + executeResult); - } catch (Exception e) { - if (toStop) { - XxlJobLogger.log("
----------- JobThread toStop, stopReason:" + stopReason); - } - - StringWriter stringWriter = new StringWriter(); - e.printStackTrace(new PrintWriter(stringWriter)); - String errorMsg = stringWriter.toString(); - executeResult = new ReturnT(ReturnT.FAIL_CODE, errorMsg); - - XxlJobLogger.log("
----------- JobThread Exception:" + errorMsg + "
----------- xxl-job job execute end(error) -----------"); - } - - // callback handler info - if (!toStop) { - // commonm - TriggerCallbackThread.pushCallBack(new HandleCallbackParam(triggerParam.getLogId(), executeResult)); - } else { - // is killed - ReturnT stopResult = new ReturnT(ReturnT.FAIL_CODE, stopReason + " [业务运行中,被强制终止]"); - TriggerCallbackThread.pushCallBack(new HandleCallbackParam(triggerParam.getLogId(), stopResult)); - } - } else { - if (idleTimes > 30) { - XxlJobExecutor.removeJobThread(jobId, "excutor idel times over limit."); - } - } - } catch (Throwable e) { - if (toStop) { - XxlJobLogger.log("
----------- xxl-job toStop, stopReason:" + stopReason); - } - - StringWriter stringWriter = new StringWriter(); - e.printStackTrace(new PrintWriter(stringWriter)); - String errorMsg = stringWriter.toString(); - XxlJobLogger.log("----------- xxl-job JobThread Exception:" + errorMsg); - } - } - - // callback trigger request in queue - while(triggerQueue !=null && triggerQueue.size()>0){ - TriggerParam triggerParam = triggerQueue.poll(); - if (triggerParam!=null) { - // is killed - ReturnT stopResult = new ReturnT(ReturnT.FAIL_CODE, stopReason + " [任务尚未执行,在调度队列中被终止]"); - TriggerCallbackThread.pushCallBack(new HandleCallbackParam(triggerParam.getLogId(), stopResult)); - } - } - - logger.info(">>>>>>>>>>> xxl-job JobThread stoped, hashCode:{}", Thread.currentThread()); - } + + while(!toStop){ + running = false; + idleTimes++; + // handle job + ReturnT executeResult = null; + TriggerParam triggerParam = null; + try { + // to check toStop signal, we need cycle, so wo cannot use queue.take(), instand of poll(timeout) + triggerParam = triggerQueue.poll(3L, TimeUnit.SECONDS); + if (triggerParam!=null) { + running = true; + idleTimes = 0; + triggerLogIdSet.remove(triggerParam.getLogId()); + + // parse param + String[] handlerParams = (triggerParam.getExecutorParams()!=null && triggerParam.getExecutorParams().trim().length()>0) + ? (String[])(Arrays.asList(triggerParam.getExecutorParams().split(" ")).toArray()) : null; + + + try { + // log filename: yyyy-MM-dd/9999.log + String logFileName = XxlJobFileAppender.makeLogFileName(new Date(triggerParam.getLogDateTim()), triggerParam.getLogId()); + + XxlJobFileAppender.contextHolder.set(logFileName); + ShardingUtil.setShardingVo(new ShardingUtil.ShardingVO(triggerParam.getBroadcastIndex(), triggerParam.getBroadcastTotal())); + XxlJobLogger.log("
----------- xxl-job job execute start -----------
----------- Params:" + Arrays.toString(handlerParams)); + + executeResult = handler.execute(handlerParams); + if (executeResult == null) { + executeResult = ReturnT.FAIL; + } + + XxlJobLogger.log("
----------- xxl-job job execute end(finish) -----------
----------- ReturnT:" + executeResult); + } catch (Exception e) { + if (toStop) { + XxlJobLogger.log("
----------- JobThread toStop, stopReason:" + stopReason); + } + + StringWriter stringWriter = new StringWriter(); + e.printStackTrace(new PrintWriter(stringWriter)); + String errorMsg = stringWriter.toString(); + executeResult = new ReturnT(ReturnT.FAIL_CODE, errorMsg); + + XxlJobLogger.log("
----------- JobThread Exception:" + errorMsg + "
----------- xxl-job job execute end(error) -----------"); + } + + } else { + if (idleTimes > 30) { + XxlJobExecutor.removeJobThread(jobId, "excutor idel times over limit."); + } + } + } catch (Throwable e) { + if (toStop) { + XxlJobLogger.log("
----------- xxl-job toStop, stopReason:" + stopReason); + } + + StringWriter stringWriter = new StringWriter(); + e.printStackTrace(new PrintWriter(stringWriter)); + String errorMsg = stringWriter.toString(); + executeResult = new ReturnT(ReturnT.FAIL_CODE, errorMsg); + + XxlJobLogger.log("----------- xxl-job JobThread Exception:" + errorMsg); + } finally { + if(triggerParam != null) { + // callback handler info + if (!toStop) { + // commonm + TriggerCallbackThread.pushCallBack(new HandleCallbackParam(triggerParam.getLogId(), executeResult)); + } else { + // is killed + ReturnT stopResult = new ReturnT(ReturnT.FAIL_CODE, stopReason + " [业务运行中,被强制终止]"); + TriggerCallbackThread.pushCallBack(new HandleCallbackParam(triggerParam.getLogId(), stopResult)); + } + } + } + } + + // callback trigger request in queue + while(triggerQueue !=null && triggerQueue.size()>0){ + TriggerParam triggerParam = triggerQueue.poll(); + if (triggerParam!=null) { + // is killed + ReturnT stopResult = new ReturnT(ReturnT.FAIL_CODE, stopReason + " [任务尚未执行,在调度队列中被终止]"); + TriggerCallbackThread.pushCallBack(new HandleCallbackParam(triggerParam.getLogId(), stopResult)); + } + } + + logger.info(">>>>>>>>>>>> xxl-job JobThread stoped, hashCode:{}", Thread.currentThread()); + } } From 449691d32216bfb44b4915145d40f95a668f1a5c Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Fri, 10 Nov 2017 16:23:06 +0800 Subject: [PATCH 30/93] =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E7=BA=BF=E7=A8=8BError?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E9=80=BB=E8=BE=91=E9=80=BB=E8=BE=91=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xxl/job/core/thread/JobThread.java | 130 ++++++++---------- 1 file changed, 58 insertions(+), 72 deletions(-) diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java b/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java index 3114d933..20a3ad8e 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java @@ -92,69 +92,55 @@ public class JobThread extends Thread{ @Override public void run() { - while(!toStop){ - running = false; - idleTimes++; - // handle job - ReturnT executeResult = null; + while(!toStop){ + running = false; + idleTimes++; + TriggerParam triggerParam = null; + ReturnT executeResult = null; try { - // to check toStop signal, we need cycle, so wo cannot use queue.take(), instand of poll(timeout) - triggerParam = triggerQueue.poll(3L, TimeUnit.SECONDS); - if (triggerParam!=null) { - running = true; - idleTimes = 0; - triggerLogIdSet.remove(triggerParam.getLogId()); - - // parse param - String[] handlerParams = (triggerParam.getExecutorParams()!=null && triggerParam.getExecutorParams().trim().length()>0) - ? (String[])(Arrays.asList(triggerParam.getExecutorParams().split(" ")).toArray()) : null; - - - try { - // log filename: yyyy-MM-dd/9999.log - String logFileName = XxlJobFileAppender.makeLogFileName(new Date(triggerParam.getLogDateTim()), triggerParam.getLogId()); - - XxlJobFileAppender.contextHolder.set(logFileName); - ShardingUtil.setShardingVo(new ShardingUtil.ShardingVO(triggerParam.getBroadcastIndex(), triggerParam.getBroadcastTotal())); - XxlJobLogger.log("
----------- xxl-job job execute start -----------
----------- Params:" + Arrays.toString(handlerParams)); - - executeResult = handler.execute(handlerParams); - if (executeResult == null) { - executeResult = ReturnT.FAIL; - } - - XxlJobLogger.log("
----------- xxl-job job execute end(finish) -----------
----------- ReturnT:" + executeResult); - } catch (Exception e) { - if (toStop) { - XxlJobLogger.log("
----------- JobThread toStop, stopReason:" + stopReason); - } - - StringWriter stringWriter = new StringWriter(); - e.printStackTrace(new PrintWriter(stringWriter)); - String errorMsg = stringWriter.toString(); - executeResult = new ReturnT(ReturnT.FAIL_CODE, errorMsg); - - XxlJobLogger.log("
----------- JobThread Exception:" + errorMsg + "
----------- xxl-job job execute end(error) -----------"); - } - - } else { - if (idleTimes > 30) { - XxlJobExecutor.removeJobThread(jobId, "excutor idel times over limit."); - } - } - } catch (Throwable e) { - if (toStop) { - XxlJobLogger.log("
----------- xxl-job toStop, stopReason:" + stopReason); - } - - StringWriter stringWriter = new StringWriter(); - e.printStackTrace(new PrintWriter(stringWriter)); - String errorMsg = stringWriter.toString(); - executeResult = new ReturnT(ReturnT.FAIL_CODE, errorMsg); - - XxlJobLogger.log("----------- xxl-job JobThread Exception:" + errorMsg); - } finally { + // to check toStop signal, we need cycle, so wo cannot use queue.take(), instand of poll(timeout) + triggerParam = triggerQueue.poll(3L, TimeUnit.SECONDS); + if (triggerParam!=null) { + running = true; + idleTimes = 0; + triggerLogIdSet.remove(triggerParam.getLogId()); + + // parse param + String[] handlerParams = (triggerParam.getExecutorParams()!=null && triggerParam.getExecutorParams().trim().length()>0) + ? (String[])(Arrays.asList(triggerParam.getExecutorParams().split(",")).toArray()) : null; + + + // log filename: yyyy-MM-dd/9999.log + String logFileName = XxlJobFileAppender.makeLogFileName(new Date(triggerParam.getLogDateTim()), triggerParam.getLogId()); + XxlJobFileAppender.contextHolder.set(logFileName); + ShardingUtil.setShardingVo(new ShardingUtil.ShardingVO(triggerParam.getBroadcastIndex(), triggerParam.getBroadcastTotal())); + + // execute + XxlJobLogger.log("
----------- xxl-job job execute start -----------
----------- Params:" + Arrays.toString(handlerParams)); + executeResult = handler.execute(handlerParams); + if (executeResult == null) { + executeResult = ReturnT.FAIL; + } + XxlJobLogger.log("
----------- xxl-job job execute end(finish) -----------
----------- ReturnT:" + executeResult); + + } else { + if (idleTimes > 30) { + XxlJobExecutor.removeJobThread(jobId, "excutor idel times over limit."); + } + } + } catch (Throwable e) { + if (toStop) { + XxlJobLogger.log("
----------- JobThread toStop, stopReason:" + stopReason); + } + + StringWriter stringWriter = new StringWriter(); + e.printStackTrace(new PrintWriter(stringWriter)); + String errorMsg = stringWriter.toString(); + executeResult = new ReturnT(ReturnT.FAIL_CODE, errorMsg); + + XxlJobLogger.log("
----------- xxl-job job execute end(error) -----------
----------- ReturnT:" + executeResult); + } finally { if(triggerParam != null) { // callback handler info if (!toStop) { @@ -169,16 +155,16 @@ public class JobThread extends Thread{ } } - // callback trigger request in queue - while(triggerQueue !=null && triggerQueue.size()>0){ - TriggerParam triggerParam = triggerQueue.poll(); - if (triggerParam!=null) { - // is killed - ReturnT stopResult = new ReturnT(ReturnT.FAIL_CODE, stopReason + " [任务尚未执行,在调度队列中被终止]"); - TriggerCallbackThread.pushCallBack(new HandleCallbackParam(triggerParam.getLogId(), stopResult)); - } - } + // callback trigger request in queue + while(triggerQueue !=null && triggerQueue.size()>0){ + TriggerParam triggerParam = triggerQueue.poll(); + if (triggerParam!=null) { + // is killed + ReturnT stopResult = new ReturnT(ReturnT.FAIL_CODE, stopReason + " [任务尚未执行,在调度队列中被终止]"); + TriggerCallbackThread.pushCallBack(new HandleCallbackParam(triggerParam.getLogId(), stopResult)); + } + } - logger.info(">>>>>>>>>>>> xxl-job JobThread stoped, hashCode:{}", Thread.currentThread()); - } + logger.info(">>>>>>>>>>> xxl-job JobThread stoped, hashCode:{}", Thread.currentThread()); + } } From a612b467e1f4a5ae676a8c4634c594678c575140 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Fri, 10 Nov 2017 16:31:02 +0800 Subject: [PATCH 31/93] =?UTF-8?q?=E6=9B=B4=E6=96=B0RM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 1 + .../src/main/java/com/xxl/job/core/thread/JobThread.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 81d0dedc..456d06cb 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1038,6 +1038,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 5、调度中心项目日志配置改为xml文件格式; - 6、执行器动态代理对象,拦截非业务方法的执行; - 7、底层系统日志级别规范调整,清理遗留代码; +- 8、修改JobThread捕获Error错误不更新JobLog的问题; ### TODO LIST - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限; diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java b/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java index 20a3ad8e..6084ef4b 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java @@ -139,7 +139,7 @@ public class JobThread extends Thread{ String errorMsg = stringWriter.toString(); executeResult = new ReturnT(ReturnT.FAIL_CODE, errorMsg); - XxlJobLogger.log("
----------- xxl-job job execute end(error) -----------
----------- ReturnT:" + executeResult); + XxlJobLogger.log("
----------- JobThread Exception:" + errorMsg + "
----------- xxl-job job execute end(error) -----------"); } finally { if(triggerParam != null) { // callback handler info From 0c1f793c5799a8663ee110d2a9c447a2bf31f2fb Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Tue, 14 Nov 2017 16:36:11 +0800 Subject: [PATCH 32/93] =?UTF-8?q?=E6=9B=B4=E6=96=B0RM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 456d06cb..54eed3a2 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1043,7 +1043,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 ### TODO LIST - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限; - 2、任务分片路由:分片采用一致性Hash算法计算出尽量稳定的分片顺序,即使注册机器存在波动也不会引起分批分片顺序大的波动;目前采用IP自然排序,可以满足需求,待定; -- 3、失败重试优化:目前失败重试逻辑为,在本次调度请求失败后重新执行一次请求逻辑。优化点为针对调度和执行失败时均做失败重试,重试时重新触发一次完整调度,这将可能导致失败是调度死循环,待定。 +- 3、失败重试完整支持:任务流程分为触发和执行,目前仅支持触发失败的重试;后续支持任务执行失败的重试,通过任务返回值判断。 - 4、回调失败丢包问题:执行器回调失败写文件,重启或周期性回调重试;调度中心周期性请求并同步未回调的执行结果; - 5、任务依赖,流程图,子任务+会签任务,各节点日志; - 6、调度任务优先级; From 7c89530ca1c7c8ea31e941f79363fb4ac8c2c160 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Wed, 15 Nov 2017 20:23:05 +0800 Subject: [PATCH 33/93] =?UTF-8?q?=E6=9B=B4=E6=96=B0RM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 54eed3a2..8012252c 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1058,6 +1058,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 15、Bean模式任务,JobHandler自动从执行器中查询展示为下拉框,选择后自动填充任务名称等属性; - 16、任务告警邮件优化,调整为表格形式; - 17、任务报表,支持时间筛选; +- 18、JobHandler提供 init/destroy 方法,支持自定义任务线程销毁逻辑; ## 七、其他 From cc96aae12da60294234b911bd2bb00e01426e2d2 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Wed, 15 Nov 2017 20:37:26 +0800 Subject: [PATCH 34/93] =?UTF-8?q?=E6=9B=B4=E6=96=B0RM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 8012252c..9644279d 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1059,6 +1059,8 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 16、任务告警邮件优化,调整为表格形式; - 17、任务报表,支持时间筛选; - 18、JobHandler提供 init/destroy 方法,支持自定义任务线程销毁逻辑; +- 19、cron表达式的最大长度调整,兼容复杂类型cron; +- 20、执行器回调地址/日志地址格式兼容,是否已"/"结尾均; ## 七、其他 From 44dfd0ca433ab77c013071b47a691022a4339c25 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Wed, 15 Nov 2017 20:38:04 +0800 Subject: [PATCH 35/93] =?UTF-8?q?=E6=9B=B4=E6=96=B0RM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 9644279d..adf5af3d 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1060,7 +1060,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 17、任务报表,支持时间筛选; - 18、JobHandler提供 init/destroy 方法,支持自定义任务线程销毁逻辑; - 19、cron表达式的最大长度调整,兼容复杂类型cron; -- 20、执行器回调地址/日志地址格式兼容,是否已"/"结尾均; +- 20、执行器回调地址/日志地址格式兼容,是否已"/"结尾均支持; ## 七、其他 From 7b639a14b1e0ff79173c2089e33495ad45ab2b1c Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Thu, 16 Nov 2017 11:08:23 +0800 Subject: [PATCH 36/93] =?UTF-8?q?=E6=9B=B4=E6=96=B0RM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index adf5af3d..328e9585 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1061,6 +1061,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 18、JobHandler提供 init/destroy 方法,支持自定义任务线程销毁逻辑; - 19、cron表达式的最大长度调整,兼容复杂类型cron; - 20、执行器回调地址/日志地址格式兼容,是否已"/"结尾均支持; +- 21、执行器端口支持随机生成,避免端口冲突; ## 七、其他 From b6f3ad8ab80495fec66e766b6f54978a73b973df Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Wed, 22 Nov 2017 12:18:53 +0800 Subject: [PATCH 37/93] =?UTF-8?q?=E9=82=AE=E4=BB=B6=E5=8F=91=E9=80=81?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xxl/job/admin/core/util/MailUtil.java | 38 +++++++++++-------- .../main/resources/xxl-job-admin.properties | 1 - 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/MailUtil.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/MailUtil.java index 1bba0ecb..c37a9295 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/MailUtil.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/MailUtil.java @@ -25,14 +25,12 @@ public class MailUtil { private static String port; private static String username; private static String password; - private static String sendFrom; private static String sendNick; static{ host = PropertiesUtil.getString("xxl.job.mail.host"); port = PropertiesUtil.getString("xxl.job.mail.port"); username = PropertiesUtil.getString("xxl.job.mail.username"); password = PropertiesUtil.getString("xxl.job.mail.password"); - sendFrom = PropertiesUtil.getString("xxl.job.mail.sendFrom"); sendNick = PropertiesUtil.getString("xxl.job.mail.sendNick"); } @@ -70,8 +68,9 @@ public class MailUtil { try { MimeMessage mimeMessage = javaMailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, ArrayUtils.isNotEmpty(attachments), "UTF-8"); // 设置utf-8或GBK编码,否则邮件会有乱码;multipart,true表示文件上传 - - helper.setFrom(sendFrom, sendNick); + + + helper.setFrom(username, sendNick); helper.setTo(toAddress); // 设置收件人抄送的名片和地址(相当于群发了) @@ -111,38 +110,45 @@ public class MailUtil { public static boolean sendMail (String toAddress, String mailSubject, String mailBody, boolean mailBodyIsHtml, File[] attachments){ try { - // 创建邮件发送类 JavaMailSender (用于发送多元化邮件,包括附件,图片,html 等 ) + // 创建邮件发送类 JavaMailSender (用于发送多元化邮件,包括附件,图片,html 等) JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); mailSender.setHost(host); // 设置邮件服务主机 mailSender.setUsername(username); // 发送者邮箱的用户名 mailSender.setPassword(password); // 发送者邮箱的密码 - //配置文件,用于实例化java.mail.session + // 配置文件,用于实例化java.mail.session Properties pro = new Properties(); + pro.put("mail.transport.protocol", "smtp"); pro.put("mail.smtp.auth", "true"); // 登录SMTP服务器,需要获得授权 (网易163邮箱新近注册的邮箱均不能授权,测试 sohu 的邮箱可以获得授权) pro.put("mail.smtp.socketFactory.port", port); pro.put("mail.smtp.socketFactory.fallback", "false"); mailSender.setJavaMailProperties(pro); - //创建多元化邮件 (创建 mimeMessage 帮助类,用于封装信息至 mimeMessage) + // 创建多元化邮件 (创建 mimeMessage 帮助类,用于封装信息至 mimeMessage) MimeMessage mimeMessage = mailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, ArrayUtils.isNotEmpty(attachments), "UTF-8"); - helper.setFrom(sendFrom, sendNick); + helper.setFrom(username, sendNick); helper.setTo(toAddress); helper.setSubject(mailSubject); helper.setText(mailBody, mailBodyIsHtml); - // 添加内嵌文件,第1个参数为cid标识这个文件,第2个参数为资源 - //helper.addInline(MimeUtility.encodeText(inLineFile.getName()), inLineFile); + // 设置收件人抄送的名片和地址(相当于群发) + //helper.setCc(InternetAddress.parse(MimeUtility.encodeText("邮箱001") + " <@163.com>," + MimeUtility.encodeText("邮箱002") + " <@foxmail.com>")); + + // 内嵌文件,第1个参数为cid标识这个文件,第2个参数为资源 + //helper.addInline(MimeUtility.encodeText(inLineFile.getName()), inLineFile); - // 添加附件 - if (ArrayUtils.isNotEmpty(attachments)) { + // 添加附件 + /*if (ArrayUtils.isNotEmpty(attachments)) { for (File file : attachments) { helper.addAttachment(MimeUtility.encodeText(file.getName()), file); } - } + }*/ + + // 群发 + //MimeMessage[] mailMessages = { mimeMessage }; mailSender.send(mimeMessage); return true; @@ -156,11 +162,11 @@ public class MailUtil { public static void main(String[] args) { ExecutorService exec = Executors.newCachedThreadPool(); - for (int i = 0; i < 20; i++) { + for (int i = 0; i < 1; i++) { exec.execute(new Thread(new Runnable() { @Override public void run() { - while(total < 10){ + while(total < 1){ String mailBody = "

新书快递通知

你的新书快递申请已推送新书,请到空间" + "中查看"; - sendMail("ovono802302@163.com", "测试邮件", mailBody, false, null); + sendMail("931591021@qq.com", "测试邮件", mailBody, true, null); System.out.println(total); total++; } diff --git a/xxl-job-admin/src/main/resources/xxl-job-admin.properties b/xxl-job-admin/src/main/resources/xxl-job-admin.properties index ac5576f7..9c425aba 100644 --- a/xxl-job-admin/src/main/resources/xxl-job-admin.properties +++ b/xxl-job-admin/src/main/resources/xxl-job-admin.properties @@ -9,7 +9,6 @@ xxl.job.mail.host=smtp.163.com xxl.job.mail.port=25 xxl.job.mail.username=ovono802302@163.com xxl.job.mail.password=asdfzxcv -xxl.job.mail.sendFrom=ovono802302@163.com xxl.job.mail.sendNick=《任务调度平台XXL-JOB》 ### xxl-job login From d96b36fc2c661fd4d0bd95f4b8651a9efebfa251 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Thu, 23 Nov 2017 12:15:18 +0800 Subject: [PATCH 38/93] =?UTF-8?q?=E6=9B=B4=E6=96=B0RM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB-English-Documentation.md | 7 +++++++ doc/XXL-JOB官方文档.md | 21 +++++++++++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/doc/XXL-JOB-English-Documentation.md b/doc/XXL-JOB-English-Documentation.md index ee97fe81..cee39f8a 100644 --- a/doc/XXL-JOB-English-Documentation.md +++ b/doc/XXL-JOB-English-Documentation.md @@ -96,6 +96,13 @@ So far, XXL-JOB has access to a number of companies online product line, access - 45、广州知识圈网络科技有限公司 - 46、国誉商业上海有限公司 - 47、海尔消费金融有限公司,嗨付、够花 (海尔) + - 48、广州巴图鲁信息科技有限公司 + - 49、深圳市鹏海运电子数据交换有限公司 + - 50、深圳市亚飞电子商务有限公司 + - 51、上海趣医网络有限公司 + - 52、聚金资本 + - 53、北京父母邦网络科技有限公司 + - 54、中山元赫软件科技有限公司 - …… > The company that access and use this product is welcome to register at the [address](https://github.com/xuxueli/xxl-job/issues/1 ), only for product promotion. diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 328e9585..959a5aab 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -101,6 +101,13 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 - 45、广州知识圈网络科技有限公司 - 46、国誉商业上海有限公司 - 47、海尔消费金融有限公司,嗨付、够花 (海尔) + - 48、广州巴图鲁信息科技有限公司 + - 49、深圳市鹏海运电子数据交换有限公司 + - 50、深圳市亚飞电子商务有限公司 + - 51、上海趣医网络有限公司 + - 52、聚金资本 + - 53、北京父母邦网络科技有限公司 + - 54、中山元赫软件科技有限公司 - …… > 更多接入的公司,欢迎在 [登记地址](https://github.com/xuxueli/xxl-job/issues/1 ) 登记,登记仅仅为了产品推广。 @@ -606,18 +613,24 @@ org.quartz.jobStore.clusterCheckinInterval: 1000 ``` #### 5.4.4 调度线程池 -默认线程池中线程的数量为10个,避免单线程因阻塞而引起任务调度延迟。 +调度采用线程池方式实现,避免单线程因阻塞而引起任务调度延迟。 ``` org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool -org.quartz.threadPool.threadCount: 10 +org.quartz.threadPool.threadCount: 15 org.quartz.threadPool.threadPriority: 5 org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true ``` -XXL-JOB系统中业务逻辑在远程执行器执行,调度中心每次调度仅仅负责一次调度请求,执行器会将请求存入执行队列并且立即响应调度中心;相比直接在quartz的QuartzJobBean中执行业务逻辑,差别就像大象和羽毛; +XXL-JOB系统中业务逻辑在远程执行器执行,调度中心每次触发调度时仅发送一次调度请求,执行器会将请求存入执行队列并且立即响应调度中心;相比直接在quartz的QuartzJobBean中执行业务逻辑,极大的降低了调度线程占用; -XXL-JOB调度中心中每个JOB逻辑非常 “轻”,单个JOB一次运行平均耗时基本在 "100ms" 之内(基本是网络开销);因此,可以保证使用有限的线程支撑大量的JOB并发运行;上面配置的10个线程至少可以支撑100个JOB正常运行; +XXL-JOB调度中心中每个JOB逻辑非常 “轻”,单个JOB一次运行平均耗时基本在 "10ms" 之内(基本为一次请求的网络开销);因此,可以保证使用有限的线程支撑大量的JOB并发运行; + +理论上采用推荐机器配置 "4核4G内存"情况下,单线程可以承担 100(quartz最小时间粒度1000ms/触发一次任务耗时10ms)个密集任务(每秒执行一次)的正常调度触发。因此,默认配置的15个线程理论上可以承担起1500个密集任务的正常运行。 + +实际场景中,调度请求网络耗时不同、DB读写耗时不同、任务密集或稀疏调度情况不同,会导致任务量上限会上下波动。 + +如若需要支撑更多的任务量,可以通过 "调大调度线程数" 和 "提升机器配置" 两种方式实现。 #### 5.4.5 @DisallowConcurrentExecution XXL-JOB调度模块的“调度中心”默认不使用该注解,即默认开启并行机制,因为RemoteHttpJobBean为公共QuartzJobBean,这样在多线程调度的情况下,调度模块被阻塞的几率很低,大大提高了调度系统的承载量。 From 018c25fa5797274e510530f26a0949f277d545e4 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Thu, 23 Nov 2017 17:43:22 +0800 Subject: [PATCH 39/93] =?UTF-8?q?=E6=9B=B4=E6=96=B0RM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 959a5aab..8ee9f0ae 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1075,6 +1075,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 19、cron表达式的最大长度调整,兼容复杂类型cron; - 20、执行器回调地址/日志地址格式兼容,是否已"/"结尾均支持; - 21、执行器端口支持随机生成,避免端口冲突; +- 22、任务单机多线程:提升任务单机并行处理能力; ## 七、其他 From 664f07eaac79143382398544da6c95a20da960ee Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Thu, 23 Nov 2017 23:28:28 +0800 Subject: [PATCH 40/93] =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=B3=A8=E8=A7=A3?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=B8=BA=20=E2=80=9C@JobHandler=E2=80=9D?= =?UTF-8?q?=EF=BC=8C=E4=B8=8E=E4=BB=BB=E5=8A=A1=E6=B3=A8=E8=A7=A3=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB-English-Documentation.md | 12 ++++++------ doc/XXL-JOB官方文档.md | 15 ++++++++------- .../com/xxl/job/core/executor/XxlJobExecutor.java | 6 +++--- .../{JobHander.java => JobHandler.java} | 2 +- .../service/jobhandler/DemoJobHandler.java | 6 +++--- .../service/jobhandler/ShardingJobHandler.java | 4 ++-- .../service/jobhandler/DemoJobHandler.java | 6 +++--- .../service/jobhandler/ShardingJobHandler.java | 4 ++-- 8 files changed, 28 insertions(+), 27 deletions(-) rename xxl-job-core/src/main/java/com/xxl/job/core/handler/annotation/{JobHander.java => JobHandler.java} (93%) diff --git a/doc/XXL-JOB-English-Documentation.md b/doc/XXL-JOB-English-Documentation.md index cee39f8a..b03b1b29 100644 --- a/doc/XXL-JOB-English-Documentation.md +++ b/doc/XXL-JOB-English-Documentation.md @@ -347,7 +347,7 @@ On the log console,you can view task execution log on the executor immediately a GLUE模式(Java):task source code is maintened in the schedule center,it must implement IJobHandler and explain by "groovy" in the executor instance,inject other bean instace by annotation @Resource/@Autowire. GLUE模式(Shell):it’s source code is a shell script and maintained in the schedule center. GLUE模式(Python):it’s source code is a python script and maintained in the schedule center. - - JobHandler:it’s used in "BEAN模式",it’s instance is defined by annotation @JobHander on the JobHandler class name. + - JobHandler:it’s used in "BEAN模式",it’s instance is defined by annotation @JobHandler on the JobHandler class name. - 子任务Key:every task has a unique key (task Key can acquire from task list),when main task is done successfully it’s child task stand for by this key will be scheduled. - 阻塞处理策略:the stategy handle the task when this task is scheduled too frequently and the task is block to wait for cpu time. 单机串行(默认):task schedule request go into the FIFO queue and execute serially. @@ -366,7 +366,7 @@ The task logic exist in the executor project as JobHandler,the develop steps as #### Step 1:develp obHandler in the executor project - 1, create new java class implent com.xxl.job.core.handler.IJobHandler; - 2, if you add @Component annotation on the top of the class name it’s will be managed as a bean instance by spring container; - - 3, add “@JobHander(value=" customize jobhandler name")” annotation,the value stand for JobHandler name,it will be used as JobHandler property when create a new task in the schedule center. + - 3, add “@JobHandler(value=" customize jobhandler name")” annotation,the value stand for JobHandler name,it will be used as JobHandler property when create a new task in the schedule center. (go and see DemoJobHandler in the xxl-job-executor-example project, as shown below) ![输入图片说明](https://static.oschina.net/uploads/img/201607/23232347_oLlM.png "在这里输入图片标题") @@ -682,7 +682,7 @@ On the task log page ,you can see matched child task and triggered child task’ ### 5.5 Task "run mode" analysis #### 5.5.1 "Bean模式" task Development steps:go and see "chapter 3" . -principle: every Bean mode task is a Spring Bean instance and it is maintained in executor project’s Spring container. task class nedd to add “@JobHander(value="name")” annotation, because executor identify task bean instance in spring container through annotation. Task class nedd to implements interface IJobHandler, task logic code in method execute(), the task logic in execute() method will be executed when executor received a schedule request from schedule center. +principle: every Bean mode task is a Spring Bean instance and it is maintained in executor project’s Spring container. task class nedd to add “@JobHandler(value="name")” annotation, because executor identify task bean instance in spring container through annotation. Task class nedd to implements interface IJobHandler, task logic code in method execute(), the task logic in execute() method will be executed when executor received a schedule request from schedule center. #### 5.5.2 "GLUE模式(Java)" task Development steps:go and see "chapter 3" . @@ -703,7 +703,7 @@ Executor is actually an embedded Jetty server with default port 9999, as shown b ![输入图片说明](https://static.oschina.net/uploads/img/201703/10174923_TgNO.png "在这里输入图片标题") -Executor will identify Bean mode task in spring container through @JobHander When project start, it will be managed use the value of annotation as key. +Executor will identify Bean mode task in spring container through @JobHandler When project start, it will be managed use the value of annotation as key. When executor received schedule request from schedule center, if task type is “Bean模式” it will match bean mode task in Spring container and call it’s execute() method and execute task logic. if task type is “GLUE模式”, it will load Glue code, instantiate a Java object and inject other spring service(notice: the spring service injected in Glue code must exist in the same executor project), then call execute() method and execute task logic. @@ -810,13 +810,13 @@ The scheduling center API service requests reference code:com.xxl.job.dao.impl - stability; ### 6.3 version V1.3.0,New features [2016-05-19] -- 1、discard local task module, remote task was recommended, easy to decouple system, the JobHander of task was called executor. +- 1、discard local task module, remote task was recommended, easy to decouple system, the JobHandler of task was called executor. - 2、dicard underlying communication type servlet, JETTY was recommended, schedule and callback bidirectional communication, rebuild the communication logic; - 3、UI interactive optimization:optimize left menu expansion and menu item selected status , task list opens the table with compression optimization; - 4、【important】executor is subdivided into two develop mode:BEAN、GLUE: Introduction to the executor mode: - - BEAN mode executor:every executor is a Spring Bean instance,it was recognized and scheduled by XXL-JOB through @JobHander annotation; + - BEAN mode executor:every executor is a Spring Bean instance,it was recognized and scheduled by XXL-JOB through @JobHandler annotation; -GLUE mode executor:every executor corresponds to a piece of code,edited and maintained online by Web, Dynamic compile and takes effect in real time, executor is responsible for loading GLUE code and executing; ### 6.4 version V1.3.1,New features [2016-05-23] diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 8ee9f0ae..4b9ccd82 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -359,7 +359,7 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 GLUE模式(Shell):任务以源码方式维护在调度中心;该模式的任务实际上是一段 "shell" 脚本; GLUE模式(Python):任务以源码方式维护在调度中心;该模式的任务实际上是一段 "python" 脚本; GLUE模式(NodeJS):任务以源码方式维护在调度中心;该模式的任务实际上是一段 "nodejs" 脚本; - - JobHandler:运行模式为 "BEAN模式" 时生效,对应执行器中新开发的JobHandler类“@JobHander”注解自定义的value值; + - JobHandler:运行模式为 "BEAN模式" 时生效,对应执行器中新开发的JobHandler类“@JobHandler”注解自定义的value值; - 子任务Key:每个任务都拥有一个唯一的任务Key(任务Key可以从任务列表获取),当本任务执行结束并且执行成功时,将会触发子任务Key所对应的任务的一次主动调度。 - 阻塞处理策略:调度过于密集执行器来不及处理时的处理策略; 单机串行(默认):调度请求进入单机执行器后,调度请求进入FIFO队列并以串行方式运行; @@ -378,13 +378,13 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 #### 步骤一:执行器项目中,开发JobHandler: - 1、 新建一个继承com.xxl.job.core.handler.IJobHandler的Java类; - 2、 该类被Spring容器扫描为Bean实例,如加“@Component”注解; - - 3、 添加 “@JobHander(value="自定义jobhandler名称")”注解,注解的value值为自定义的JobHandler名称,该名称对应的是调度中心新建任务的JobHandler属性的值。 + - 3、 添加 “@JobHandler(value="自定义jobhandler名称")”注解,注解的value值为自定义的JobHandler名称,该名称对应的是调度中心新建任务的JobHandler属性的值。 (可参考Sample示例执行器中的DemoJobHandler,见下图) ![输入图片说明](https://static.oschina.net/uploads/img/201607/23232347_oLlM.png "在这里输入图片标题") #### 步骤二:调度中心,新建调度任务 -参考上文“配置属性详细说明”对新建的任务进行参数配置,运行模式选中 "BEAN模式",JobHandler属性填写任务注解@JobHander中定义的值; +参考上文“配置属性详细说明”对新建的任务进行参数配置,运行模式选中 "BEAN模式",JobHandler属性填写任务注解“@JobHandler”中定义的值; ![输入图片说明](https://static.oschina.net/uploads/img/201704/27225124_yrcO.png "在这里输入图片标题") @@ -715,7 +715,7 @@ xxl-job-admin#com.xxl.job.admin.controller.JobApiController.callback ### 5.5 任务 "运行模式" 剖析 #### 5.5.1 "Bean模式" 任务 开发步骤:可参考 "章节三" ; -原理:每个Bean模式任务都是一个Spring的Bean类实例,它被维护在“执行器”项目的Spring容器中。任务类需要加“@JobHander(value="名称")”注解,因为“执行器”会根据该注解识别Spring容器中的任务。任务类需要继承统一接口“IJobHandler”,任务逻辑在execute方法中开发,因为“执行器”在接收到调度中心的调度请求时,将会调用“IJobHandler”的execute方法,执行任务逻辑。 +原理:每个Bean模式任务都是一个Spring的Bean类实例,它被维护在“执行器”项目的Spring容器中。任务类需要加“@JobHandler(value="名称")”注解,因为“执行器”会根据该注解识别Spring容器中的任务。任务类需要继承统一接口“IJobHandler”,任务逻辑在execute方法中开发,因为“执行器”在接收到调度中心的调度请求时,将会调用“IJobHandler”的execute方法,执行任务逻辑。 #### 5.5.2 "GLUE模式(Java)" 任务 开发步骤:可参考 "章节三" ; @@ -737,7 +737,7 @@ xxl-job-admin#com.xxl.job.admin.controller.JobApiController.callback ![输入图片说明](https://static.oschina.net/uploads/img/201703/10174923_TgNO.png "在这里输入图片标题") -在项目启动时,执行器会通过“@JobHander”识别Spring容器中“Bean模式任务”,以注解的value属性为key管理起来。 +在项目启动时,执行器会通过“@JobHandler”识别Spring容器中“Bean模式任务”,以注解的value属性为key管理起来。 “执行器”接收到“调度中心”的调度请求时,如果任务类型为“Bean模式”,将会匹配Spring容器中的“Bean模式任务”,然后调用其execute方法,执行任务逻辑。如果任务类型为“GLUE模式”,将会加载GLue代码,实例化Java对象,注入依赖的Spring服务(注意:Glue代码中注入的Spring服务,必须存在与该“执行器”项目的Spring容器中),然后调用execute方法,执行任务逻辑。 @@ -860,13 +860,13 @@ XXL-JOB会为每次调度请求生成一个单独的日志文件,需要通过 - 稳定性; ### 6.3 版本 V1.3.0,新特性[2016-05-19] -- 1、遗弃“本地任务”模式,推荐使用“远程任务”,易于系统解耦,任务对应的JobHander统称为“执行器”; +- 1、遗弃“本地任务”模式,推荐使用“远程任务”,易于系统解耦,任务对应的JobHandler统称为“执行器”; - 2、遗弃“servlet”方式底层系统通讯,推荐使用JETTY方式,调度+回调双向通讯,重构通讯逻辑; - 3、UI交互优化:左侧菜单展开状态优化,菜单项选中状态优化,任务列表打开表格有压缩优化; - 4、【重要】“执行器”细分为:BEAN、GLUE两种开发模式,简介见下文: “执行器” 模式简介: - - BEAN模式执行器:每个执行器都是Spring的一个Bean实例,XXL-JOB通过注解@JobHander识别和调度执行器; + - BEAN模式执行器:每个执行器都是Spring的一个Bean实例,XXL-JOB通过注解@JobHandler识别和调度执行器; -GLUE模式执行器:每个执行器对应一段代码,在线Web编辑和维护,动态编译生效,执行器负责加载GLUE代码和执行; ### 6.4 版本 V1.3.1,新特性[2016-05-23] @@ -1052,6 +1052,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 6、执行器动态代理对象,拦截非业务方法的执行; - 7、底层系统日志级别规范调整,清理遗留代码; - 8、修改JobThread捕获Error错误不更新JobLog的问题; +- 9、任务注解调整为 “@JobHandler”,与任务注解统一; ### TODO LIST - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限; 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 5e17a932..d35dbe9c 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 @@ -4,7 +4,7 @@ import com.xxl.job.core.biz.AdminBiz; import com.xxl.job.core.biz.ExecutorBiz; import com.xxl.job.core.biz.impl.ExecutorBizImpl; import com.xxl.job.core.handler.IJobHandler; -import com.xxl.job.core.handler.annotation.JobHander; +import com.xxl.job.core.handler.annotation.JobHandler; import com.xxl.job.core.log.XxlJobFileAppender; import com.xxl.job.core.rpc.netcom.NetComClientProxy; import com.xxl.job.core.rpc.netcom.NetComServerFactory; @@ -141,12 +141,12 @@ public class XxlJobExecutor implements ApplicationContextAware { } private static void initJobHandlerRepository(ApplicationContext applicationContext){ // init job handler action - Map serviceBeanMap = applicationContext.getBeansWithAnnotation(JobHander.class); + Map serviceBeanMap = applicationContext.getBeansWithAnnotation(JobHandler.class); if (serviceBeanMap!=null && serviceBeanMap.size()>0) { for (Object serviceBean : serviceBeanMap.values()) { if (serviceBean instanceof IJobHandler){ - String name = serviceBean.getClass().getAnnotation(JobHander.class).value(); + String name = serviceBean.getClass().getAnnotation(JobHandler.class).value(); IJobHandler handler = (IJobHandler) serviceBean; if (loadJobHandler(name) != null) { throw new RuntimeException("xxl-job jobhandler naming conflicts."); diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/handler/annotation/JobHander.java b/xxl-job-core/src/main/java/com/xxl/job/core/handler/annotation/JobHandler.java similarity index 93% rename from xxl-job-core/src/main/java/com/xxl/job/core/handler/annotation/JobHander.java rename to xxl-job-core/src/main/java/com/xxl/job/core/handler/annotation/JobHandler.java index 0172f5f6..253026a4 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/handler/annotation/JobHander.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/handler/annotation/JobHandler.java @@ -13,7 +13,7 @@ import java.lang.annotation.Target; @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited -public @interface JobHander { +public @interface JobHandler { String value() default ""; diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java index 905a0b7b..b0fb6c01 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java +++ b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java @@ -2,7 +2,7 @@ package com.xxl.job.executor.service.jobhandler; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.handler.IJobHandler; -import com.xxl.job.core.handler.annotation.JobHander; +import com.xxl.job.core.handler.annotation.JobHandler; import com.xxl.job.core.log.XxlJobLogger; import org.springframework.stereotype.Component; @@ -15,12 +15,12 @@ import java.util.concurrent.TimeUnit; * 开发步骤: * 1、新建一个继承com.xxl.job.core.handler.IJobHandler的Java类; * 2、该类被Spring容器扫描为Bean实例,如加“@Component”注解; - * 3、添加 “@JobHander(value="自定义jobhandler名称")”注解,注解的value值为自定义的JobHandler名称,该名称对应的是调度中心新建任务的JobHandler属性的值。 + * 3、添加 “@JobHandler(value="自定义jobhandler名称")”注解,注解的value值为自定义的JobHandler名称,该名称对应的是调度中心新建任务的JobHandler属性的值。 * 4、执行日志:需要通过 "XxlJobLogger.log" 打印执行日志; * * @author xuxueli 2015-12-19 19:43:36 */ -@JobHander(value="demoJobHandler") +@JobHandler(value="demoJobHandler") @Component public class DemoJobHandler extends IJobHandler { diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/java/com/xxl/job/executor/service/jobhandler/ShardingJobHandler.java b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/java/com/xxl/job/executor/service/jobhandler/ShardingJobHandler.java index 66560353..4c0b5c80 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/java/com/xxl/job/executor/service/jobhandler/ShardingJobHandler.java +++ b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/java/com/xxl/job/executor/service/jobhandler/ShardingJobHandler.java @@ -2,7 +2,7 @@ package com.xxl.job.executor.service.jobhandler; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.handler.IJobHandler; -import com.xxl.job.core.handler.annotation.JobHander; +import com.xxl.job.core.handler.annotation.JobHandler; import com.xxl.job.core.log.XxlJobLogger; import com.xxl.job.core.util.ShardingUtil; import org.springframework.stereotype.Service; @@ -13,7 +13,7 @@ import org.springframework.stereotype.Service; * * @author xuxueli 2017-07-25 20:56:50 */ -@JobHander(value="shardingJobHandler") +@JobHandler(value="shardingJobHandler") @Service public class ShardingJobHandler extends IJobHandler { diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java index bf22239f..5a9bce0a 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java +++ b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java @@ -2,7 +2,7 @@ package com.xxl.job.executor.service.jobhandler; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.handler.IJobHandler; -import com.xxl.job.core.handler.annotation.JobHander; +import com.xxl.job.core.handler.annotation.JobHandler; import com.xxl.job.core.log.XxlJobLogger; import org.springframework.stereotype.Service; @@ -15,12 +15,12 @@ import java.util.concurrent.TimeUnit; * 开发步骤: * 1、继承 “IJobHandler” ; * 2、装配到Spring,例如加 “@Service” 注解; - * 3、加 “@JobHander” 注解,注解value值为新增任务生成的JobKey的值;多个JobKey用逗号分割; + * 3、加 “@JobHandler” 注解,注解value值为新增任务生成的JobKey的值;多个JobKey用逗号分割; * 4、执行日志:需要通过 "XxlJobLogger.log" 打印执行日志; * * @author xuxueli 2015-12-19 19:43:36 */ -@JobHander(value="demoJobHandler") +@JobHandler(value="demoJobHandler") @Service public class DemoJobHandler extends IJobHandler { diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/ShardingJobHandler.java b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/ShardingJobHandler.java index c8b15602..80cf1177 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/ShardingJobHandler.java +++ b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/ShardingJobHandler.java @@ -2,7 +2,7 @@ package com.xxl.job.executor.service.jobhandler; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.handler.IJobHandler; -import com.xxl.job.core.handler.annotation.JobHander; +import com.xxl.job.core.handler.annotation.JobHandler; import com.xxl.job.core.log.XxlJobLogger; import com.xxl.job.core.util.ShardingUtil; import org.springframework.stereotype.Service; @@ -13,7 +13,7 @@ import org.springframework.stereotype.Service; * * @author xuxueli 2017-07-25 20:56:50 */ -@JobHander(value="shardingJobHandler") +@JobHandler(value="shardingJobHandler") @Service public class ShardingJobHandler extends IJobHandler { From 738d3cb0cfb48fe95c74eddcba7fc8e2b5aee281 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Tue, 28 Nov 2017 18:13:06 +0800 Subject: [PATCH 41/93] =?UTF-8?q?=E6=9B=B4=E6=96=B0RM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 8ee9f0ae..3e07609b 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -341,16 +341,16 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 - 执行器:任务的绑定的执行器,任务触发调度时将会自动发现注册成功的执行器, 实现任务自动发现功能; 另一方面也可以方便的进行任务分组。每个任务必须绑定一个执行器, 可在 "执行器管理" 进行设置; - 描述:任务的描述信息,便于任务管理; - 路由策略:当执行器集群部署时,提供丰富的路由策略,包括; - FIRST(第一个):固定选择第一个执行器; - LAST(最后一个):固定选择最后一个执行器; + FIRST(第一个):固定选择第一个机器; + LAST(最后一个):固定选择最后一个机器; ROUND(轮询):; - RANDOM(随机):随机选择在线的执行器; - CONSISTENT_HASH(一致性HASH):分组下机器地址相同,不同JOB均匀散列在不同机器上,保证分组下机器分配JOB平均;且每个JOB固定调度其中一台机器; - LEAST_FREQUENTLY_USED(最不经常使用):单个JOB对应的每个执行器,使用频率最低的优先被选举; - LEAST_RECENTLY_USED(最近最久未使用):单个JOB对应的每个执行器,最久为使用的优先被选举; + RANDOM(随机):随机选择在线的机器; + CONSISTENT_HASH(一致性HASH):每个任务按照Hash算法固定选择某一台机器,且所有任务均匀散列在不同机器上。 + LEAST_FREQUENTLY_USED(最不经常使用):使用频率最低的机器优先被选举; + LEAST_RECENTLY_USED(最近最久未使用):最久为使用的机器优先被选举; FAILOVER(故障转移):按照顺序依次进行心跳检测,第一个心跳检测成功的机器选定为目标执行器并发起调度; BUSYOVER(忙碌转移):按照顺序依次进行空闲检测,第一个空闲检测成功的机器选定为目标执行器并发起调度; - SHARDING_BROADCAST(分片广播):广播触发对应集群中所有执行器执行一次任务,同时传递分片参数;可根据分片参数开发分片任务; + SHARDING_BROADCAST(分片广播):广播触发对应集群中所有机器执行一次任务,同时传递分片参数;可根据分片参数开发分片任务; - Cron:触发任务执行的Cron表达式; - 运行模式: From 52ba5a88fd5307e8120ab2f4fdb9ac578da26ebf Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Tue, 28 Nov 2017 18:32:47 +0800 Subject: [PATCH 42/93] =?UTF-8?q?=E6=9B=B4=E6=96=B0RM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 29204700..52c1b008 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,7 @@ -# for eclipse -/.settings/ -/.project - -# for idea +.idea +.classpath +.project *.iml -/.idea -*/target +target/ .DS_Store .gitattributes From 41328f479572e95879ee09a06a17a0922bfe0677 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Wed, 29 Nov 2017 17:33:08 +0800 Subject: [PATCH 43/93] =?UTF-8?q?=E6=89=A7=E8=A1=8C=E5=99=A8=E7=AB=AF?= =?UTF-8?q?=E5=8F=A3=E6=94=AF=E6=8C=81=E9=9A=8F=E6=9C=BA=E7=94=9F=E6=88=90?= =?UTF-8?q?(=E5=B0=8F=E4=BA=8E=E7=AD=89=E4=BA=8E0=E6=97=B6)=EF=BC=8C?= =?UTF-8?q?=E9=81=BF=E5=85=8D=E7=AB=AF=E5=8F=A3=E5=AE=9A=E4=B9=89=E5=86=B2?= =?UTF-8?q?=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 5 +- .../xxl/job/core/executor/XxlJobExecutor.java | 7 +- .../java/com/xxl/job/core/util/NetUtil.java | 70 +++++++++++++++++++ 3 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 xxl-job-core/src/main/java/com/xxl/job/core/util/NetUtil.java diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index a2deb935..c3543a11 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1053,6 +1053,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 7、底层系统日志级别规范调整,清理遗留代码; - 8、修改JobThread捕获Error错误不更新JobLog的问题; - 9、任务注解调整为 “@JobHandler”,与任务注解统一; +- 10、执行器端口支持随机生成(小于等于0时),避免端口定义冲突; ### TODO LIST - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限; @@ -1075,8 +1076,8 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 18、JobHandler提供 init/destroy 方法,支持自定义任务线程销毁逻辑; - 19、cron表达式的最大长度调整,兼容复杂类型cron; - 20、执行器回调地址/日志地址格式兼容,是否已"/"结尾均支持; -- 21、执行器端口支持随机生成,避免端口冲突; -- 22、任务单机多线程:提升任务单机并行处理能力; +- 21、任务单机多线程:提升任务单机并行处理能力; + ## 七、其他 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 d35dbe9c..4ecb461c 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 @@ -9,6 +9,7 @@ import com.xxl.job.core.log.XxlJobFileAppender; import com.xxl.job.core.rpc.netcom.NetComClientProxy; import com.xxl.job.core.rpc.netcom.NetComServerFactory; import com.xxl.job.core.thread.JobThread; +import com.xxl.job.core.util.NetUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; @@ -28,7 +29,7 @@ public class XxlJobExecutor implements ApplicationContextAware { // ---------------------- param ---------------------- private String ip; - private int port = 9999; + private int port; private String appName; private String adminAddresses; private String accessToken; @@ -121,6 +122,10 @@ public class XxlJobExecutor implements ApplicationContextAware { // ---------------------- executor-server(jetty) ---------------------- private NetComServerFactory serverFactory = new NetComServerFactory(); private void initExecutorServer(int port, String ip, String appName, String accessToken) throws Exception { + // valid param + port = port>0?port: NetUtil.findAvailablePort(9999); + + // start server NetComServerFactory.putService(ExecutorBiz.class, new ExecutorBizImpl()); // rpc-service, base on jetty NetComServerFactory.setAccessToken(accessToken); serverFactory.start(port, ip, appName); // jetty + registry diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/util/NetUtil.java b/xxl-job-core/src/main/java/com/xxl/job/core/util/NetUtil.java new file mode 100644 index 00000000..118a0fa5 --- /dev/null +++ b/xxl-job-core/src/main/java/com/xxl/job/core/util/NetUtil.java @@ -0,0 +1,70 @@ +package com.xxl.job.core.util; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.net.ServerSocket; + +/** + * net util + * + * @author xuxueli 2017-11-29 17:00:25 + */ +public class NetUtil { + private static Logger logger = LoggerFactory.getLogger(NetUtil.class); + + /** + * find avaliable port + * + * @param defaultPort + * @return + */ + public static int findAvailablePort(int defaultPort) { + int portTmp = defaultPort; + while (portTmp < 65535) { + if (!isPortUsed(portTmp)) { + return portTmp; + } else { + portTmp++; + } + } + portTmp = defaultPort--; + while (portTmp > 0) { + if (!isPortUsed(portTmp)) { + return portTmp; + } else { + portTmp--; + } + } + throw new IllegalStateException("no available port."); + } + + /** + * check port used + * + * @param port + * @return + */ + public static boolean isPortUsed(int port) { + boolean used = false; + ServerSocket serverSocket = null; + try { + serverSocket = new ServerSocket(port); + used = false; + } catch (IOException e) { + logger.info(">>>>>>>>>>> xxl-job, port[{}] is in use.", port); + used = true; + } finally { + if (serverSocket != null) { + try { + serverSocket.close(); + } catch (IOException e) { + logger.info(""); + } + } + } + return used; + } + +} From 30b7b1a3e27dc32f2621b089e45e6e43eaa6acd8 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Wed, 29 Nov 2017 17:37:52 +0800 Subject: [PATCH 44/93] =?UTF-8?q?Log=E7=AD=89=E7=BA=A7=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xxl-job-core/src/main/java/com/xxl/job/core/util/NetUtil.java | 2 +- .../src/main/resources/application.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/util/NetUtil.java b/xxl-job-core/src/main/java/com/xxl/job/core/util/NetUtil.java index 118a0fa5..a10b17be 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/util/NetUtil.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/util/NetUtil.java @@ -53,7 +53,7 @@ public class NetUtil { serverSocket = new ServerSocket(port); used = false; } catch (IOException e) { - logger.info(">>>>>>>>>>> xxl-job, port[{}] is in use.", port); + logger.debug(">>>>>>>>>>> xxl-job, port[{}] is in use.", port); used = true; } finally { if (serverSocket != null) { 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 497c4299..a12408ac 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 @@ xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin ### xxl-job executor address xxl.job.executor.appname=xxl-job-executor-sample xxl.job.executor.ip= -xxl.job.executor.port=9998 +xxl.job.executor.port=-1 ### xxl-job log path xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler/ From 7aa6076e2b4df074b16dfa231cc99583db37d93e Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Thu, 30 Nov 2017 11:26:08 +0800 Subject: [PATCH 45/93] =?UTF-8?q?=E6=9B=B4=E6=96=B0RM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/images/donate-paypal.png | Bin 0 -> 7048 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/images/donate-paypal.png diff --git a/doc/images/donate-paypal.png b/doc/images/donate-paypal.png new file mode 100644 index 0000000000000000000000000000000000000000..24e78a407b506b0d3a12cdc7d0c1af9fabef91d8 GIT binary patch literal 7048 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 literal 0 HcmV?d00001 From d1d866e5ac93e1a295eacc2f5ebfd1340f36ce11 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Thu, 30 Nov 2017 11:31:39 +0800 Subject: [PATCH 46/93] =?UTF-8?q?=E6=9B=B4=E6=96=B0RM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 +---- doc/XXL-JOB官方文档.md | 5 +---- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index be55256d..ead68daa 100644 --- a/README.md +++ b/README.md @@ -163,7 +163,4 @@ This product is open source and free, and will continue to provide free communit ## Donate No matter how much the amount is enough to express your thought, thank you very much :) -无论金额多少都足够表达您这份心意,非常感谢 :) [XXL系列捐赠记录](http://www.xuxueli.com/page/donate.html ) - -微信: -支付宝: +无论金额多少都足够表达您这份心意,非常感谢 :) [前往捐赠](http://www.xuxueli.com/page/donate.html ) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index c3543a11..cb1e12db 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1095,7 +1095,4 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 --- ### 捐赠 -无论金额多少都足够表达您这份心意,非常感谢 :) [XXL系列捐赠记录](http://www.xuxueli.com/page/donate.html ) - -微信: -支付宝: +无论金额多少都足够表达您这份心意,非常感谢 :) [前往捐赠](http://www.xuxueli.com/page/donate.html ) From b37876a53d9b77fbe15e0bc5dfc8499678e39d48 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Thu, 30 Nov 2017 11:50:17 +0800 Subject: [PATCH 47/93] =?UTF-8?q?=E6=9B=B4=E6=96=B0RM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 +++++-- doc/XXL-JOB-English-Documentation.md | 7 +++---- doc/XXL-JOB官方文档.md | 2 ++ 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index ead68daa..99f006f5 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,10 @@ - + + + +

@@ -161,6 +164,6 @@ This product is open source and free, and will continue to provide free communit ## Donate -No matter how much the amount is enough to express your thought, thank you very much :) +No matter how much the amount is enough to express your thought, thank you very much :) [To donate](http://www.xuxueli.com/page/donate.html ) 无论金额多少都足够表达您这份心意,非常感谢 :) [前往捐赠](http://www.xuxueli.com/page/donate.html ) diff --git a/doc/XXL-JOB-English-Documentation.md b/doc/XXL-JOB-English-Documentation.md index b03b1b29..0835599a 100644 --- a/doc/XXL-JOB-English-Documentation.md +++ b/doc/XXL-JOB-English-Documentation.md @@ -5,6 +5,8 @@ [![GitHub release](https://img.shields.io/github/release/xuxueli/xxl-job.svg)](https://github.com/xuxueli/xxl-job/releases) [![License](https://img.shields.io/badge/license-GPLv3-blue.svg)](http://www.gnu.org/licenses/gpl-3.0.html) [![Gitter](https://badges.gitter.im/xuxueli/xxl-job.svg)](https://gitter.im/xuxueli/xxl-job?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) +[![donate](https://img.shields.io/badge/%24-donate-ff69b4.svg?style=flat-square)](http://www.xuxueli.com/page/donate.html) + ## 1. Brief introduction @@ -1015,7 +1017,4 @@ This product is open source and free, and will continue to provide free communit --- ### Donate -No matter how much the amount is enough to express your thought, thank you very much :) - -Webchat: -Alipay: +No matter how much the amount is enough to express your thought, thank you very much :) [To donate](http://www.xuxueli.com/page/donate.html ) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index cb1e12db..bf1efc6a 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -5,6 +5,8 @@ [![GitHub release](https://img.shields.io/github/release/xuxueli/xxl-job.svg)](https://github.com/xuxueli/xxl-job/releases) [![License](https://img.shields.io/badge/license-GPLv3-blue.svg)](http://www.gnu.org/licenses/gpl-3.0.html) [![Gitter](https://badges.gitter.im/xuxueli/xxl-job.svg)](https://gitter.im/xuxueli/xxl-job?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) +[![donate](https://img.shields.io/badge/%24-donate-ff69b4.svg?style=flat-square)](http://www.xuxueli.com/page/donate.html) + ## 一、简介 From 9e97ae2fdff5ec017a047131e818e3d2a77911cd Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Mon, 4 Dec 2017 22:51:40 +0800 Subject: [PATCH 48/93] =?UTF-8?q?=E4=BB=BB=E5=8A=A1Cron=E9=95=BF=E5=BA=A6?= =?UTF-8?q?=E6=89=A9=E5=B1=95=E6=94=AF=E6=8C=81=E8=87=B3128=E4=BD=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 1 + .../main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index bf1efc6a..1de666ee 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1056,6 +1056,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 8、修改JobThread捕获Error错误不更新JobLog的问题; - 9、任务注解调整为 “@JobHandler”,与任务注解统一; - 10、执行器端口支持随机生成(小于等于0时),避免端口定义冲突; +- 11、任务Cron长度扩展支持至128位; ### TODO LIST - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限; diff --git a/xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl b/xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl index 442045cb..ab1e5e75 100644 --- a/xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl +++ b/xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl @@ -127,7 +127,7 @@ -
+
@@ -284,7 +284,7 @@ process.exit(0)
-
+
From 0e1ef7f3ed1deaca8f801a672b50b41e787538d6 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Tue, 5 Dec 2017 00:26:45 +0800 Subject: [PATCH 49/93] =?UTF-8?q?=E8=B0=83=E5=BA=A6=E6=8A=A5=E8=A1=A8?= =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=8C=E6=94=AF=E6=8C=81=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E5=8C=BA=E9=97=B4=E7=AD=9B=E9=80=89=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 10 +- .../job/admin/controller/IndexController.java | 16 ++- .../xxl/job/admin/service/XxlJobService.java | 3 +- .../admin/service/impl/XxlJobServiceImpl.java | 9 +- .../main/webapp/WEB-INF/template/index.ftl | 28 +++-- .../src/main/webapp/static/js/index.js | 117 ++++++++++-------- 6 files changed, 109 insertions(+), 74 deletions(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 1de666ee..26f3e7f0 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1057,6 +1057,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 9、任务注解调整为 “@JobHandler”,与任务注解统一; - 10、执行器端口支持随机生成(小于等于0时),避免端口定义冲突; - 11、任务Cron长度扩展支持至128位; +- 12、调度报表优化,支持时间区间筛选; ### TODO LIST - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限; @@ -1075,11 +1076,10 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 14、脚本任务 Shell、Python和Nodejs,如何友好获取分片参数; - 15、Bean模式任务,JobHandler自动从执行器中查询展示为下拉框,选择后自动填充任务名称等属性; - 16、任务告警邮件优化,调整为表格形式; -- 17、任务报表,支持时间筛选; -- 18、JobHandler提供 init/destroy 方法,支持自定义任务线程销毁逻辑; -- 19、cron表达式的最大长度调整,兼容复杂类型cron; -- 20、执行器回调地址/日志地址格式兼容,是否已"/"结尾均支持; -- 21、任务单机多线程:提升任务单机并行处理能力; +- 17、JobHandler提供 init/destroy 方法,支持自定义任务线程销毁逻辑; +- 18、cron表达式的最大长度调整,兼容复杂类型cron; +- 19、执行器回调地址/日志地址格式兼容,是否已"/"结尾均支持; +- 20、任务单机多线程:提升任务单机并行处理能力; ## 七、其他 diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java index c63f9cf7..cc3c6120 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java @@ -6,8 +6,11 @@ import com.xxl.job.admin.core.util.PropertiesUtil; import com.xxl.job.admin.service.XxlJobService; import com.xxl.job.core.biz.model.ReturnT; import org.apache.commons.lang.StringUtils; +import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; @@ -15,6 +18,8 @@ import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.text.SimpleDateFormat; +import java.util.Date; import java.util.Map; /** @@ -38,8 +43,8 @@ public class IndexController { @RequestMapping("/triggerChartDate") @ResponseBody - public ReturnT> triggerChartDate() { - ReturnT> triggerChartDate = xxlJobService.triggerChartDate(); + public ReturnT> triggerChartDate(Date startDate, Date endDate) { + ReturnT> triggerChartDate = xxlJobService.triggerChartDate(startDate, endDate); return triggerChartDate; } @@ -91,5 +96,12 @@ public class IndexController { return "help"; } + + @InitBinder + public void initBinder(WebDataBinder binder) { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + dateFormat.setLenient(false); + binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true)); + } } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/service/XxlJobService.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/service/XxlJobService.java index 64f9f57b..7a0c1607 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/service/XxlJobService.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/service/XxlJobService.java @@ -4,6 +4,7 @@ package com.xxl.job.admin.service; import com.xxl.job.admin.core.model.XxlJobInfo; import com.xxl.job.core.biz.model.ReturnT; +import java.util.Date; import java.util.Map; /** @@ -29,6 +30,6 @@ public interface XxlJobService { public Map dashboardInfo(); - public ReturnT> triggerChartDate(); + public ReturnT> triggerChartDate(Date startDate, Date endDate); } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java index 65d53971..2eccb310 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java @@ -310,18 +310,15 @@ public class XxlJobServiceImpl implements XxlJobService { } @Override - public ReturnT> triggerChartDate() { - Date from = DateUtils.addDays(new Date(), -30); - Date to = new Date(); - + public ReturnT> triggerChartDate(Date startDate, Date endDate) { List triggerDayList = new ArrayList(); List triggerDayCountSucList = new ArrayList(); List triggerDayCountFailList = new ArrayList(); int triggerCountSucTotal = 0; int triggerCountFailTotal = 0; - List> triggerCountMapAll = xxlJobLogDao.triggerCountByDay(from, to, -1); - List> triggerCountMapSuc = xxlJobLogDao.triggerCountByDay(from, to, ReturnT.SUCCESS_CODE); + List> triggerCountMapAll = xxlJobLogDao.triggerCountByDay(startDate, endDate, -1); + List> triggerCountMapSuc = xxlJobLogDao.triggerCountByDay(startDate, endDate, ReturnT.SUCCESS_CODE); if (CollectionUtils.isNotEmpty(triggerCountMapAll)) { for (Map item: triggerCountMapAll) { String day = String.valueOf(item.get("triggerDay")); diff --git a/xxl-job-admin/src/main/webapp/WEB-INF/template/index.ftl b/xxl-job-admin/src/main/webapp/WEB-INF/template/index.ftl index 347d8977..bca912ec 100644 --- a/xxl-job-admin/src/main/webapp/WEB-INF/template/index.ftl +++ b/xxl-job-admin/src/main/webapp/WEB-INF/template/index.ftl @@ -4,6 +4,8 @@ 任务调度中心 <#import "/common/common.macro.ftl" as netCommon> <@netCommon.commonStyle /> + + sidebar-collapse ">
@@ -43,7 +45,7 @@
- 系统中配置的任务数量 + 调度中心运行的任务数量
@@ -82,7 +84,7 @@
- 心跳检测成功的执行器机器数量 + 调度中心注册发现的执行器机器数量 @@ -94,8 +96,20 @@
-

调度报表(一月之内)

+

调度报表

<#----> + + +
+ + <#----> +
+ +
@@ -113,7 +127,6 @@
-
@@ -123,10 +136,11 @@ <@netCommon.commonFooter />
<@netCommon.commonScript /> -<#-- ---> + + + +<#-- echarts --> - diff --git a/xxl-job-admin/src/main/webapp/static/js/index.js b/xxl-job-admin/src/main/webapp/static/js/index.js index fa5e578e..0eda6b69 100644 --- a/xxl-job-admin/src/main/webapp/static/js/index.js +++ b/xxl-job-admin/src/main/webapp/static/js/index.js @@ -5,29 +5,74 @@ $(function () { + // 过滤时间 + var _startDate = moment().subtract(1, 'months'); + var _endDate = moment(); + $('#filterTime').daterangepicker({ + autoApply:false, + singleDatePicker:false, + showDropdowns:false, // 是否显示年月选择条件 + timePicker: true, // 是否显示小时和分钟选择条件 + timePickerIncrement: 10, // 时间的增量,单位为分钟 + timePicker24Hour : true, + opens : 'left', //日期选择框的弹出位置 + ranges: { + //'最近1小时': [moment().subtract(1, 'hours'), moment()], + '今日': [moment().startOf('day'), moment().endOf('day')], + '昨日': [moment().subtract(1, 'days').startOf('day'), moment().subtract(1, 'days').endOf('day')], + '最近7日': [moment().subtract(7, 'days'), moment()], + '最近30日': [moment().subtract(1, 'months'), moment()], + '本月': [moment().startOf('month'), moment().endOf('month')], + '上个月': [moment().subtract(1, 'months').startOf('month'), moment().subtract(1, 'months').endOf('month')] + }, + locale : { + format: 'YYYY-MM-DD HH:mm:ss', + separator : ' - ', + customRangeLabel : '自定义', + applyLabel : '确定', + cancelLabel : '取消', + fromLabel : '起始时间', + toLabel : '结束时间', + daysOfWeek : [ '日', '一', '二', '三', '四', '五', '六' ], + monthNames : [ '一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月' ], + firstDay : 1 + }, + startDate:_startDate, + endDate: _endDate + }, function (start, end, label) { + freshChartDate(start, end); + }); + freshChartDate(_startDate, _endDate); + /** + * 刷新报表 * + * @param startDate + * @param endDate */ - $.ajax({ - type : 'POST', - url : base_url + '/triggerChartDate', - data : { }, - dataType : "json", - success : function(data){ - if (data.code == 200) { - lineChartInit(data) - pieChartInit(data); - } else { - layer.open({ - title: '系统提示', - content: (data.msg || '调度报表数据加载异常'), - icon: '2' - }); + function freshChartDate(startDate, endDate) { + $.ajax({ + type : 'POST', + url : base_url + '/triggerChartDate', + data : { + 'startDate':startDate.format('YYYY-MM-DD HH:mm:ss'), + 'endDate':endDate.format('YYYY-MM-DD HH:mm:ss') + }, + dataType : "json", + success : function(data){ + if (data.code == 200) { + lineChartInit(data) + pieChartInit(data); + } else { + layer.open({ + title: '系统提示', + content: (data.msg || '调度报表数据加载异常'), + icon: '2' + }); + } } - } - }); - - + }); + } /** * 折线图 @@ -151,38 +196,4 @@ $(function () { pieChart.setOption(option); } - // 过滤时间 - /*$('#filterTime').daterangepicker({ - autoApply:false, - singleDatePicker:false, - showDropdowns:false, // 是否显示年月选择条件 - timePicker: true, // 是否显示小时和分钟选择条件 - timePickerIncrement: 10, // 时间的增量,单位为分钟 - timePicker24Hour : true, - opens : 'left', //日期选择框的弹出位置 - ranges: { - '最近1小时': [moment().subtract(1, 'hours'), moment()], - '今日': [moment().startOf('day'), moment().endOf('day')], - '昨日': [moment().subtract(1, 'days').startOf('day'), moment().subtract(1, 'days').endOf('day')], - '最近7日': [moment().subtract(6, 'days'), moment()], - '最近30日': [moment().subtract(29, 'days'), moment()], - '本月': [moment().startOf('month'), moment().endOf('month')], - '上个月': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')] - }, - locale : { - format: 'YYYY-MM-DD HH:mm:ss', - separator : ' - ', - customRangeLabel : '自定义', - applyLabel : '确定', - cancelLabel : '取消', - fromLabel : '起始时间', - toLabel : '结束时间', - daysOfWeek : [ '日', '一', '二', '三', '四', '五', '六' ], - monthNames : [ '一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月' ], - firstDay : 1, - startDate: moment().startOf('day'), - endDate: moment().endOf('day') - } - });*/ - }); From 01f5ed22060665a37652ebc921bed9e01e219520 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Tue, 5 Dec 2017 00:42:07 +0800 Subject: [PATCH 50/93] =?UTF-8?q?=E8=B0=83=E5=BA=A6=E6=8A=A5=E8=A1=A8?= =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=8C=E6=94=AF=E6=8C=81=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E5=8C=BA=E9=97=B4=E7=AD=9B=E9=80=89=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xxl-job-admin/src/main/webapp/WEB-INF/template/index.ftl | 2 +- xxl-job-admin/src/main/webapp/static/js/index.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/xxl-job-admin/src/main/webapp/WEB-INF/template/index.ftl b/xxl-job-admin/src/main/webapp/WEB-INF/template/index.ftl index bca912ec..164fa753 100644 --- a/xxl-job-admin/src/main/webapp/WEB-INF/template/index.ftl +++ b/xxl-job-admin/src/main/webapp/WEB-INF/template/index.ftl @@ -84,7 +84,7 @@
- 调度中心注册发现的执行器机器数量 + 调度中心在线的执行器机器数量 diff --git a/xxl-job-admin/src/main/webapp/static/js/index.js b/xxl-job-admin/src/main/webapp/static/js/index.js index 0eda6b69..d20136d6 100644 --- a/xxl-job-admin/src/main/webapp/static/js/index.js +++ b/xxl-job-admin/src/main/webapp/static/js/index.js @@ -20,10 +20,10 @@ $(function () { //'最近1小时': [moment().subtract(1, 'hours'), moment()], '今日': [moment().startOf('day'), moment().endOf('day')], '昨日': [moment().subtract(1, 'days').startOf('day'), moment().subtract(1, 'days').endOf('day')], - '最近7日': [moment().subtract(7, 'days'), moment()], - '最近30日': [moment().subtract(1, 'months'), moment()], '本月': [moment().startOf('month'), moment().endOf('month')], - '上个月': [moment().subtract(1, 'months').startOf('month'), moment().subtract(1, 'months').endOf('month')] + '上个月': [moment().subtract(1, 'months').startOf('month'), moment().subtract(1, 'months').endOf('month')], + '最近1周': [moment().subtract(1, 'weeks'), moment()], + '最近1月': [moment().subtract(1, 'months'), moment()] }, locale : { format: 'YYYY-MM-DD HH:mm:ss', From 6675cb37eb61db3c16ffcb8103a76d650849c8e6 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Tue, 5 Dec 2017 00:45:52 +0800 Subject: [PATCH 51/93] =?UTF-8?q?=E8=B0=83=E5=BA=A6=E6=8A=A5=E8=A1=A8?= =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=8C=E6=94=AF=E6=8C=81=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E5=8C=BA=E9=97=B4=E7=AD=9B=E9=80=89=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xxl-job-admin/src/main/webapp/static/js/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xxl-job-admin/src/main/webapp/static/js/index.js b/xxl-job-admin/src/main/webapp/static/js/index.js index d20136d6..ff411c43 100644 --- a/xxl-job-admin/src/main/webapp/static/js/index.js +++ b/xxl-job-admin/src/main/webapp/static/js/index.js @@ -6,7 +6,7 @@ $(function () { // 过滤时间 - var _startDate = moment().subtract(1, 'months'); + var _startDate = moment().subtract(1, 'months'); // 默认,最近一月 var _endDate = moment(); $('#filterTime').daterangepicker({ autoApply:false, @@ -23,7 +23,7 @@ $(function () { '本月': [moment().startOf('month'), moment().endOf('month')], '上个月': [moment().subtract(1, 'months').startOf('month'), moment().subtract(1, 'months').endOf('month')], '最近1周': [moment().subtract(1, 'weeks'), moment()], - '最近1月': [moment().subtract(1, 'months'), moment()] + '最近1月': [_startDate, _endDate] }, locale : { format: 'YYYY-MM-DD HH:mm:ss', From a88ec50fc35b01891d69201d9e2c82cb2b6d5532 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Tue, 5 Dec 2017 16:40:59 +0800 Subject: [PATCH 52/93] =?UTF-8?q?=E6=9B=B4=E6=96=B0RM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 ++++++++++ doc/XXL-JOB官方文档.md | 3 +++ 2 files changed, 13 insertions(+) diff --git a/README.md b/README.md index 99f006f5..c7d33de2 100644 --- a/README.md +++ b/README.md @@ -135,6 +135,16 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 - 45、广州知识圈网络科技有限公司 - 46、国誉商业上海有限公司 - 47、海尔消费金融有限公司,嗨付、够花 (海尔) + - 48、广州巴图鲁信息科技有限公司 + - 49、深圳市鹏海运电子数据交换有限公司 + - 50、深圳市亚飞电子商务有限公司 + - 51、上海趣医网络有限公司 + - 52、聚金资本 + - 53、北京父母邦网络科技有限公司 + - 54、中山元赫软件科技有限公司 + - 55、中商惠民(北京)电子商务有限公司 + - 56、凯京集团 + - 57、华夏票联(北京)科技有限公司 - …… > 更多接入的公司,欢迎在 [登记地址](https://github.com/xuxueli/xxl-job/issues/1 ) 登记,登记仅仅为了产品推广。 diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 26f3e7f0..a05fe3f9 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -110,6 +110,9 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 - 52、聚金资本 - 53、北京父母邦网络科技有限公司 - 54、中山元赫软件科技有限公司 + - 55、中商惠民(北京)电子商务有限公司 + - 56、凯京集团 + - 57、华夏票联(北京)科技有限公司 - …… > 更多接入的公司,欢迎在 [登记地址](https://github.com/xuxueli/xxl-job/issues/1 ) 登记,登记仅仅为了产品推广。 From 6a9fa33df53fc5f577d1de8be7f32a48c12b8ed7 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Mon, 11 Dec 2017 19:27:25 +0800 Subject: [PATCH 53/93] =?UTF-8?q?=E6=9B=B4=E6=96=B0RM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ doc/XXL-JOB官方文档.md | 2 ++ 2 files changed, 4 insertions(+) diff --git a/README.md b/README.md index c7d33de2..bdc2a0a4 100644 --- a/README.md +++ b/README.md @@ -83,6 +83,8 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 于2017-05-13,在上海举办的 "[第62期开源中国源创会](https://www.oschina.net/event/2236961)" 的 "放码过来" 环节,我登台对XXL-JOB做了演讲,台下五百位在场观众反响热烈([图文回顾](https://www.oschina.net/question/2686220_2242120) )。 +于2017-12-11,XXL-JOB有幸参会《[InfoQ ArchSummit全球架构师峰会](http://bj2017.archsummit.com/)》,并被拍拍贷架构总监"杨波老师"在专题 "[微服务原理、基础架构和开源实践](http://bj2017.archsummit.com/training/2)" 中现场介绍。 + > 我司大众点评目前已接入XXL-JOB,内部别名《Ferrari》(Ferrari基于XXL-JOB的V1.1版本定制而成,新接入应用推荐升级最新版本)。** 据最新统计, 自2016-01-21接入至2017-07-07期间,该系统已调度约60万余次,表现优异。新接入应用推荐使用最新版本,因为经过数个大版本的更新,系统的任务模型、UI交互模型以及底层调度通讯模型都有了较大的优化和提升,核心功能更加稳定高效。 diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index a05fe3f9..bf0aa9e4 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -51,6 +51,8 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 于2017-05-13,在上海举办的 "[第62期开源中国源创会](https://www.oschina.net/event/2236961)" 的 "放码过来" 环节,我登台对XXL-JOB做了演讲,台下五百位在场观众反响热烈([图文回顾](https://www.oschina.net/question/2686220_2242120) )。 +于2017-12-11,XXL-JOB有幸参会《[InfoQ ArchSummit全球架构师峰会](http://bj2017.archsummit.com/)》,并被拍拍贷架构总监"杨波老师"在专题 "[微服务原理、基础架构和开源实践](http://bj2017.archsummit.com/training/2)" 中现场介绍。 + > 我司大众点评目前已接入XXL-JOB,内部别名《Ferrari》(Ferrari基于XXL-JOB的V1.1版本定制而成,新接入应用推荐升级最新版本)。 据最新统计, 自2016-01-21接入至2017-07-07期间,该系统已调度约60万余次,表现优异。新接入应用推荐使用最新版本,因为经过数个大版本的更新,系统的任务模型、UI交互模型以及底层调度通讯模型都有了较大的优化和提升,核心功能更加稳定高效。 From ae69abf76ec892fd3c281a3e60033fd0f892c578 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Mon, 11 Dec 2017 19:31:15 +0800 Subject: [PATCH 54/93] =?UTF-8?q?=E6=9B=B4=E6=96=B0RM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 ++- doc/XXL-JOB官方文档.md | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index bdc2a0a4..e5a6e331 100644 --- a/README.md +++ b/README.md @@ -86,7 +86,7 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 于2017-12-11,XXL-JOB有幸参会《[InfoQ ArchSummit全球架构师峰会](http://bj2017.archsummit.com/)》,并被拍拍贷架构总监"杨波老师"在专题 "[微服务原理、基础架构和开源实践](http://bj2017.archsummit.com/training/2)" 中现场介绍。 > 我司大众点评目前已接入XXL-JOB,内部别名《Ferrari》(Ferrari基于XXL-JOB的V1.1版本定制而成,新接入应用推荐升级最新版本)。** -据最新统计, 自2016-01-21接入至2017-07-07期间,该系统已调度约60万余次,表现优异。新接入应用推荐使用最新版本,因为经过数个大版本的更新,系统的任务模型、UI交互模型以及底层调度通讯模型都有了较大的优化和提升,核心功能更加稳定高效。 +据最新统计, 自2016-01-21接入至2017-12-01期间,该系统已调度约100万次,表现优异。新接入应用推荐使用最新版本,因为经过数个大版本的更新,系统的任务模型、UI交互模型以及底层调度通讯模型都有了较大的优化和提升,核心功能更加稳定高效。 至今,XXL-JOB已接入多家公司的线上产品线,接入场景如电商业务,O2O业务和大数据作业等,截止2016-07-19为止,XXL-JOB已接入的公司包括不限于: @@ -147,6 +147,7 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 - 55、中商惠民(北京)电子商务有限公司 - 56、凯京集团 - 57、华夏票联(北京)科技有限公司 + - 58、拍拍贷 - …… > 更多接入的公司,欢迎在 [登记地址](https://github.com/xuxueli/xxl-job/issues/1 ) 登记,登记仅仅为了产品推广。 diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index bf0aa9e4..a469e6bd 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -54,7 +54,7 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 于2017-12-11,XXL-JOB有幸参会《[InfoQ ArchSummit全球架构师峰会](http://bj2017.archsummit.com/)》,并被拍拍贷架构总监"杨波老师"在专题 "[微服务原理、基础架构和开源实践](http://bj2017.archsummit.com/training/2)" 中现场介绍。 > 我司大众点评目前已接入XXL-JOB,内部别名《Ferrari》(Ferrari基于XXL-JOB的V1.1版本定制而成,新接入应用推荐升级最新版本)。 -据最新统计, 自2016-01-21接入至2017-07-07期间,该系统已调度约60万余次,表现优异。新接入应用推荐使用最新版本,因为经过数个大版本的更新,系统的任务模型、UI交互模型以及底层调度通讯模型都有了较大的优化和提升,核心功能更加稳定高效。 +据最新统计, 自2016-01-21接入至2017-12-01期间,该系统已调度约100万次,表现优异。新接入应用推荐使用最新版本,因为经过数个大版本的更新,系统的任务模型、UI交互模型以及底层调度通讯模型都有了较大的优化和提升,核心功能更加稳定高效。 至今,XXL-JOB已接入多家公司的线上产品线,接入场景如电商业务,O2O业务和大数据作业等,截止2016-07-19为止,XXL-JOB已接入的公司包括不限于: @@ -115,6 +115,7 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 - 55、中商惠民(北京)电子商务有限公司 - 56、凯京集团 - 57、华夏票联(北京)科技有限公司 + - 58、拍拍贷 - …… > 更多接入的公司,欢迎在 [登记地址](https://github.com/xuxueli/xxl-job/issues/1 ) 登记,登记仅仅为了产品推广。 From d47658b9824cede0895e146a3908a938711d3bba Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Mon, 11 Dec 2017 19:33:10 +0800 Subject: [PATCH 55/93] =?UTF-8?q?=E6=9B=B4=E6=96=B0RM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index a469e6bd..1e4ca1f2 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1068,7 +1068,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 ### TODO LIST - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限; - 2、任务分片路由:分片采用一致性Hash算法计算出尽量稳定的分片顺序,即使注册机器存在波动也不会引起分批分片顺序大的波动;目前采用IP自然排序,可以满足需求,待定; -- 3、失败重试完整支持:任务流程分为触发和执行,目前仅支持触发失败的重试;后续支持任务执行失败的重试,通过任务返回值判断。 +- 3、任务单机多线程:提升任务单机并行处理能力; - 4、回调失败丢包问题:执行器回调失败写文件,重启或周期性回调重试;调度中心周期性请求并同步未回调的执行结果; - 5、任务依赖,流程图,子任务+会签任务,各节点日志; - 6、调度任务优先级; @@ -1083,9 +1083,8 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 15、Bean模式任务,JobHandler自动从执行器中查询展示为下拉框,选择后自动填充任务名称等属性; - 16、任务告警邮件优化,调整为表格形式; - 17、JobHandler提供 init/destroy 方法,支持自定义任务线程销毁逻辑; -- 18、cron表达式的最大长度调整,兼容复杂类型cron; -- 19、执行器回调地址/日志地址格式兼容,是否已"/"结尾均支持; -- 20、任务单机多线程:提升任务单机并行处理能力; +- 18、执行器回调地址/日志地址格式兼容,是否已"/"结尾均支持; +- 19、失败重试完整支持:任务流程分为触发和执行,目前仅支持触发失败的重试;后续支持任务执行失败的重试,通过任务返回值判断。 ## 七、其他 From 624e1e1c991184c7f04da7143ccf21af22a28039 Mon Sep 17 00:00:00 2001 From: thinking_fioa Date: Tue, 12 Dec 2017 19:33:47 +0800 Subject: [PATCH 56/93] port 38080 --- doc/db/tables_xxl_job.sql | 2 ++ xxl-job-admin/src/main/resources/xxl-job-admin.properties | 6 +++--- .../src/main/resources/xxl-job-executor.properties | 2 +- .../src/main/resources/xxl-job-executor.properties | 2 +- .../src/main/resources/application.properties | 2 +- 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/doc/db/tables_xxl_job.sql b/doc/db/tables_xxl_job.sql index 3441f147..87bb23be 100644 --- a/doc/db/tables_xxl_job.sql +++ b/doc/db/tables_xxl_job.sql @@ -1,3 +1,5 @@ +CREATE database if NOT EXISTS `xxl-job` default character set utf8 collate utf8_general_ci; +use `xxl-job`; CREATE TABLE XXL_JOB_QRTZ_JOB_DETAILS ( diff --git a/xxl-job-admin/src/main/resources/xxl-job-admin.properties b/xxl-job-admin/src/main/resources/xxl-job-admin.properties index 9c425aba..24da5768 100644 --- a/xxl-job-admin/src/main/resources/xxl-job-admin.properties +++ b/xxl-job-admin/src/main/resources/xxl-job-admin.properties @@ -2,13 +2,13 @@ xxl.job.db.driverClass=com.mysql.jdbc.Driver xxl.job.db.url=jdbc:mysql://localhost:3306/xxl-job?useUnicode=true&characterEncoding=UTF-8 xxl.job.db.user=root -xxl.job.db.password=root_pwd +xxl.job.db.password=123456 ### xxl-job email xxl.job.mail.host=smtp.163.com xxl.job.mail.port=25 -xxl.job.mail.username=ovono802302@163.com -xxl.job.mail.password=asdfzxcv +xxl.job.mail.username=thinking_fioa@163.com +xxl.job.mail.password=123456 xxl.job.mail.sendNick=《任务调度平台XXL-JOB》 ### xxl-job login diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/resources/xxl-job-executor.properties b/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/resources/xxl-job-executor.properties index 7b363dc7..0168f531 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/resources/xxl-job-executor.properties +++ b/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/resources/xxl-job-executor.properties @@ -1,5 +1,5 @@ ### xxl-job admin address list, such as "http://address" or "http://address01,http://address02" -xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin +xxl.job.admin.addresses=http://127.0.0.1:38080/xxl-job-admin ### xxl-job executor address xxl.job.executor.appname=xxl-job-executor-sample diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/xxl-job-executor.properties b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/xxl-job-executor.properties index ab71b92b..ea26b4b8 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/xxl-job-executor.properties +++ b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/xxl-job-executor.properties @@ -1,5 +1,5 @@ ### xxl-job admin address list, such as "http://address" or "http://address01,http://address02" -xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin +xxl.job.admin.addresses=http://127.0.0.1:38080/xxl-job-admin ### xxl-job executor address xxl.job.executor.appname=xxl-job-executor-sample 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 a12408ac..1e68333b 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 @@ -6,7 +6,7 @@ logging.config=classpath:logback.xml # xxl-job ### xxl-job admin address list, such as "http://address" or "http://address01,http://address02" -xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin +xxl.job.admin.addresses=http://127.0.0.1:38080/xxl-job-admin ### xxl-job executor address xxl.job.executor.appname=xxl-job-executor-sample From ca9dd365cc0df52c013b0df7b6b8f4f632d9cc45 Mon Sep 17 00:00:00 2001 From: thinking_fioa Date: Tue, 12 Dec 2017 20:56:53 +0800 Subject: [PATCH 57/93] port 38082 --- .../src/main/resources/xxl-job-executor.properties | 2 +- .../src/main/resources/xxl-job-executor.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/resources/xxl-job-executor.properties b/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/resources/xxl-job-executor.properties index 0168f531..d2bde99e 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/resources/xxl-job-executor.properties +++ b/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/resources/xxl-job-executor.properties @@ -1,5 +1,5 @@ ### xxl-job admin address list, such as "http://address" or "http://address01,http://address02" -xxl.job.admin.addresses=http://127.0.0.1:38080/xxl-job-admin +xxl.job.admin.addresses=http://127.0.0.1:38082/xxl-job-admin ### xxl-job executor address xxl.job.executor.appname=xxl-job-executor-sample diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/xxl-job-executor.properties b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/xxl-job-executor.properties index ea26b4b8..0304c9a7 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/xxl-job-executor.properties +++ b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/xxl-job-executor.properties @@ -1,5 +1,5 @@ ### xxl-job admin address list, such as "http://address" or "http://address01,http://address02" -xxl.job.admin.addresses=http://127.0.0.1:38080/xxl-job-admin +xxl.job.admin.addresses=http://127.0.0.1:38082/xxl-job-admin ### xxl-job executor address xxl.job.executor.appname=xxl-job-executor-sample From f1e0c174a7bfeab81b82a9f4fa3edd01f52385cb Mon Sep 17 00:00:00 2001 From: thinking_fioa Date: Tue, 12 Dec 2017 21:08:02 +0800 Subject: [PATCH 58/93] port 8080 --- xxl-job-admin/src/main/resources/xxl-job-admin.properties | 6 +++--- .../src/main/resources/xxl-job-executor.properties | 2 +- .../src/main/resources/xxl-job-executor.properties | 2 +- .../src/main/resources/application.properties | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/xxl-job-admin/src/main/resources/xxl-job-admin.properties b/xxl-job-admin/src/main/resources/xxl-job-admin.properties index 24da5768..9c425aba 100644 --- a/xxl-job-admin/src/main/resources/xxl-job-admin.properties +++ b/xxl-job-admin/src/main/resources/xxl-job-admin.properties @@ -2,13 +2,13 @@ xxl.job.db.driverClass=com.mysql.jdbc.Driver xxl.job.db.url=jdbc:mysql://localhost:3306/xxl-job?useUnicode=true&characterEncoding=UTF-8 xxl.job.db.user=root -xxl.job.db.password=123456 +xxl.job.db.password=root_pwd ### xxl-job email xxl.job.mail.host=smtp.163.com xxl.job.mail.port=25 -xxl.job.mail.username=thinking_fioa@163.com -xxl.job.mail.password=123456 +xxl.job.mail.username=ovono802302@163.com +xxl.job.mail.password=asdfzxcv xxl.job.mail.sendNick=《任务调度平台XXL-JOB》 ### xxl-job login diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/resources/xxl-job-executor.properties b/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/resources/xxl-job-executor.properties index 0168f531..7b363dc7 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/resources/xxl-job-executor.properties +++ b/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/resources/xxl-job-executor.properties @@ -1,5 +1,5 @@ ### xxl-job admin address list, such as "http://address" or "http://address01,http://address02" -xxl.job.admin.addresses=http://127.0.0.1:38080/xxl-job-admin +xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin ### xxl-job executor address xxl.job.executor.appname=xxl-job-executor-sample diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/xxl-job-executor.properties b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/xxl-job-executor.properties index ea26b4b8..ab71b92b 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/xxl-job-executor.properties +++ b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/xxl-job-executor.properties @@ -1,5 +1,5 @@ ### xxl-job admin address list, such as "http://address" or "http://address01,http://address02" -xxl.job.admin.addresses=http://127.0.0.1:38080/xxl-job-admin +xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin ### xxl-job executor address xxl.job.executor.appname=xxl-job-executor-sample 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 1e68333b..a12408ac 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 @@ -6,7 +6,7 @@ logging.config=classpath:logback.xml # xxl-job ### xxl-job admin address list, such as "http://address" or "http://address01,http://address02" -xxl.job.admin.addresses=http://127.0.0.1:38080/xxl-job-admin +xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin ### xxl-job executor address xxl.job.executor.appname=xxl-job-executor-sample From 7a31abc6c8e779ae3d6809d883222fdfc10edda9 Mon Sep 17 00:00:00 2001 From: thinking_fioa Date: Tue, 12 Dec 2017 21:15:42 +0800 Subject: [PATCH 59/93] remove conflicts --- xxl-job-admin/src/main/resources/xxl-job-admin.properties | 6 +++--- .../src/main/resources/xxl-job-executor.properties | 1 - .../src/main/resources/application.properties | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/xxl-job-admin/src/main/resources/xxl-job-admin.properties b/xxl-job-admin/src/main/resources/xxl-job-admin.properties index 9c425aba..24da5768 100644 --- a/xxl-job-admin/src/main/resources/xxl-job-admin.properties +++ b/xxl-job-admin/src/main/resources/xxl-job-admin.properties @@ -2,13 +2,13 @@ xxl.job.db.driverClass=com.mysql.jdbc.Driver xxl.job.db.url=jdbc:mysql://localhost:3306/xxl-job?useUnicode=true&characterEncoding=UTF-8 xxl.job.db.user=root -xxl.job.db.password=root_pwd +xxl.job.db.password=123456 ### xxl-job email xxl.job.mail.host=smtp.163.com xxl.job.mail.port=25 -xxl.job.mail.username=ovono802302@163.com -xxl.job.mail.password=asdfzxcv +xxl.job.mail.username=thinking_fioa@163.com +xxl.job.mail.password=123456 xxl.job.mail.sendNick=《任务调度平台XXL-JOB》 ### xxl-job login diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/xxl-job-executor.properties b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/xxl-job-executor.properties index c84e726e..0304c9a7 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/xxl-job-executor.properties +++ b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/xxl-job-executor.properties @@ -1,6 +1,5 @@ ### xxl-job admin address list, such as "http://address" or "http://address01,http://address02" xxl.job.admin.addresses=http://127.0.0.1:38082/xxl-job-admin -xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin ### xxl-job executor address xxl.job.executor.appname=xxl-job-executor-sample 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 a12408ac..aa838181 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 @@ -6,7 +6,7 @@ logging.config=classpath:logback.xml # xxl-job ### xxl-job admin address list, such as "http://address" or "http://address01,http://address02" -xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin +xxl.job.admin.addresses=http://127.0.0.1:38082/xxl-job-admin ### xxl-job executor address xxl.job.executor.appname=xxl-job-executor-sample From a12d02768d73e7b093c8cea6b0e36c16501c637b Mon Sep 17 00:00:00 2001 From: thinking_fioa Date: Tue, 12 Dec 2017 21:34:36 +0800 Subject: [PATCH 60/93] reback --- xxl-job-admin/src/main/resources/xxl-job-admin.properties | 4 ++-- .../src/main/resources/xxl-job-executor.properties | 2 +- .../src/main/resources/xxl-job-executor.properties | 2 +- .../src/main/resources/application.properties | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/xxl-job-admin/src/main/resources/xxl-job-admin.properties b/xxl-job-admin/src/main/resources/xxl-job-admin.properties index 24da5768..036b81ae 100644 --- a/xxl-job-admin/src/main/resources/xxl-job-admin.properties +++ b/xxl-job-admin/src/main/resources/xxl-job-admin.properties @@ -7,8 +7,8 @@ xxl.job.db.password=123456 ### xxl-job email xxl.job.mail.host=smtp.163.com xxl.job.mail.port=25 -xxl.job.mail.username=thinking_fioa@163.com -xxl.job.mail.password=123456 +xxl.job.mail.username=ovono802302@163.com +xxl.job.mail.password=asdfzxcv xxl.job.mail.sendNick=《任务调度平台XXL-JOB》 ### xxl-job login diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/resources/xxl-job-executor.properties b/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/resources/xxl-job-executor.properties index d2bde99e..7b363dc7 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/resources/xxl-job-executor.properties +++ b/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/resources/xxl-job-executor.properties @@ -1,5 +1,5 @@ ### xxl-job admin address list, such as "http://address" or "http://address01,http://address02" -xxl.job.admin.addresses=http://127.0.0.1:38082/xxl-job-admin +xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin ### xxl-job executor address xxl.job.executor.appname=xxl-job-executor-sample diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/xxl-job-executor.properties b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/xxl-job-executor.properties index 0304c9a7..ab71b92b 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/xxl-job-executor.properties +++ b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/xxl-job-executor.properties @@ -1,5 +1,5 @@ ### xxl-job admin address list, such as "http://address" or "http://address01,http://address02" -xxl.job.admin.addresses=http://127.0.0.1:38082/xxl-job-admin +xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin ### xxl-job executor address xxl.job.executor.appname=xxl-job-executor-sample 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 aa838181..a12408ac 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 @@ -6,7 +6,7 @@ logging.config=classpath:logback.xml # xxl-job ### xxl-job admin address list, such as "http://address" or "http://address01,http://address02" -xxl.job.admin.addresses=http://127.0.0.1:38082/xxl-job-admin +xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin ### xxl-job executor address xxl.job.executor.appname=xxl-job-executor-sample From d9af1883574525cc9a54c0adecb5f9b4fae3385a Mon Sep 17 00:00:00 2001 From: thinking_fioa Date: Tue, 12 Dec 2017 21:36:45 +0800 Subject: [PATCH 61/93] reback --- xxl-job-admin/src/main/resources/xxl-job-admin.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xxl-job-admin/src/main/resources/xxl-job-admin.properties b/xxl-job-admin/src/main/resources/xxl-job-admin.properties index 036b81ae..9c425aba 100644 --- a/xxl-job-admin/src/main/resources/xxl-job-admin.properties +++ b/xxl-job-admin/src/main/resources/xxl-job-admin.properties @@ -2,7 +2,7 @@ xxl.job.db.driverClass=com.mysql.jdbc.Driver xxl.job.db.url=jdbc:mysql://localhost:3306/xxl-job?useUnicode=true&characterEncoding=UTF-8 xxl.job.db.user=root -xxl.job.db.password=123456 +xxl.job.db.password=root_pwd ### xxl-job email xxl.job.mail.host=smtp.163.com From 9f77e62faaeb78c7e30aea8665ec19d253b911d6 Mon Sep 17 00:00:00 2001 From: listening <893979653@qq.com> Date: Thu, 14 Dec 2017 10:06:54 +0800 Subject: [PATCH 62/93] =?UTF-8?q?=E5=9C=A8=E4=B8=8D=E6=94=B9=E5=8F=98xxl-j?= =?UTF-8?q?ob=E6=BA=90=E7=A0=81=E7=9A=84=E6=83=85=E5=86=B5=E4=B8=8B?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0=E5=AF=B9xxl-job=E7=9A=84=E6=89=A9?= =?UTF-8?q?=E5=B1=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AbstractSpringMvcTest.java | 25 +++++++++ .../admin/controller/IndexControllerTest.java | 22 ++++++++ .../controller/JobInfoControllerTest.java | 52 +++++++++++++++++++ 3 files changed, 99 insertions(+) create mode 100644 xxl-job-admin/src/test/java/com/xxl/job/admin/controller/AbstractSpringMvcTest.java create mode 100644 xxl-job-admin/src/test/java/com/xxl/job/admin/controller/IndexControllerTest.java create mode 100644 xxl-job-admin/src/test/java/com/xxl/job/admin/controller/JobInfoControllerTest.java diff --git a/xxl-job-admin/src/test/java/com/xxl/job/admin/controller/AbstractSpringMvcTest.java b/xxl-job-admin/src/test/java/com/xxl/job/admin/controller/AbstractSpringMvcTest.java new file mode 100644 index 00000000..3aab69dd --- /dev/null +++ b/xxl-job-admin/src/test/java/com/xxl/job/admin/controller/AbstractSpringMvcTest.java @@ -0,0 +1,25 @@ +package com.xxl.job.admin.controller; + +import org.junit.Before; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +@WebAppConfiguration +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(locations = {"classpath*:spring/*.xml"}) +public class AbstractSpringMvcTest { + @Autowired + private WebApplicationContext applicationContext; + protected MockMvc mockMvc; + + @Before + public void setup() { + this.mockMvc = MockMvcBuilders.webAppContextSetup(this.applicationContext).build(); + } +} diff --git a/xxl-job-admin/src/test/java/com/xxl/job/admin/controller/IndexControllerTest.java b/xxl-job-admin/src/test/java/com/xxl/job/admin/controller/IndexControllerTest.java new file mode 100644 index 00000000..1eb76743 --- /dev/null +++ b/xxl-job-admin/src/test/java/com/xxl/job/admin/controller/IndexControllerTest.java @@ -0,0 +1,22 @@ +package com.xxl.job.admin.controller; + +import org.junit.Test; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MvcResult; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; + +public class IndexControllerTest extends AbstractSpringMvcTest { + + @Test + public void testLogin() throws Exception { + MvcResult ret = mockMvc.perform( + post("/login") + .contentType(MediaType.APPLICATION_FORM_URLENCODED) + .param("userName", "admin") + .param("password", "123456") + ).andReturn(); + + System.out.println(ret.getResponse().getContentAsString()); + } +} 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 new file mode 100644 index 00000000..33df92e9 --- /dev/null +++ b/xxl-job-admin/src/test/java/com/xxl/job/admin/controller/JobInfoControllerTest.java @@ -0,0 +1,52 @@ +package com.xxl.job.admin.controller; + +import com.xxl.job.admin.core.model.XxlJobInfo; +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Before; +import org.junit.Test; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MvcResult; + +import javax.servlet.http.Cookie; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; + +public class JobInfoControllerTest extends AbstractSpringMvcTest { + Cookie cookie; + + @Before + public void login() throws Exception { + MvcResult ret = mockMvc.perform( + post("/login") + .contentType(MediaType.APPLICATION_FORM_URLENCODED) + .param("userName", "admin") + .param("password", "123456") + ).andReturn(); + cookie = ret.getResponse().getCookie("LOGIN_IDENTITY"); + } + + @Test + public void testAdd() throws Exception { + XxlJobInfo jobInfo = new XxlJobInfo(); + jobInfo.setJobGroup(1); + jobInfo.setJobDesc("autoEnquiryStatisPerWeek"); + jobInfo.setExecutorRouteStrategy("FIRST"); + jobInfo.setJobCron("0 0 1 ? * MON"); + jobInfo.setGlueType("BEAN"); + jobInfo.setExecutorHandler("AutoEnquriy"); + jobInfo.setExecutorBlockStrategy("SERIAL_EXECUTION"); + jobInfo.setExecutorFailStrategy("FAIL_ALARM"); + jobInfo.setAuthor("listening"); + + ObjectMapper mapper = new ObjectMapper(); + String jobInfoStr = mapper.writeValueAsString(jobInfo); + MvcResult ret = mockMvc.perform( + post("/jobinfo/add") + .contentType(MediaType.APPLICATION_FORM_URLENCODED) + .content(jobInfoStr) + .cookie(cookie) + ).andReturn(); + + System.out.println(ret.getResponse().getContentAsString()); + } +} From b1e5ce948acc8922f8d3c9ad5b66c8e952d83940 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Tue, 19 Dec 2017 19:12:14 +0800 Subject: [PATCH 63/93] =?UTF-8?q?=E6=9B=B4=E6=96=B0RM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 1e4ca1f2..f65b33ba 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1085,6 +1085,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 17、JobHandler提供 init/destroy 方法,支持自定义任务线程销毁逻辑; - 18、执行器回调地址/日志地址格式兼容,是否已"/"结尾均支持; - 19、失败重试完整支持:任务流程分为触发和执行,目前仅支持触发失败的重试;后续支持任务执行失败的重试,通过任务返回值判断。 +- 20、Log组件异常栈打印支持; ## 七、其他 From 7f37a05997ae11aaad7518990facfaff0d988c28 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Tue, 19 Dec 2017 21:10:24 +0800 Subject: [PATCH 64/93] =?UTF-8?q?=E6=96=87=E6=A1=88=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java index 6482922f..a2808b46 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java @@ -195,7 +195,7 @@ public class XxlJobTrigger { ExecutorBiz executorBiz = XxlJobDynamicScheduler.getExecutorBiz(address); runResult = executorBiz.run(triggerParam); } catch (Exception e) { - logger.error(e.getMessage(), e); + logger.error(">>>>>>>>>>> xxl-job trigger error, please check if the executor[{}] is running.", address, e); runResult = new ReturnT(ReturnT.FAIL_CODE, ""+e ); } From f31f9f0c917796fc1b577565f660d9bf845f84d0 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Tue, 19 Dec 2017 21:20:12 +0800 Subject: [PATCH 65/93] =?UTF-8?q?=E6=96=87=E6=A1=88=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xxl/job/admin/core/trigger/XxlJobTrigger.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java index a2808b46..7caec5fa 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java @@ -11,6 +11,7 @@ import com.xxl.job.core.biz.ExecutorBiz; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.TriggerParam; import com.xxl.job.core.enums.ExecutorBlockStrategyEnum; +import com.xxl.job.core.util.IpUtil; import org.apache.commons.collections.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -66,11 +67,12 @@ public class XxlJobTrigger { ReturnT triggerResult = new ReturnT(null); StringBuffer triggerMsgSb = new StringBuffer(); - triggerMsgSb.append("注册方式:").append( (group.getAddressType() == 0)?"自动注册":"手动录入" ); + triggerMsgSb.append("调度机器:").append(IpUtil.getIp()); + triggerMsgSb.append("
执行器-注册方式:").append( (group.getAddressType() == 0)?"自动注册":"手动录入" ); + triggerMsgSb.append("
执行器-地址列表:").append(group.getRegistryList()); + triggerMsgSb.append("
路由策略:").append(executorRouteStrategyEnum.getTitle()).append("("+i+"/"+addressList.size()+")"); // update01 triggerMsgSb.append("
阻塞处理策略:").append(blockStrategy.getTitle()); triggerMsgSb.append("
失败处理策略:").append(failStrategy.getTitle()); - triggerMsgSb.append("
地址列表:").append(group.getRegistryList()); - triggerMsgSb.append("
路由策略:").append(executorRouteStrategyEnum.getTitle()).append("("+i+"/"+addressList.size()+")"); // update01 // 3、trigger-valid if (triggerResult.getCode()==ReturnT.SUCCESS_CODE && CollectionUtils.isEmpty(addressList)) { @@ -134,11 +136,12 @@ public class XxlJobTrigger { ReturnT triggerResult = new ReturnT(null); StringBuffer triggerMsgSb = new StringBuffer(); - triggerMsgSb.append("注册方式:").append( (group.getAddressType() == 0)?"自动注册":"手动录入" ); + triggerMsgSb.append("调度机器:").append(IpUtil.getIp()); + triggerMsgSb.append("
执行器-注册方式:").append( (group.getAddressType() == 0)?"自动注册":"手动录入" ); + triggerMsgSb.append("
执行器-地址列表:").append(group.getRegistryList()); + triggerMsgSb.append("
路由策略:").append(executorRouteStrategyEnum.getTitle()); triggerMsgSb.append("
阻塞处理策略:").append(blockStrategy.getTitle()); triggerMsgSb.append("
失败处理策略:").append(failStrategy.getTitle()); - triggerMsgSb.append("
地址列表:").append(group.getRegistryList()); - triggerMsgSb.append("
路由策略:").append(executorRouteStrategyEnum.getTitle()); // 3、trigger-valid if (triggerResult.getCode()==ReturnT.SUCCESS_CODE && CollectionUtils.isEmpty(addressList)) { From 5e39a9547812c310725b86e9cbe725648a7d502c Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Tue, 19 Dec 2017 21:26:30 +0800 Subject: [PATCH 66/93] =?UTF-8?q?Log=E7=BB=84=E4=BB=B6=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E8=BE=93=E5=87=BA=E5=BC=82=E5=B8=B8=E6=A0=88=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 3 ++- .../java/com/xxl/job/core/log/XxlJobLogger.java | 16 ++++++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index f65b33ba..717e2991 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1064,6 +1064,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 10、执行器端口支持随机生成(小于等于0时),避免端口定义冲突; - 11、任务Cron长度扩展支持至128位; - 12、调度报表优化,支持时间区间筛选; +- 13、Log组件支持输出异常栈信息; ### TODO LIST - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限; @@ -1085,7 +1086,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 17、JobHandler提供 init/destroy 方法,支持自定义任务线程销毁逻辑; - 18、执行器回调地址/日志地址格式兼容,是否已"/"结尾均支持; - 19、失败重试完整支持:任务流程分为触发和执行,目前仅支持触发失败的重试;后续支持任务执行失败的重试,通过任务返回值判断。 -- 20、Log组件异常栈打印支持; + ## 七、其他 diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobLogger.java b/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobLogger.java index f9b970ca..b5dabdfc 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobLogger.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobLogger.java @@ -3,6 +3,8 @@ package com.xxl.job.core.log; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.PrintWriter; +import java.io.StringWriter; import java.text.MessageFormat; import java.text.SimpleDateFormat; import java.util.Date; @@ -49,8 +51,6 @@ public class XxlJobLogger { /** * append log with pattern * - * @ - * * @param appendLogPattern like "aaa {0} bbb {1} ccc" * @param appendLogArguments like "111, true" */ @@ -59,4 +59,16 @@ public class XxlJobLogger { log(appendLog); } + /** + * append exception stack + * + * @param e + */ + public static void log(Throwable e) { + StringWriter stringWriter = new StringWriter(); + e.printStackTrace(new PrintWriter(stringWriter)); + String appendLog = stringWriter.toString(); + log(appendLog); + } + } From 451eb2b7b32bc309dd46408f9af4c35e79e2fc48 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Tue, 19 Dec 2017 21:43:48 +0800 Subject: [PATCH 67/93] =?UTF-8?q?Log=E7=BB=84=E4=BB=B6=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E8=BE=93=E5=87=BA=E5=BC=82=E5=B8=B8=E6=A0=88=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=EF=BC=8C=E5=BA=95=E5=B1=82=E5=AE=9E=E7=8E=B0=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 2 +- .../com/xxl/job/core/log/XxlJobLogger.java | 22 ++++++++++++++----- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 717e2991..dd9ee7f4 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1064,7 +1064,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 10、执行器端口支持随机生成(小于等于0时),避免端口定义冲突; - 11、任务Cron长度扩展支持至128位; - 12、调度报表优化,支持时间区间筛选; -- 13、Log组件支持输出异常栈信息; +- 13、Log组件支持输出异常栈信息,底层实现优化; ### TODO LIST - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限; diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobLogger.java b/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobLogger.java index b5dabdfc..32043ef2 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobLogger.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobLogger.java @@ -19,9 +19,10 @@ public class XxlJobLogger { /** * append log * + * @param callInfo * @param appendLog */ - public static void log(String appendLog) { + private static void logDetail(StackTraceElement callInfo, String appendLog) { // logFileName String logFileName = XxlJobFileAppender.contextHolder.get(); @@ -29,9 +30,9 @@ public class XxlJobLogger { return; } - // "yyyy-MM-dd HH:mm:ss [ClassName]-[MethodName]-[LineNumber]-[ThreadName] log"; + /*// "yyyy-MM-dd HH:mm:ss [ClassName]-[MethodName]-[LineNumber]-[ThreadName] log"; StackTraceElement[] stackTraceElements = new Throwable().getStackTrace(); - StackTraceElement callInfo = stackTraceElements[1]; + StackTraceElement callInfo = stackTraceElements[1];*/ StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append(xxlJobLoggerFormat.format(new Date())).append(" ") @@ -55,8 +56,14 @@ public class XxlJobLogger { * @param appendLogArguments like "111, true" */ public static void log(String appendLogPattern, Object ... appendLogArguments) { - String appendLog = MessageFormat.format(appendLogPattern, appendLogArguments); - log(appendLog); + + String appendLog = appendLogPattern; + if (appendLogArguments!=null && appendLogArguments.length>0) { + appendLog = MessageFormat.format(appendLogPattern, appendLogArguments); + } + + StackTraceElement callInfo = new Throwable().getStackTrace()[1]; + logDetail(callInfo, appendLog); } /** @@ -65,10 +72,13 @@ public class XxlJobLogger { * @param e */ public static void log(Throwable e) { + StringWriter stringWriter = new StringWriter(); e.printStackTrace(new PrintWriter(stringWriter)); String appendLog = stringWriter.toString(); - log(appendLog); + + StackTraceElement callInfo = new Throwable().getStackTrace()[1]; + logDetail(callInfo, appendLog); } } From f587f10e324e42d5e55d46f11f708ad5b750040f Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Wed, 20 Dec 2017 15:25:47 +0800 Subject: [PATCH 68/93] =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E9=87=8D=E8=AF=95?= =?UTF-8?q?=E5=AE=8C=E6=95=B4=E6=94=AF=E6=8C=81=EF=BC=9A=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E5=88=86=E4=B8=BA=E8=B0=83=E5=BA=A6=E5=92=8C?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=EF=BC=8C=E4=B9=8B=E5=89=8D=E4=BB=85=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E8=B0=83=E5=BA=A6=E5=A4=B1=E8=B4=A5=E7=9A=84=E9=87=8D?= =?UTF-8?q?=E8=AF=95=EF=BC=9B=E7=9B=AE=E5=89=8D=E6=94=AF=E6=8C=81=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E5=A4=B1=E8=B4=A5=E7=9A=84=E9=87=8D=E8=AF=95=EF=BC=8C?= =?UTF-8?q?=E9=80=9A=E8=BF=87=E4=BB=BB=E5=8A=A1=E8=BF=94=E5=9B=9E=E5=80=BC?= =?UTF-8?q?=E5=88=A4=E6=96=AD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 3 +- .../core/thread/JobFailMonitorHelper.java | 9 ++++-- .../job/admin/core/trigger/XxlJobTrigger.java | 2 +- .../job/admin/service/impl/AdminBizImpl.java | 32 +++++++++++++------ .../main/webapp/static/js/joblog.index.1.js | 23 +++++++++++-- .../com/xxl/job/core/handler/IJobHandler.java | 11 ++++++- .../core/handler/impl/ScriptJobHandler.java | 2 +- .../com/xxl/job/core/thread/JobThread.java | 2 +- .../jfinal/jobhandler/DemoJobHandler.java | 2 +- .../jfinal/jobhandler/ShardingJobHandler.java | 2 +- .../service/jobhandler/DemoJobHandler.java | 2 +- .../jobhandler/ShardingJobHandler.java | 2 +- .../service/jobhandler/DemoJobHandler.java | 2 +- .../jobhandler/ShardingJobHandler.java | 2 +- 14 files changed, 69 insertions(+), 27 deletions(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index dd9ee7f4..c12fc67c 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1065,6 +1065,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 11、任务Cron长度扩展支持至128位; - 12、调度报表优化,支持时间区间筛选; - 13、Log组件支持输出异常栈信息,底层实现优化; +- 14、失败重试完整支持:任务流程分为调度和执行,之前仅支持调度失败的重试;目前支持执行失败的重试,通过任务返回值判断。 ### TODO LIST - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限; @@ -1085,7 +1086,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 16、任务告警邮件优化,调整为表格形式; - 17、JobHandler提供 init/destroy 方法,支持自定义任务线程销毁逻辑; - 18、执行器回调地址/日志地址格式兼容,是否已"/"结尾均支持; -- 19、失败重试完整支持:任务流程分为触发和执行,目前仅支持触发失败的重试;后续支持任务执行失败的重试,通过任务返回值判断。 + diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java index a19c1781..ae0411aa 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java @@ -6,6 +6,7 @@ import com.xxl.job.admin.core.model.XxlJobLog; import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler; import com.xxl.job.admin.core.util.MailUtil; import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.handler.IJobHandler; import org.apache.commons.collections.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -51,13 +52,15 @@ public class JobFailMonitorHelper { if (log == null) { continue; } - if (ReturnT.SUCCESS_CODE == log.getTriggerCode() && log.getHandleCode() == 0) { + if (IJobHandler.SUCCESS.getCode() == log.getTriggerCode() && log.getHandleCode() == 0) { JobFailMonitorHelper.monitor(jobLogId); logger.info(">>>>>>>>>>> job monitor, job running, JobLogId:{}", jobLogId); - } else if (ReturnT.SUCCESS_CODE == log.getTriggerCode() && ReturnT.SUCCESS_CODE == log.getHandleCode()) { + } else if (IJobHandler.SUCCESS.getCode() == log.getHandleCode()) { // job success, pass logger.info(">>>>>>>>>>> job monitor, job success, JobLogId:{}", jobLogId); - } else if (ReturnT.FAIL_CODE == log.getTriggerCode() || ReturnT.FAIL_CODE == log.getHandleCode()) { + } else if (IJobHandler.FAIL.getCode() == log.getTriggerCode() + || IJobHandler.FAIL.getCode() == log.getHandleCode() + || IJobHandler.FAIL_RETRY.getCode() == log.getHandleCode() ) { // job fail, failAlarm(log); logger.info(">>>>>>>>>>> job monitor, job fail, JobLogId:{}", jobLogId); diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java index 7caec5fa..14f07bbd 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java @@ -171,7 +171,7 @@ public class XxlJobTrigger { // 4.3、trigger (fail retry) if (triggerResult.getCode()!=ReturnT.SUCCESS_CODE && failStrategy == ExecutorFailStrategyEnum.FAIL_RETRY) { triggerResult = executorRouteStrategyEnum.getRouter().routeRun(triggerParam, addressList); - triggerMsgSb.append("

>>>>>>>>>>>失败重试<<<<<<<<<<<
").append(triggerResult.getMsg()); + triggerMsgSb.append("

>>>>>>>>>>>调度失败重试<<<<<<<<<<<
").append(triggerResult.getMsg()); } } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java index 718b4554..ba75365c 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java @@ -13,6 +13,7 @@ import com.xxl.job.core.biz.AdminBiz; import com.xxl.job.core.biz.model.HandleCallbackParam; import com.xxl.job.core.biz.model.RegistryParam; import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.handler.IJobHandler; import org.apache.commons.lang.StringUtils; import org.quartz.SchedulerException; import org.slf4j.Logger; @@ -46,7 +47,7 @@ public class AdminBizImpl implements AdminBiz { for (HandleCallbackParam handleCallbackParam: callbackParamList) { ReturnT callbackResult = callback(handleCallbackParam); logger.info(">>>>>>>>> JobApiController.callback {}, handleCallbackParam={}, callbackResult={}", - (callbackResult.getCode()==ReturnT.SUCCESS_CODE?"success":"fail"), handleCallbackParam, callbackResult); + (callbackResult.getCode()==IJobHandler.SUCCESS.getCode()?"success":"fail"), handleCallbackParam, callbackResult); } return ReturnT.SUCCESS; @@ -58,28 +59,39 @@ public class AdminBizImpl implements AdminBiz { if (log == null) { return new ReturnT(ReturnT.FAIL_CODE, "log item not found."); } + if (log.getHandleCode() > 0) { + return new ReturnT(ReturnT.FAIL_CODE, "log repeate callback."); // avoid repeat callback, trigger child job etc + } - // trigger success, to trigger child job, and avoid repeat trigger child job - String childTriggerMsg = null; - if (ReturnT.SUCCESS_CODE==handleCallbackParam.getExecuteResult().getCode() && ReturnT.SUCCESS_CODE!=log.getHandleCode()) { + // trigger success, to trigger child job + String callbackMsg = null; + if (IJobHandler.SUCCESS.getCode() == handleCallbackParam.getExecuteResult().getCode()) { XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(log.getJobId()); if (xxlJobInfo!=null && StringUtils.isNotBlank(xxlJobInfo.getChildJobKey())) { - childTriggerMsg = "
"; + callbackMsg = "

>>>>>>>>>>>触发子任务<<<<<<<<<<<
"; + String[] childJobKeys = xxlJobInfo.getChildJobKey().split(","); for (int i = 0; i < childJobKeys.length; i++) { String[] jobKeyArr = childJobKeys[i].split("_"); if (jobKeyArr!=null && jobKeyArr.length==2) { ReturnT triggerChildResult = xxlJobService.triggerJob(Integer.valueOf(jobKeyArr[1])); + // add msg - childTriggerMsg += MessageFormat.format("
{0}/{1} 触发子任务{2}, 子任务Key: {3}, 子任务触发备注: {4}", - (i+1), childJobKeys.length, (triggerChildResult.getCode()==ReturnT.SUCCESS_CODE?"成功":"失败"), childJobKeys[i], triggerChildResult.getMsg()); + callbackMsg += MessageFormat.format("{0}/{1} [JobKey={2}], 触发{3}, 触发备注: {4}
", + (i+1), childJobKeys.length, childJobKeys[i], (triggerChildResult.getCode()==ReturnT.SUCCESS_CODE?"成功":"失败"), triggerChildResult.getMsg()); } else { - childTriggerMsg += MessageFormat.format("
{0}/{1} 触发子任务失败, 子任务Key格式错误, 子任务Key: {2}", + callbackMsg += MessageFormat.format(" {0}/{1} [JobKey={2}], 触发失败, 触发备注: JobKey格式错误
", (i+1), childJobKeys.length, childJobKeys[i]); } } } + } else if (IJobHandler.FAIL_RETRY.getCode() == handleCallbackParam.getExecuteResult().getCode()){ + ReturnT retryTriggerResult = xxlJobService.triggerJob(log.getJobId()); + callbackMsg = "

>>>>>>>>>>>执行失败重试<<<<<<<<<<<
"; + + callbackMsg += MessageFormat.format("触发{0}, 触发备注: {1}", + (retryTriggerResult.getCode()==ReturnT.SUCCESS_CODE?"成功":"失败"), retryTriggerResult.getMsg()); } // handle msg @@ -90,8 +102,8 @@ public class AdminBizImpl implements AdminBiz { if (handleCallbackParam.getExecuteResult().getMsg() != null) { handleMsg.append(handleCallbackParam.getExecuteResult().getMsg()); } - if (childTriggerMsg !=null) { - handleMsg.append("
子任务触发备注:").append(childTriggerMsg); + if (callbackMsg != null) { + handleMsg.append(callbackMsg); } // success, save log diff --git a/xxl-job-admin/src/main/webapp/static/js/joblog.index.1.js b/xxl-job-admin/src/main/webapp/static/js/joblog.index.1.js index ff33f400..e9fecf0b 100644 --- a/xxl-job-admin/src/main/webapp/static/js/joblog.index.1.js +++ b/xxl-job-admin/src/main/webapp/static/js/joblog.index.1.js @@ -146,9 +146,16 @@ $(function() { { "data": 'triggerCode', "render": function ( data, type, row ) { - return (data==200)?'成功':(data==500)?'失败':(data==0)?'':data; + var html = data; + if (data == 200) { + html = '成功'; + } else if (data == 500) { + html = '失败'; + } else if (data == 0) { + html = ''; + } + return html; } - }, { "data": 'triggerMsg', @@ -165,7 +172,17 @@ $(function() { { "data": 'handleCode', "render": function ( data, type, row ) { - return (data==200)?'成功':(data==500)?'失败':(data==0)?'':data; + var html = data; + if (data == 200) { + html = '成功'; + } else if (data == 500) { + html = '失败'; + } else if (data == 501) { + html = '失败重试'; + } else if (data == 0) { + html = ''; + } + return html; } }, { diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/handler/IJobHandler.java b/xxl-job-core/src/main/java/com/xxl/job/core/handler/IJobHandler.java index 246068ef..4be7a970 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/handler/IJobHandler.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/handler/IJobHandler.java @@ -3,11 +3,20 @@ package com.xxl.job.core.handler; import com.xxl.job.core.biz.model.ReturnT; /** - * remote job handler + * job handler + * * @author xuxueli 2015-12-19 19:06:38 */ public abstract class IJobHandler { + /** success */ + public static final ReturnT SUCCESS = new ReturnT(200, null); + /** fail */ + public static final ReturnT FAIL = new ReturnT(500, null); + /** fail retry */ + public static final ReturnT FAIL_RETRY = new ReturnT(501, null); + + /** * job handler * @param params diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java b/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java index 63fdc8cd..93ca86a4 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java @@ -54,7 +54,7 @@ public class ScriptJobHandler extends IJobHandler { // invoke XxlJobLogger.log("----------- script file:"+ scriptFileName +" -----------"); int exitValue = ScriptUtil.execToFile(cmd, scriptFileName, logFileName, params); - ReturnT result = (exitValue==0)?ReturnT.SUCCESS:new ReturnT(ReturnT.FAIL_CODE, "script exit value("+exitValue+") is failed"); + ReturnT result = (exitValue==0)?IJobHandler.SUCCESS:new ReturnT(IJobHandler.FAIL.getCode(), "script exit value("+exitValue+") is failed"); return result; } diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java b/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java index 6084ef4b..a777f647 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java @@ -120,7 +120,7 @@ public class JobThread extends Thread{ XxlJobLogger.log("
----------- xxl-job job execute start -----------
----------- Params:" + Arrays.toString(handlerParams)); executeResult = handler.execute(handlerParams); if (executeResult == null) { - executeResult = ReturnT.FAIL; + executeResult = IJobHandler.FAIL; } XxlJobLogger.log("
----------- xxl-job job execute end(finish) -----------
----------- ReturnT:" + executeResult); diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/java/com/xuxueli/executor/sample/jfinal/jobhandler/DemoJobHandler.java b/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/java/com/xuxueli/executor/sample/jfinal/jobhandler/DemoJobHandler.java index a33ff3c9..e3f88109 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/java/com/xuxueli/executor/sample/jfinal/jobhandler/DemoJobHandler.java +++ b/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/java/com/xuxueli/executor/sample/jfinal/jobhandler/DemoJobHandler.java @@ -27,7 +27,7 @@ public class DemoJobHandler extends IJobHandler { XxlJobLogger.log("beat at:" + i); TimeUnit.SECONDS.sleep(2); } - return ReturnT.SUCCESS; + return SUCCESS; } } diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/java/com/xuxueli/executor/sample/jfinal/jobhandler/ShardingJobHandler.java b/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/java/com/xuxueli/executor/sample/jfinal/jobhandler/ShardingJobHandler.java index 73bbc1df..f2e8a755 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/java/com/xuxueli/executor/sample/jfinal/jobhandler/ShardingJobHandler.java +++ b/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/java/com/xuxueli/executor/sample/jfinal/jobhandler/ShardingJobHandler.java @@ -29,7 +29,7 @@ public class ShardingJobHandler extends IJobHandler { } } - return ReturnT.SUCCESS; + return SUCCESS; } } diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java index b0fb6c01..7d414922 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java +++ b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java @@ -32,7 +32,7 @@ public class DemoJobHandler extends IJobHandler { XxlJobLogger.log("beat at:" + i); TimeUnit.SECONDS.sleep(2); } - return ReturnT.SUCCESS; + return SUCCESS; } } diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/java/com/xxl/job/executor/service/jobhandler/ShardingJobHandler.java b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/java/com/xxl/job/executor/service/jobhandler/ShardingJobHandler.java index 4c0b5c80..e7fd1eb6 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/java/com/xxl/job/executor/service/jobhandler/ShardingJobHandler.java +++ b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/java/com/xxl/job/executor/service/jobhandler/ShardingJobHandler.java @@ -33,7 +33,7 @@ public class ShardingJobHandler extends IJobHandler { } } - return ReturnT.SUCCESS; + return SUCCESS; } } diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java index 5a9bce0a..353fc5ff 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java +++ b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java @@ -32,7 +32,7 @@ public class DemoJobHandler extends IJobHandler { XxlJobLogger.log("beat at:" + i); TimeUnit.SECONDS.sleep(2); } - return ReturnT.SUCCESS; + return SUCCESS; } } diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/ShardingJobHandler.java b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/ShardingJobHandler.java index 80cf1177..4224f0a2 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/ShardingJobHandler.java +++ b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/ShardingJobHandler.java @@ -33,7 +33,7 @@ public class ShardingJobHandler extends IJobHandler { } } - return ReturnT.SUCCESS; + return SUCCESS; } } From 0d808d857d7733da8362a24f2bf422e5e380086b Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Wed, 20 Dec 2017 19:10:22 +0800 Subject: [PATCH 69/93] =?UTF-8?q?=E6=9B=B4=E6=96=B0RM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 46 ++++++++++++++-------------- doc/XXL-JOB官方文档.md | 61 ++++++++++++++++++++++---------------- 2 files changed, 60 insertions(+), 47 deletions(-) diff --git a/README.md b/README.md index e5a6e331..802d8ddb 100644 --- a/README.md +++ b/README.md @@ -47,29 +47,30 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 ## Features - 1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手; - 2、动态:支持动态修改任务状态、暂停/恢复任务,以及终止运行中任务,即时生效; -- 3、调度中心HA(中心式):调度采用中心式设计,“调度中心”基于集群Quartz实现,可保证调度中心HA; +- 3、调度中心HA(中心式):调度采用中心式设计,“调度中心”基于集群Quartz实现并支持集群部署,可保证调度中心HA; - 4、执行器HA(分布式):任务分布式执行,任务"执行器"支持集群部署,可保证任务执行HA; -- 5、任务Failover:执行器集群部署时,任务路由策略选择"故障转移"情况下调度失败时将会平滑切换执行器进行Failover; -- 6、一致性:“调度中心”通过DB锁保证集群分布式调度的一致性, 一次任务调度只会触发一次执行; -- 7、自定义任务参数:支持在线配置调度任务入参,即时生效; -- 8、调度线程池:调度系统多线程触发调度运行,确保调度精确执行,不被堵塞; -- 9、弹性扩容缩容:一旦有新执行器机器上线或者下线,下次调度时将会重新分配任务; -- 10、邮件报警:任务失败时支持邮件报警,支持配置多邮件地址群发报警邮件; -- 11、状态监控:支持实时监控任务进度; -- 12、Rolling执行日志:支持在线查看调度结果,并且支持以Rolling方式实时查看执行器输出的完整的执行日志; -- 13、GLUE:提供Web IDE,支持在线开发任务逻辑代码,动态发布,实时编译生效,省略部署上线的过程。支持30个版本的历史版本回溯。 -- 14、数据加密:调度中心和执行器之间的通讯进行数据加密,提升调度信息安全性; -- 15、任务依赖:支持配置子任务依赖,当父任务执行结束且执行成功后将会主动触发一次子任务的执行, 多个子任务用逗号分隔; -- 16、推送maven中央仓库: 将会把最新稳定版推送到maven中央仓库, 方便用户接入和使用; -- 17、任务注册: 执行器会周期性自动注册任务, 调度中心将会自动发现注册的任务并触发执行。同时,也支持手动录入执行器地址; -- 18、路由策略:执行器集群部署时提供丰富的路由策略,包括:第一个、最后一个、轮询、随机、一致性HASH、最不经常使用、最近最久未使用、故障转移、忙碌转移等; -- 19、运行报表:支持实时查看运行数据,如任务数量、调度次数、执行器数量等;以及调度报表,如调度日期分布图,调度成功分布图等; -- 20、脚本任务:支持以GLUE模式开发和运行脚本任务,包括Shell、Python等类型脚本; -- 21、阻塞处理策略:调度过于密集执行器来不及处理时的处理策略,策略包括:单机串行(默认)、丢弃后续调度、覆盖之前调度; -- 22、失败处理策略;调度失败时的处理策略,策略包括:失败告警(默认)、失败重试; -- 23、分片广播任务:执行器集群部署时,任务路由策略选择"分片广播"情况下,一次任务调度将会广播触发对应集群中所有执行器执行一次任务,同时传递分片参数;可根据分片参数开发分片任务; -- 24、动态分片:分片广播任务以执行器为维度进行分片,支持动态扩容执行器集群从而动态增加分片数量,协同进行业务处理;在进行大数据量业务操作时可显著提升任务处理能力和速度。 -- 25、事件触发:除了"Cron方式"和"任务依赖方式"触发任务执行之外,支持基于事件的触发任务方式。调度中心提供触发任务单次执行的API服务,可根据业务事件灵活触发。 +- 5、注册中心: 执行器会周期性自动注册任务, 调度中心将会自动发现注册的任务并触发执行。同时,也支持手动录入执行器地址; +- 6、弹性扩容缩容:一旦有新执行器机器上线或者下线,下次调度时将会重新分配任务; +- 7、路由策略:执行器集群部署时提供丰富的路由策略,包括:第一个、最后一个、轮询、随机、一致性HASH、最不经常使用、最近最久未使用、故障转移、忙碌转移等; +- 8、故障转移:任务路由策略选择"故障转移"情况下,如果执行器集群中某一台机器故障,将会自动Failover切换到一台正常的执行器发送调度请求。 +- 9、失败处理策略;调度失败时的处理策略,策略包括:失败告警(默认)、失败重试; +- 10、失败重试:调度中心调度失败且启用"失败重试"策略时,将会自动重试一次;执行器执行失败且回调失败重试状态时,也将会自动重试一次; +- 11、阻塞处理策略:调度过于密集执行器来不及处理时的处理策略,策略包括:单机串行(默认)、丢弃后续调度、覆盖之前调度; +- 12、分片广播任务:执行器集群部署时,任务路由策略选择"分片广播"情况下,一次任务调度将会广播触发集群中所有执行器执行一次任务,可根据分片参数开发分片任务; +- 13、动态分片:分片广播任务以执行器为维度进行分片,支持动态扩容执行器集群从而动态增加分片数量,协同进行业务处理;在进行大数据量业务操作时可显著提升任务处理能力和速度。 +- 14、事件触发:除了"Cron方式"和"任务依赖方式"触发任务执行之外,支持基于事件的触发任务方式。调度中心提供触发任务单次执行的API服务,可根据业务事件灵活触发。 +- 15、任务进度监控:支持实时监控任务进度; +- 16、Rolling实时日志:支持在线查看调度结果,并且支持以Rolling方式实时查看执行器输出的完整的执行日志; +- 17、GLUE:提供Web IDE,支持在线开发任务逻辑代码,动态发布,实时编译生效,省略部署上线的过程。支持30个版本的历史版本回溯。 +- 18、脚本任务:支持以GLUE模式开发和运行脚本任务,包括Shell、Python、NodeJS等类型脚本; +- 19、任务依赖:支持配置子任务依赖,当父任务执行结束且执行成功后将会主动触发一次子任务的执行, 多个子任务用逗号分隔; +- 20、一致性:“调度中心”通过DB锁保证集群分布式调度的一致性, 一次任务调度只会触发一次执行; +- 21、自定义任务参数:支持在线配置调度任务入参,即时生效; +- 22、调度线程池:调度系统多线程触发调度运行,确保调度精确执行,不被堵塞; +- 23、数据加密:调度中心和执行器之间的通讯进行数据加密,提升调度信息安全性; +- 24、邮件报警:任务失败时支持邮件报警,支持配置多邮件地址群发报警邮件; +- 25、推送maven中央仓库: 将会把最新稳定版推送到maven中央仓库, 方便用户接入和使用; +- 26、运行报表:支持实时查看运行数据,如任务数量、调度次数、执行器数量等;以及调度报表,如调度日期分布图,调度成功分布图等; ## Development @@ -148,6 +149,7 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 - 56、凯京集团 - 57、华夏票联(北京)科技有限公司 - 58、拍拍贷 + - 59、北京尚德机构在线教育有限公司 - …… > 更多接入的公司,欢迎在 [登记地址](https://github.com/xuxueli/xxl-job/issues/1 ) 登记,登记仅仅为了产品推广。 diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index c12fc67c..48fbdbc4 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -16,29 +16,30 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 ### 1.2 特性 - 1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手; - 2、动态:支持动态修改任务状态、暂停/恢复任务,以及终止运行中任务,即时生效; -- 3、调度中心HA(中心式):调度采用中心式设计,“调度中心”基于集群Quartz实现,可保证调度中心HA; +- 3、调度中心HA(中心式):调度采用中心式设计,“调度中心”基于集群Quartz实现并支持集群部署,可保证调度中心HA; - 4、执行器HA(分布式):任务分布式执行,任务"执行器"支持集群部署,可保证任务执行HA; -- 5、任务Failover:执行器集群部署时,任务路由策略选择"故障转移"情况下调度失败时将会平滑切换执行器进行Failover; -- 6、一致性:“调度中心”通过DB锁保证集群分布式调度的一致性, 一次任务调度只会触发一次执行; -- 7、自定义任务参数:支持在线配置调度任务入参,即时生效; -- 8、调度线程池:调度系统多线程触发调度运行,确保调度精确执行,不被堵塞; -- 9、弹性扩容缩容:一旦有新执行器机器上线或者下线,下次调度时将会重新分配任务; -- 10、邮件报警:任务失败时支持邮件报警,支持配置多邮件地址群发报警邮件; -- 11、状态监控:支持实时监控任务进度; -- 12、Rolling执行日志:支持在线查看调度结果,并且支持以Rolling方式实时查看执行器输出的完整的执行日志; -- 13、GLUE:提供Web IDE,支持在线开发任务逻辑代码,动态发布,实时编译生效,省略部署上线的过程。支持30个版本的历史版本回溯。 -- 14、数据加密:调度中心和执行器之间的通讯进行数据加密,提升调度信息安全性; -- 15、任务依赖:支持配置子任务依赖,当父任务执行结束且执行成功后将会主动触发一次子任务的执行, 多个子任务用逗号分隔; -- 16、推送maven中央仓库: 将会把最新稳定版推送到maven中央仓库, 方便用户接入和使用; -- 17、任务注册: 执行器会周期性自动注册任务, 调度中心将会自动发现注册的任务并触发执行。同时,也支持手动录入执行器地址; -- 18、路由策略:执行器集群部署时提供丰富的路由策略,包括:第一个、最后一个、轮询、随机、一致性HASH、最不经常使用、最近最久未使用、故障转移、忙碌转移等; -- 19、运行报表:支持实时查看运行数据,如任务数量、调度次数、执行器数量等;以及调度报表,如调度日期分布图,调度成功分布图等; -- 20、脚本任务:支持以GLUE模式开发和运行脚本任务,包括Shell、Python等类型脚本; -- 21、阻塞处理策略:调度过于密集执行器来不及处理时的处理策略,策略包括:单机串行(默认)、丢弃后续调度、覆盖之前调度; -- 22、失败处理策略;调度失败时的处理策略,策略包括:失败告警(默认)、失败重试; -- 23、分片广播任务:执行器集群部署时,任务路由策略选择"分片广播"情况下,一次任务调度将会广播触发集群中所有执行器执行一次任务,可根据分片参数开发分片任务; -- 24、动态分片:分片广播任务以执行器为维度进行分片,支持动态扩容执行器集群从而动态增加分片数量,协同进行业务处理;在进行大数据量业务操作时可显著提升任务处理能力和速度。 -- 25、事件触发:除了"Cron方式"和"任务依赖方式"触发任务执行之外,支持基于事件的触发任务方式。调度中心提供触发任务单次执行的API服务,可根据业务事件灵活触发。 +- 5、注册中心: 执行器会周期性自动注册任务, 调度中心将会自动发现注册的任务并触发执行。同时,也支持手动录入执行器地址; +- 6、弹性扩容缩容:一旦有新执行器机器上线或者下线,下次调度时将会重新分配任务; +- 7、路由策略:执行器集群部署时提供丰富的路由策略,包括:第一个、最后一个、轮询、随机、一致性HASH、最不经常使用、最近最久未使用、故障转移、忙碌转移等; +- 8、故障转移:任务路由策略选择"故障转移"情况下,如果执行器集群中某一台机器故障,将会自动Failover切换到一台正常的执行器发送调度请求。 +- 9、失败处理策略;调度失败时的处理策略,策略包括:失败告警(默认)、失败重试; +- 10、失败重试:调度中心调度失败且启用"失败重试"策略时,将会自动重试一次;执行器执行失败且回调失败重试状态时,也将会自动重试一次; +- 11、阻塞处理策略:调度过于密集执行器来不及处理时的处理策略,策略包括:单机串行(默认)、丢弃后续调度、覆盖之前调度; +- 12、分片广播任务:执行器集群部署时,任务路由策略选择"分片广播"情况下,一次任务调度将会广播触发集群中所有执行器执行一次任务,可根据分片参数开发分片任务; +- 13、动态分片:分片广播任务以执行器为维度进行分片,支持动态扩容执行器集群从而动态增加分片数量,协同进行业务处理;在进行大数据量业务操作时可显著提升任务处理能力和速度。 +- 14、事件触发:除了"Cron方式"和"任务依赖方式"触发任务执行之外,支持基于事件的触发任务方式。调度中心提供触发任务单次执行的API服务,可根据业务事件灵活触发。 +- 15、任务进度监控:支持实时监控任务进度; +- 16、Rolling实时日志:支持在线查看调度结果,并且支持以Rolling方式实时查看执行器输出的完整的执行日志; +- 17、GLUE:提供Web IDE,支持在线开发任务逻辑代码,动态发布,实时编译生效,省略部署上线的过程。支持30个版本的历史版本回溯。 +- 18、脚本任务:支持以GLUE模式开发和运行脚本任务,包括Shell、Python、NodeJS等类型脚本; +- 19、任务依赖:支持配置子任务依赖,当父任务执行结束且执行成功后将会主动触发一次子任务的执行, 多个子任务用逗号分隔; +- 20、一致性:“调度中心”通过DB锁保证集群分布式调度的一致性, 一次任务调度只会触发一次执行; +- 21、自定义任务参数:支持在线配置调度任务入参,即时生效; +- 22、调度线程池:调度系统多线程触发调度运行,确保调度精确执行,不被堵塞; +- 23、数据加密:调度中心和执行器之间的通讯进行数据加密,提升调度信息安全性; +- 24、邮件报警:任务失败时支持邮件报警,支持配置多邮件地址群发报警邮件; +- 25、推送maven中央仓库: 将会把最新稳定版推送到maven中央仓库, 方便用户接入和使用; +- 26、运行报表:支持实时查看运行数据,如任务数量、调度次数、执行器数量等;以及调度报表,如调度日期分布图,调度成功分布图等; ### 1.3 发展 于2015年中,我在github上创建XXL-JOB项目仓库并提交第一个commit,随之进行系统结构设计,UI选型,交互设计…… @@ -116,6 +117,7 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 - 56、凯京集团 - 57、华夏票联(北京)科技有限公司 - 58、拍拍贷 + - 59、北京尚德机构在线教育有限公司 - …… > 更多接入的公司,欢迎在 [登记地址](https://github.com/xuxueli/xxl-job/issues/1 ) 登记,登记仅仅为了产品推广。 @@ -374,8 +376,8 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 丢弃后续调度:调度请求进入单机执行器后,发现执行器存在运行的调度任务,本次请求将会被丢弃并标记为失败; 覆盖之前调度:调度请求进入单机执行器后,发现执行器存在运行的调度任务,将会终止运行中的调度任务并清空队列,然后运行本地调度任务; - 失败处理策略;调度失败时的处理策略; - 失败告警(默认):调度失败时,将会触发失败报警,如发送报警邮件; - 失败重试:调度失败时,将会主动进行一次失败重试调度,重试调度后仍然失败将会触发一失败告警。注意当任务以failover方式路由时,每次失败重试将会触发新一轮路由。 + 失败告警(默认):调度失败和执行失败时,都将会触发失败报警,默认会发送报警邮件; + 失败重试:调度失败时,除了进行失败告警之外,将会自动重试一次;注意在执行失败时不会重试,而是根据回调返回值判断是否重试; - 执行参数:任务执行所需的参数,多个参数时用逗号分隔,任务执行时将会把多个参数转换成数组传入; - 报警邮件:任务调度失败时邮件通知的邮箱地址,支持配置多邮箱地址,配置多个邮箱地址时用逗号分隔; - 负责人:任务的负责人; @@ -837,6 +839,15 @@ XXL-JOB会为每次调度请求生成一个单独的日志文件,需要通过 执行器API服务请求参考代码:com.xxl.executor.test.DemoJobHandlerTest +### 5.13 故障转移 & 失败重试 +一次完整任务流程包括"调度(调度中心) + 执行(执行器)"两个阶段。 + +- "故障转移"发生在调度阶段,在执行器集群部署时,如果某一台执行器发生故障,该策略支持自动进行Failover切换到一台正常的执行器机器并且完成调度请求流程。 +- "失败重试"发生在"调度 + 执行"两个阶段,如下: + - 调度中心调度失败时,任务失败处理策略选择"失败重试",将会自动重试一次; + - 执行器运行失败时,任务执行结果返回"失败重试"回调,将会自动重试一次; + + ## 六、版本更新日志 ### 6.1 版本 V1.1.x,新特性[2015-12-05] **【于V1.1.x版本,XXL-JOB正式应用于我司,内部定制别名为 “Ferrari”,新接入应用推荐使用最新版本】** @@ -1065,7 +1076,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 11、任务Cron长度扩展支持至128位; - 12、调度报表优化,支持时间区间筛选; - 13、Log组件支持输出异常栈信息,底层实现优化; -- 14、失败重试完整支持:任务流程分为调度和执行,之前仅支持调度失败的重试;目前支持执行失败的重试,通过任务返回值判断。 +- 14、失败重试:调度失败且启用"失败重试"策略时,将会自动重试一次;执行失败且回调失败重试状态时,也将会自动重试一次; ### TODO LIST - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限; From fc7a5026080a812abe5e0de23b06120f2fd0f5b2 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Wed, 20 Dec 2017 19:12:23 +0800 Subject: [PATCH 70/93] =?UTF-8?q?=E6=9B=B4=E6=96=B0RM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 48fbdbc4..1645e3d9 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -845,7 +845,7 @@ XXL-JOB会为每次调度请求生成一个单独的日志文件,需要通过 - "故障转移"发生在调度阶段,在执行器集群部署时,如果某一台执行器发生故障,该策略支持自动进行Failover切换到一台正常的执行器机器并且完成调度请求流程。 - "失败重试"发生在"调度 + 执行"两个阶段,如下: - 调度中心调度失败时,任务失败处理策略选择"失败重试",将会自动重试一次; - - 执行器运行失败时,任务执行结果返回"失败重试"回调,将会自动重试一次; + - 执行器运行失败时,任务执行结果返回"失败重试(IJobHandler.FAIL_RETRY)"回调,将会自动重试一次; ## 六、版本更新日志 @@ -1076,7 +1076,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 11、任务Cron长度扩展支持至128位; - 12、调度报表优化,支持时间区间筛选; - 13、Log组件支持输出异常栈信息,底层实现优化; -- 14、失败重试:调度失败且启用"失败重试"策略时,将会自动重试一次;执行失败且回调失败重试状态时,也将会自动重试一次; +- 14、失败重试:调度中心调度失败且启用"失败重试"策略时,将会自动重试一次;执行器执行失败且回调失败重试状态时,也将会自动重试一次; ### TODO LIST - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限; From 3c95ba5ae42dd4cf348a540c33d60a9276a055b0 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Wed, 20 Dec 2017 19:37:46 +0800 Subject: [PATCH 71/93] =?UTF-8?q?Log=E5=9C=B0=E5=9D=80=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E5=85=BC=E5=AE=B9=EF=BC=8C=E6=94=AF=E6=8C=81=E9=9D=9E"/"?= =?UTF-8?q?=E7=BB=93=E5=B0=BE=E8=B7=AF=E5=BE=84=E9=85=8D=E7=BD=AE=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 6 ++--- .../xxl/job/core/executor/XxlJobExecutor.java | 12 +++++----- .../core/handler/impl/ScriptJobHandler.java | 8 +++---- .../xxl/job/core/log/XxlJobFileAppender.java | 23 ++++++++++++++++++- .../com/xxl/job/core/util/ScriptUtil.java | 2 +- 5 files changed, 36 insertions(+), 15 deletions(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 1645e3d9..1222ee52 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1077,6 +1077,8 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 12、调度报表优化,支持时间区间筛选; - 13、Log组件支持输出异常栈信息,底层实现优化; - 14、失败重试:调度中心调度失败且启用"失败重试"策略时,将会自动重试一次;执行器执行失败且回调失败重试状态时,也将会自动重试一次; +- 15、Log地址格式兼容,支持非"/"结尾路径配置; + ### TODO LIST - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限; @@ -1096,9 +1098,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 15、Bean模式任务,JobHandler自动从执行器中查询展示为下拉框,选择后自动填充任务名称等属性; - 16、任务告警邮件优化,调整为表格形式; - 17、JobHandler提供 init/destroy 方法,支持自定义任务线程销毁逻辑; -- 18、执行器回调地址/日志地址格式兼容,是否已"/"结尾均支持; - - +- 18、执行器回调地址格式兼容,支持非"/"结尾路径配置; ## 七、其他 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 4ecb461c..f58853c1 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 @@ -72,14 +72,10 @@ public class XxlJobExecutor implements ApplicationContextAware { initAdminBizList(adminAddresses, accessToken); // init executor-jobHandlerRepository - if (applicationContext != null) { - initJobHandlerRepository(applicationContext); - } + initJobHandlerRepository(applicationContext); // init logpath - if (logPath!=null && logPath.trim().length()>0) { - XxlJobFileAppender.logPath = logPath; - } + XxlJobFileAppender.initLogPath(logPath); // init executor-server initExecutorServer(port, ip, appName, accessToken); @@ -145,6 +141,10 @@ public class XxlJobExecutor implements ApplicationContextAware { return jobHandlerRepository.get(name); } private static void initJobHandlerRepository(ApplicationContext applicationContext){ + if (applicationContext == null) { + return; + } + // init job handler action Map serviceBeanMap = applicationContext.getBeansWithAnnotation(JobHandler.class); diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java b/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java index 93ca86a4..70ebb7a8 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java @@ -36,20 +36,20 @@ public class ScriptJobHandler extends IJobHandler { String scriptFileName = null; if (GlueTypeEnum.GLUE_SHELL == glueType) { cmd = "bash"; - scriptFileName = XxlJobFileAppender.logPath.concat("gluesource/").concat(String.valueOf(jobId)).concat("_").concat(String.valueOf(glueUpdatetime)).concat(".sh"); + scriptFileName = XxlJobFileAppender.getLogPath().concat("gluesource/").concat(String.valueOf(jobId)).concat("_").concat(String.valueOf(glueUpdatetime)).concat(".sh"); } else if (GlueTypeEnum.GLUE_PYTHON == glueType) { cmd = "python"; - scriptFileName = XxlJobFileAppender.logPath.concat("gluesource/").concat(String.valueOf(jobId)).concat("_").concat(String.valueOf(glueUpdatetime)).concat(".py"); + scriptFileName = XxlJobFileAppender.getLogPath().concat("gluesource/").concat(String.valueOf(jobId)).concat("_").concat(String.valueOf(glueUpdatetime)).concat(".py"); } else if (GlueTypeEnum.GLUE_NODEJS == glueType) { cmd = "node"; - scriptFileName = XxlJobFileAppender.logPath.concat("gluesource/").concat(String.valueOf(jobId)).concat("_").concat(String.valueOf(glueUpdatetime)).concat(".js"); + scriptFileName = XxlJobFileAppender.getLogPath().concat("gluesource/").concat(String.valueOf(jobId)).concat("_").concat(String.valueOf(glueUpdatetime)).concat(".js"); } // make script file ScriptUtil.markScriptFile(scriptFileName, gluesource); // log file - String logFileName = XxlJobFileAppender.logPath.concat(XxlJobFileAppender.contextHolder.get()); + String logFileName = XxlJobFileAppender.getLogPath().concat(XxlJobFileAppender.contextHolder.get()); // invoke XxlJobLogger.log("----------- script file:"+ scriptFileName +" -----------"); diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobFileAppender.java b/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobFileAppender.java index 2ed2f7fa..cd6ffacf 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobFileAppender.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobFileAppender.java @@ -18,7 +18,28 @@ public class XxlJobFileAppender { // for JobThread (support log for child thread of job handler) //public static ThreadLocal contextHolder = new ThreadLocal(); public static final InheritableThreadLocal contextHolder = new InheritableThreadLocal(); - public static String logPath = "/data/applogs/xxl-job/jobhandler/"; + + + private static String logPath = "/data/applogs/xxl-job/jobhandler/"; + public static void initLogPath(String logPath){ + // init + if (logPath!=null && logPath.trim().length()>0) { + /*if (!logPath.endsWith("/")) { + logPath = logPath.concat("/"); + }*/ + XxlJobFileAppender.logPath = logPath; + } + // mk dir + File logPathDir = new File(XxlJobFileAppender.logPath); + if (!logPathDir.exists()) { + logPathDir.mkdirs(); + } + XxlJobFileAppender.logPath = logPathDir.getPath(); + } + public static String getLogPath() { + return logPath; + } + /** * log filename: yyyy-MM-dd/9999.log diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/util/ScriptUtil.java b/xxl-job-core/src/main/java/com/xxl/job/core/util/ScriptUtil.java index 95c199d2..dc335a63 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/util/ScriptUtil.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/util/ScriptUtil.java @@ -28,7 +28,7 @@ public class ScriptUtil { */ public static void markScriptFile(String scriptFileName, String content) throws IOException { // filePath/ - File filePathDir = new File(XxlJobFileAppender.logPath); + File filePathDir = new File(XxlJobFileAppender.getLogPath()); if (!filePathDir.exists()) { filePathDir.mkdirs(); } From bf8669841677497e2ff2463c1b47f6185baadf2a Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Wed, 20 Dec 2017 20:41:42 +0800 Subject: [PATCH 72/93] =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../job/core/biz/impl/ExecutorBizImpl.java | 2 +- .../com/xxl/job/core/glue/GlueTypeEnum.java | 33 ++++++++-- .../core/handler/impl/ScriptJobHandler.java | 25 ++++---- .../xxl/job/core/log/XxlJobFileAppender.java | 64 +++++++++---------- .../com/xxl/job/core/thread/JobThread.java | 2 +- .../com/xxl/job/core/util/ScriptUtil.java | 14 ---- .../resources/xxl-job-executor.properties | 2 +- .../resources/xxl-job-executor.properties | 2 +- .../src/main/resources/application.properties | 2 +- 9 files changed, 73 insertions(+), 73 deletions(-) diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/biz/impl/ExecutorBizImpl.java b/xxl-job-core/src/main/java/com/xxl/job/core/biz/impl/ExecutorBizImpl.java index 5fc3ea7e..13fa9440 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/biz/impl/ExecutorBizImpl.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/biz/impl/ExecutorBizImpl.java @@ -59,7 +59,7 @@ public class ExecutorBizImpl implements ExecutorBiz { @Override public ReturnT log(long logDateTim, int logId, int fromLineNum) { - // log filename: yyyy-MM-dd/9999.log + // log filename: logPath/yyyy-MM-dd/9999.log String logFileName = XxlJobFileAppender.makeLogFileName(new Date(logDateTim), logId); LogResult logResult = XxlJobFileAppender.readLog(logFileName, fromLineNum); diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/glue/GlueTypeEnum.java b/xxl-job-core/src/main/java/com/xxl/job/core/glue/GlueTypeEnum.java index 17ab97ae..c60ddf44 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/glue/GlueTypeEnum.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/glue/GlueTypeEnum.java @@ -5,20 +5,40 @@ package com.xxl.job.core.glue; */ public enum GlueTypeEnum { - BEAN("BEAN模式"), - GLUE_GROOVY("GLUE模式(Java)"), - GLUE_SHELL("GLUE模式(Shell)"), - GLUE_PYTHON("GLUE模式(Python)"), - GLUE_NODEJS("GLUE模式(Nodejs)"); + BEAN("BEAN模式", false, null, null), + GLUE_GROOVY("GLUE模式(Java)", false, null, null), + GLUE_SHELL("GLUE模式(Shell)", true, "bash", ".sh"), + GLUE_PYTHON("GLUE模式(Python)", true, "python", ".py"), + GLUE_NODEJS("GLUE模式(Nodejs)", true, "node", ".js"); private String desc; - private GlueTypeEnum(String desc) { + private boolean isScript; + private String cmd; + private String suffix; + + private GlueTypeEnum(String desc, boolean isScript, String cmd, String suffix) { this.desc = desc; + this.isScript = isScript; + this.cmd = cmd; + this.suffix = suffix; } + public String getDesc() { return desc; } + public boolean isScript() { + return isScript; + } + + public String getCmd() { + return cmd; + } + + public String getSuffix() { + return suffix; + } + public static GlueTypeEnum match(String name){ for (GlueTypeEnum item: GlueTypeEnum.values()) { if (item.name().equals(name)) { @@ -27,4 +47,5 @@ public enum GlueTypeEnum { } return null; } + } diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java b/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java index 70ebb7a8..2449440d 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java @@ -31,25 +31,24 @@ public class ScriptJobHandler extends IJobHandler { @Override public ReturnT execute(String... params) throws Exception { - // cmd + script-file-name - String cmd = "bash"; - String scriptFileName = null; - if (GlueTypeEnum.GLUE_SHELL == glueType) { - cmd = "bash"; - scriptFileName = XxlJobFileAppender.getLogPath().concat("gluesource/").concat(String.valueOf(jobId)).concat("_").concat(String.valueOf(glueUpdatetime)).concat(".sh"); - } else if (GlueTypeEnum.GLUE_PYTHON == glueType) { - cmd = "python"; - scriptFileName = XxlJobFileAppender.getLogPath().concat("gluesource/").concat(String.valueOf(jobId)).concat("_").concat(String.valueOf(glueUpdatetime)).concat(".py"); - } else if (GlueTypeEnum.GLUE_NODEJS == glueType) { - cmd = "node"; - scriptFileName = XxlJobFileAppender.getLogPath().concat("gluesource/").concat(String.valueOf(jobId)).concat("_").concat(String.valueOf(glueUpdatetime)).concat(".js"); + if (!glueType.isScript()) { + return new ReturnT(IJobHandler.FAIL.getCode(), "glueType["+ glueType +"] invalid."); } + // cmd + String cmd = glueType.getCmd(); + // make script file + String scriptFileName = XxlJobFileAppender.getLogPath() + .concat("/gluesource/") + .concat(String.valueOf(jobId)) + .concat("_") + .concat(String.valueOf(glueUpdatetime)) + .concat(glueType.getSuffix()); ScriptUtil.markScriptFile(scriptFileName, gluesource); // log file - String logFileName = XxlJobFileAppender.getLogPath().concat(XxlJobFileAppender.contextHolder.get()); + String logFileName = XxlJobFileAppender.contextHolder.get(); // invoke XxlJobLogger.log("----------- script file:"+ scriptFileName +" -----------"); diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobFileAppender.java b/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobFileAppender.java index cd6ffacf..60166e6b 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobFileAppender.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobFileAppender.java @@ -20,53 +20,47 @@ public class XxlJobFileAppender { public static final InheritableThreadLocal contextHolder = new InheritableThreadLocal(); - private static String logPath = "/data/applogs/xxl-job/jobhandler/"; + // log base path + private static String logBasePath = "/data/applogs/xxl-job/jobhandler"; public static void initLogPath(String logPath){ // init if (logPath!=null && logPath.trim().length()>0) { - /*if (!logPath.endsWith("/")) { - logPath = logPath.concat("/"); - }*/ - XxlJobFileAppender.logPath = logPath; + logBasePath = logPath; } - // mk dir - File logPathDir = new File(XxlJobFileAppender.logPath); + // mk base dir + File logPathDir = new File(logBasePath); if (!logPathDir.exists()) { logPathDir.mkdirs(); } - XxlJobFileAppender.logPath = logPathDir.getPath(); + logBasePath = logPathDir.getPath(); + + // mk glue dir + File glueBaseDir = new File(logPathDir, "gluesource"); + if (!glueBaseDir.exists()) { + glueBaseDir.mkdirs(); + } } public static String getLogPath() { - return logPath; + return logBasePath; } /** - * log filename: yyyy-MM-dd/9999.log + * log filename, like "logPath/yyyy-MM-dd/9999.log" * * @param triggerDate * @param logId * @return */ public static String makeLogFileName(Date triggerDate, int logId) { - - // filePath/ - File filePathDir = new File(logPath); - if (!filePathDir.exists()) { - filePathDir.mkdirs(); - } - - // filePath/yyyy-MM-dd/ + // filePath/yyyy-MM-dd/9999.log SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); // avoid concurrent problem, can not be static - - String nowFormat = sdf.format(new Date()); - File filePathDateDir = new File(filePathDir, nowFormat); - if (!filePathDateDir.exists()) { - filePathDateDir.mkdirs(); - } - - // filePath/yyyy-MM-dd/9999.log - String logFileName = sdf.format(triggerDate).concat("/").concat(String.valueOf(logId)).concat(".log"); + String logFileName = getLogPath() + .concat("/") + .concat(sdf.format(triggerDate)) + .concat("/") + .concat(String.valueOf(logId)) + .concat(".log"); return logFileName; } @@ -78,17 +72,11 @@ public class XxlJobFileAppender { */ public static void appendLog(String logFileName, String appendLog) { - // log - if (appendLog == null) { - appendLog = ""; - } - appendLog += "\r\n"; - // log file if (logFileName==null || logFileName.trim().length()==0) { return; } - File logFile = new File(logPath, logFileName); + File logFile = new File(logFileName); if (!logFile.exists()) { try { @@ -98,6 +86,12 @@ public class XxlJobFileAppender { return; } } + + // log + if (appendLog == null) { + appendLog = ""; + } + appendLog += "\r\n"; // append file content try { @@ -133,7 +127,7 @@ public class XxlJobFileAppender { if (logFileName==null || logFileName.trim().length()==0) { return new LogResult(fromLineNum, 0, "readLog fail, logFile not found", true); } - File logFile = new File(logPath, logFileName); + File logFile = new File(logFileName); if (!logFile.exists()) { return new LogResult(fromLineNum, 0, "readLog fail, logFile not exists", true); diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java b/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java index a777f647..cf1e985a 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java @@ -111,7 +111,7 @@ public class JobThread extends Thread{ ? (String[])(Arrays.asList(triggerParam.getExecutorParams().split(",")).toArray()) : null; - // log filename: yyyy-MM-dd/9999.log + // log filename, like "logPath/yyyy-MM-dd/9999.log" String logFileName = XxlJobFileAppender.makeLogFileName(new Date(triggerParam.getLogDateTim()), triggerParam.getLogId()); XxlJobFileAppender.contextHolder.set(logFileName); ShardingUtil.setShardingVo(new ShardingUtil.ShardingVO(triggerParam.getBroadcastIndex(), triggerParam.getBroadcastTotal())); diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/util/ScriptUtil.java b/xxl-job-core/src/main/java/com/xxl/job/core/util/ScriptUtil.java index dc335a63..fea47d44 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/util/ScriptUtil.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/util/ScriptUtil.java @@ -1,11 +1,9 @@ package com.xxl.job.core.util; -import com.xxl.job.core.log.XxlJobFileAppender; import org.apache.commons.exec.CommandLine; import org.apache.commons.exec.DefaultExecutor; import org.apache.commons.exec.PumpStreamHandler; -import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -27,18 +25,6 @@ public class ScriptUtil { * @throws IOException */ public static void markScriptFile(String scriptFileName, String content) throws IOException { - // filePath/ - File filePathDir = new File(XxlJobFileAppender.getLogPath()); - if (!filePathDir.exists()) { - filePathDir.mkdirs(); - } - - // filePath/gluesource/ - File filePathSourceDir = new File(filePathDir, "gluesource"); - if (!filePathSourceDir.exists()) { - filePathSourceDir.mkdirs(); - } - // make file, filePath/gluesource/666-123456789.py FileOutputStream fileOutputStream = null; try { diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/resources/xxl-job-executor.properties b/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/resources/xxl-job-executor.properties index 7b363dc7..19be360e 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/resources/xxl-job-executor.properties +++ b/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/resources/xxl-job-executor.properties @@ -7,7 +7,7 @@ xxl.job.executor.ip= xxl.job.executor.port=9997 ### xxl-job log path -xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler/ +xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler ### xxl-job, access token xxl.job.accessToken= \ No newline at end of file diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/xxl-job-executor.properties b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/xxl-job-executor.properties index ab71b92b..d8b57728 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/xxl-job-executor.properties +++ b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/xxl-job-executor.properties @@ -7,7 +7,7 @@ xxl.job.executor.ip= xxl.job.executor.port=9999 ### xxl-job log path -xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler/ +xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler ### xxl-job, access token xxl.job.accessToken= \ No newline at end of file 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 a12408ac..6c441571 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 @@ -14,7 +14,7 @@ xxl.job.executor.ip= xxl.job.executor.port=-1 ### xxl-job log path -xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler/ +xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler ### xxl-job, access token xxl.job.accessToken= From 2d55c381c603f4016bbac63d27ecb09927b06343 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Wed, 20 Dec 2017 20:49:34 +0800 Subject: [PATCH 73/93] =?UTF-8?q?JobHandler=E6=8F=90=E4=BE=9Binit/destroy?= =?UTF-8?q?=E6=96=B9=E6=B3=95=EF=BC=8C=E6=94=AF=E6=8C=81=E5=9C=A8JobHandle?= =?UTF-8?q?r=E5=88=9D=E5=A7=8B=E5=8C=96=E5=92=8C=E9=94=80=E6=AF=81?= =?UTF-8?q?=E6=97=B6=E8=BF=9B=E8=A1=8C=E9=99=84=E5=8A=A0=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 4 ++-- .../com/xxl/job/core/handler/IJobHandler.java | 23 +++++++++++++++++-- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 1222ee52..3c546e50 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1078,6 +1078,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 13、Log组件支持输出异常栈信息,底层实现优化; - 14、失败重试:调度中心调度失败且启用"失败重试"策略时,将会自动重试一次;执行器执行失败且回调失败重试状态时,也将会自动重试一次; - 15、Log地址格式兼容,支持非"/"结尾路径配置; +- 16、JobHandler提供init/destroy方法,支持在JobHandler初始化和销毁时进行附加操作; ### TODO LIST @@ -1097,8 +1098,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 14、脚本任务 Shell、Python和Nodejs,如何友好获取分片参数; - 15、Bean模式任务,JobHandler自动从执行器中查询展示为下拉框,选择后自动填充任务名称等属性; - 16、任务告警邮件优化,调整为表格形式; -- 17、JobHandler提供 init/destroy 方法,支持自定义任务线程销毁逻辑; -- 18、执行器回调地址格式兼容,支持非"/"结尾路径配置; +- 17、执行器回调地址格式兼容,支持非"/"结尾路径配置; ## 七、其他 diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/handler/IJobHandler.java b/xxl-job-core/src/main/java/com/xxl/job/core/handler/IJobHandler.java index 4be7a970..64b2f97b 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/handler/IJobHandler.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/handler/IJobHandler.java @@ -9,6 +9,7 @@ import com.xxl.job.core.biz.model.ReturnT; */ public abstract class IJobHandler { + /** success */ public static final ReturnT SUCCESS = new ReturnT(200, null); /** fail */ @@ -18,11 +19,29 @@ public abstract class IJobHandler { /** - * job handler + * execute handler + * * @param params * @return * @throws Exception */ public abstract ReturnT execute(String... params) throws Exception; - + + + /** + * init handler + */ + public void init() { + // TODO + } + + + /** + * destroy handler + */ + public void destroy() { + // TODO + } + + } From 2a94a142e38747dc9d9acd7b6f3f14c1e9014eab Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Wed, 20 Dec 2017 21:16:06 +0800 Subject: [PATCH 74/93] =?UTF-8?q?JobHandler=E6=8F=90=E4=BE=9Binit/destroy?= =?UTF-8?q?=E6=96=B9=E6=B3=95=EF=BC=8C=E6=94=AF=E6=8C=81=E5=9C=A8JobHandle?= =?UTF-8?q?r=E5=88=9D=E5=A7=8B=E5=8C=96=E5=92=8C=E9=94=80=E6=AF=81?= =?UTF-8?q?=E6=97=B6=E8=BF=9B=E8=A1=8C=E9=99=84=E5=8A=A0=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xxl/job/core/biz/impl/ExecutorBizImpl.java | 9 ++++----- .../java/com/xxl/job/core/log/XxlJobLogger.java | 15 +++++++-------- .../java/com/xxl/job/core/thread/JobThread.java | 15 +++++++++++++++ 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/biz/impl/ExecutorBizImpl.java b/xxl-job-core/src/main/java/com/xxl/job/core/biz/impl/ExecutorBizImpl.java index 13fa9440..885ae3f9 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/biz/impl/ExecutorBizImpl.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/biz/impl/ExecutorBizImpl.java @@ -74,7 +74,8 @@ public class ExecutorBizImpl implements ExecutorBiz { String removeOldReason = null; // valid:jobHandler + jobThread - if (GlueTypeEnum.BEAN==GlueTypeEnum.match(triggerParam.getGlueType())) { + GlueTypeEnum glueTypeEnum = GlueTypeEnum.match(triggerParam.getGlueType()); + if (GlueTypeEnum.BEAN == glueTypeEnum) { // new jobhandler IJobHandler newJobHandler = XxlJobExecutor.loadJobHandler(triggerParam.getExecutorHandler()); @@ -96,7 +97,7 @@ public class ExecutorBizImpl implements ExecutorBiz { } } - } else if (GlueTypeEnum.GLUE_GROOVY==GlueTypeEnum.match(triggerParam.getGlueType())) { + } else if (GlueTypeEnum.GLUE_GROOVY == glueTypeEnum) { // valid old jobThread if (jobThread != null && @@ -119,9 +120,7 @@ public class ExecutorBizImpl implements ExecutorBiz { return new ReturnT(ReturnT.FAIL_CODE, e.getMessage()); } } - } else if (GlueTypeEnum.GLUE_SHELL==GlueTypeEnum.match(triggerParam.getGlueType()) - || GlueTypeEnum.GLUE_PYTHON==GlueTypeEnum.match(triggerParam.getGlueType()) - || GlueTypeEnum.GLUE_NODEJS==GlueTypeEnum.match(triggerParam.getGlueType())) { + } else if (glueTypeEnum!=null && glueTypeEnum.isScript()) { // valid old jobThread if (jobThread != null && diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobLogger.java b/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobLogger.java index 32043ef2..1ea06e2d 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobLogger.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobLogger.java @@ -24,11 +24,6 @@ public class XxlJobLogger { */ private static void logDetail(StackTraceElement callInfo, String appendLog) { - // logFileName - String logFileName = XxlJobFileAppender.contextHolder.get(); - if (logFileName==null || logFileName.trim().length()==0) { - return; - } /*// "yyyy-MM-dd HH:mm:ss [ClassName]-[MethodName]-[LineNumber]-[ThreadName] log"; StackTraceElement[] stackTraceElements = new Throwable().getStackTrace(); @@ -44,9 +39,13 @@ public class XxlJobLogger { String formatAppendLog = stringBuffer.toString(); // appendlog - XxlJobFileAppender.appendLog(logFileName, formatAppendLog); - - logger.debug(">>>>>>>>>>> [{}]: {}", logFileName, formatAppendLog); + String logFileName = XxlJobFileAppender.contextHolder.get(); + if (logFileName==null || logFileName.trim().length()==0) { + logger.info(">>>>>>>>>>> [{}]: {}", logFileName, formatAppendLog); + } else { + XxlJobFileAppender.appendLog(logFileName, formatAppendLog); + logger.debug(">>>>>>>>>>> [{}]: {}", logFileName, formatAppendLog); + } } /** diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java b/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java index cf1e985a..22503eac 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java @@ -92,6 +92,14 @@ public class JobThread extends Thread{ @Override public void run() { + // init + try { + handler.init(); + } catch (Throwable e) { + logger.error(e.getMessage(), e); + } + + // execute while(!toStop){ running = false; idleTimes++; @@ -165,6 +173,13 @@ public class JobThread extends Thread{ } } + // destroy + try { + handler.destroy(); + } catch (Throwable e) { + logger.error(e.getMessage(), e); + } + logger.info(">>>>>>>>>>> xxl-job JobThread stoped, hashCode:{}", Thread.currentThread()); } } From 5a0acb5945a02a1bdcde9ccbf41b873cbd32c249 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Wed, 20 Dec 2017 21:28:46 +0800 Subject: [PATCH 75/93] =?UTF-8?q?=E6=9B=B4=E6=96=B0RM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/xxl/job/core/log/XxlJobLogger.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobLogger.java b/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobLogger.java index 1ea06e2d..248d9de0 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobLogger.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobLogger.java @@ -31,8 +31,7 @@ public class XxlJobLogger { StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append(xxlJobLoggerFormat.format(new Date())).append(" ") - .append("["+ callInfo.getClassName() +"]").append("-") - .append("["+ callInfo.getMethodName() +"]").append("-") + .append("["+ callInfo.getClassName() + "#" + callInfo.getMethodName() +"]").append("-") .append("["+ callInfo.getLineNumber() +"]").append("-") .append("["+ Thread.currentThread().getName() +"]").append(" ") .append(appendLog!=null?appendLog:""); @@ -40,11 +39,10 @@ public class XxlJobLogger { // appendlog String logFileName = XxlJobFileAppender.contextHolder.get(); - if (logFileName==null || logFileName.trim().length()==0) { - logger.info(">>>>>>>>>>> [{}]: {}", logFileName, formatAppendLog); - } else { + if (logFileName!=null && logFileName.trim().length()>0) { XxlJobFileAppender.appendLog(logFileName, formatAppendLog); - logger.debug(">>>>>>>>>>> [{}]: {}", logFileName, formatAppendLog); + } else { + logger.info(">>>>>>>>>>> {}", formatAppendLog); } } From ecd9a47fb8b05dfd11dfafea5d5462c0e5704872 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Thu, 21 Dec 2017 21:08:39 +0800 Subject: [PATCH 76/93] =?UTF-8?q?=E6=9B=B4=E6=96=B0RM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xxl/job/admin/core/util/MailUtil.java | 65 ------------------- 1 file changed, 65 deletions(-) diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/MailUtil.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/MailUtil.java index c37a9295..8c7733b5 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/MailUtil.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/MailUtil.java @@ -3,12 +3,10 @@ package com.xxl.job.admin.core.util; import org.apache.commons.lang.ArrayUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.JavaMailSenderImpl; import org.springframework.mail.javamail.MimeMessageHelper; import javax.mail.internet.MimeMessage; -import javax.mail.internet.MimeUtility; import java.io.File; import java.util.Properties; import java.util.concurrent.ExecutorService; @@ -33,70 +31,7 @@ public class MailUtil { password = PropertiesUtil.getString("xxl.job.mail.password"); sendNick = PropertiesUtil.getString("xxl.job.mail.sendNick"); } - - /** - - - - - - - - - true - true - - - - - */ - /** - * 发送邮件 (完整版)(结合Spring) - * - * //@param javaMailSender: 发送Bean - * //@param sendFrom : 发送人邮箱 - * //@param sendNick : 发送人昵称 - * @param toAddress : 收件人邮箱 - * @param mailSubject : 邮件主题 - * @param mailBody : 邮件正文 - * @param mailBodyIsHtml: 邮件正文格式,true:HTML格式;false:文本格式 - * @param attachments : 附件 - */ - @SuppressWarnings("null") - public static boolean sendMailSpring(String toAddress, String mailSubject, String mailBody, boolean mailBodyIsHtml,File[] attachments) { - JavaMailSender javaMailSender = null;//ResourceBundle.getInstance().getJavaMailSender(); - try { - MimeMessage mimeMessage = javaMailSender.createMimeMessage(); - MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, ArrayUtils.isNotEmpty(attachments), "UTF-8"); // 设置utf-8或GBK编码,否则邮件会有乱码;multipart,true表示文件上传 - - - helper.setFrom(username, sendNick); - helper.setTo(toAddress); - - // 设置收件人抄送的名片和地址(相当于群发了) - //helper.setCc(InternetAddress.parse(MimeUtility.encodeText("邮箱001") + " <@163.com>," + MimeUtility.encodeText("邮箱002") + " <@foxmail.com>")); - helper.setSubject(mailSubject); - helper.setText(mailBody, mailBodyIsHtml); - - // 添加附件 - if (ArrayUtils.isNotEmpty(attachments)) { - for (File file : attachments) { - helper.addAttachment(MimeUtility.encodeText(file.getName()), file); - } - } - - // 群发 - //MimeMessage[] mailMessages = { mimeMessage }; - - javaMailSender.send(mimeMessage); - return true; - } catch (Exception e) { - logger.error(e.getMessage(), e); - } - return false; - } - /** * 发送邮件 (完整版) (纯JavaMail) * From 2f2ed56348d49195220926ba12e6f9e0e87a7afd Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Fri, 22 Dec 2017 19:03:42 +0800 Subject: [PATCH 77/93] =?UTF-8?q?=E5=91=8A=E8=AD=A6=E9=82=AE=E4=BB=B6?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E4=BC=98=E5=8C=96=EF=BC=9B=E9=82=AE=E4=BB=B6?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E8=B0=83=E6=95=B4=E4=B8=BAcommons-email?= =?UTF-8?q?=E7=AE=80=E5=8C=96=E9=82=AE=E4=BB=B6=E6=93=8D=E4=BD=9C=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 1 + pom.xml | 1 + xxl-job-admin/pom.xml | 8 +- .../core/thread/JobFailMonitorHelper.java | 67 +++++++--- .../xxl/job/admin/core/util/JobKeyUtil.java | 23 ++++ .../com/xxl/job/admin/core/util/MailUtil.java | 118 +++++------------- .../com/xxl/job/dao/impl/MailUtilTest.java | 44 +++++++ 7 files changed, 155 insertions(+), 107 deletions(-) create mode 100644 xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JobKeyUtil.java create mode 100644 xxl-job-admin/src/test/java/com/xxl/job/dao/impl/MailUtilTest.java diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 3c546e50..8022ef56 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1079,6 +1079,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 14、失败重试:调度中心调度失败且启用"失败重试"策略时,将会自动重试一次;执行器执行失败且回调失败重试状态时,也将会自动重试一次; - 15、Log地址格式兼容,支持非"/"结尾路径配置; - 16、JobHandler提供init/destroy方法,支持在JobHandler初始化和销毁时进行附加操作; +- 17、告警邮件样式优化;邮件组件调整为commons-email简化邮件操作; ### TODO LIST diff --git a/pom.xml b/pom.xml index d2f31344..fa21c08e 100644 --- a/pom.xml +++ b/pom.xml @@ -34,6 +34,7 @@ 1.3 1.9.2 2.6 + 1.5 0.9.5.2 5.1.29 diff --git a/xxl-job-admin/pom.xml b/xxl-job-admin/pom.xml index b86c7ebf..18fe16d4 100644 --- a/xxl-job-admin/pom.xml +++ b/xxl-job-admin/pom.xml @@ -124,11 +124,11 @@ ${httpclient.version} - + - javax.mail - mail - ${mail.version} + org.apache.commons + commons-email + ${commons-email.version} diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java index ae0411aa..a4f617bf 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java @@ -4,6 +4,7 @@ import com.xxl.job.admin.core.model.XxlJobGroup; import com.xxl.job.admin.core.model.XxlJobInfo; import com.xxl.job.admin.core.model.XxlJobLog; import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler; +import com.xxl.job.admin.core.util.JobKeyUtil; import com.xxl.job.admin.core.util.MailUtil; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.handler.IJobHandler; @@ -28,6 +29,8 @@ public class JobFailMonitorHelper { return instance; } + // ---------------------- monitor ---------------------- + private LinkedBlockingQueue queue = new LinkedBlockingQueue(0xfff8); private Thread monitorThread; @@ -97,6 +100,46 @@ public class JobFailMonitorHelper { monitorThread.start(); } + public void toStop(){ + toStop = true; + // interrupt and wait + monitorThread.interrupt(); + try { + monitorThread.join(); + } catch (InterruptedException e) { + logger.error(e.getMessage(), e); + } + } + + // producer + public static void monitor(int jobLogId){ + getInstance().queue.offer(jobLogId); + } + + + // ---------------------- alarm ---------------------- + + // email alarm template + private static final String mailBodyTemplate = "
监控告警明细:" + + "\n" + + " " + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
执行器JobKey任务描述告警类型
{0}{1}{2}调度失败
"; + /** * fail alarm * @@ -110,10 +153,12 @@ public class JobFailMonitorHelper { Set emailSet = new HashSet(Arrays.asList(info.getAlarmEmail().split(","))); for (String email: emailSet) { - String title = "《调度监控报警》(任务调度中心XXL-JOB)"; XxlJobGroup group = XxlJobDynamicScheduler.xxlJobGroupDao.load(Integer.valueOf(info.getJobGroup())); - String content = MessageFormat.format("任务调度失败, 执行器名称:{0}, 任务描述:{1}.", group!=null?group.getTitle():"null", info.getJobDesc()); - MailUtil.sendMail(email, title, content, false, null); + + String title = "调度中心监控报警"; + String content = MessageFormat.format(mailBodyTemplate, group!=null?group.getTitle():"null", JobKeyUtil.formatJobKey(info), info.getJobDesc()); + + MailUtil.sendMail(email, title, content); } } @@ -121,20 +166,4 @@ public class JobFailMonitorHelper { } - public void toStop(){ - toStop = true; - // interrupt and wait - monitorThread.interrupt(); - try { - monitorThread.join(); - } catch (InterruptedException e) { - logger.error(e.getMessage(), e); - } - } - - // producer - public static void monitor(int jobLogId){ - getInstance().queue.offer(jobLogId); - } - } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JobKeyUtil.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JobKeyUtil.java new file mode 100644 index 00000000..05378c6f --- /dev/null +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JobKeyUtil.java @@ -0,0 +1,23 @@ +package com.xxl.job.admin.core.util; + +import com.xxl.job.admin.core.model.XxlJobInfo; + +/** + * job key util + * + * @author xuxueli 2017-12-22 18:48:45 + */ +public class JobKeyUtil { + + /** + * format job key + * + * @param xxlJobInfo + * @return + */ + public static String formatJobKey(XxlJobInfo xxlJobInfo){ + return String.valueOf(xxlJobInfo.getJobGroup()) + .concat("_").concat(String.valueOf(xxlJobInfo.getId())); + } + +} diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/MailUtil.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/MailUtil.java index 8c7733b5..e000b157 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/MailUtil.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/MailUtil.java @@ -1,19 +1,16 @@ package com.xxl.job.admin.core.util; -import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.mail.DefaultAuthenticator; +import org.apache.commons.mail.EmailException; +import org.apache.commons.mail.HtmlEmail; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.mail.javamail.JavaMailSenderImpl; -import org.springframework.mail.javamail.MimeMessageHelper; -import javax.mail.internet.MimeMessage; -import java.io.File; -import java.util.Properties; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; +import java.nio.charset.Charset; /** * 邮件发送.Util + * * @author xuxueli 2016-3-12 15:06:20 */ public class MailUtil { @@ -33,89 +30,42 @@ public class MailUtil { } /** - * 发送邮件 (完整版) (纯JavaMail) - * - * @param toAddress : 收件人邮箱 - * @param mailSubject : 邮件主题 - * @param mailBody : 邮件正文 - * @param mailBodyIsHtml: 邮件正文格式,true:HTML格式;false:文本格式 - * //@param inLineFile : 内嵌文件 - * @param attachments : 附件 + * + * @param toAddress 收件人邮箱 + * @param mailSubject 邮件主题 + * @param mailBody 邮件正文 + * @return */ - public static boolean sendMail (String toAddress, String mailSubject, String mailBody, - boolean mailBodyIsHtml, File[] attachments){ - try { - // 创建邮件发送类 JavaMailSender (用于发送多元化邮件,包括附件,图片,html 等) - JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); - mailSender.setHost(host); // 设置邮件服务主机 - mailSender.setUsername(username); // 发送者邮箱的用户名 - mailSender.setPassword(password); // 发送者邮箱的密码 - - // 配置文件,用于实例化java.mail.session - Properties pro = new Properties(); - pro.put("mail.transport.protocol", "smtp"); - pro.put("mail.smtp.auth", "true"); // 登录SMTP服务器,需要获得授权 (网易163邮箱新近注册的邮箱均不能授权,测试 sohu 的邮箱可以获得授权) - pro.put("mail.smtp.socketFactory.port", port); - pro.put("mail.smtp.socketFactory.fallback", "false"); - mailSender.setJavaMailProperties(pro); - - // 创建多元化邮件 (创建 mimeMessage 帮助类,用于封装信息至 mimeMessage) - MimeMessage mimeMessage = mailSender.createMimeMessage(); - MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, ArrayUtils.isNotEmpty(attachments), "UTF-8"); - - helper.setFrom(username, sendNick); - helper.setTo(toAddress); + public static boolean sendMail(String toAddress, String mailSubject, String mailBody){ - helper.setSubject(mailSubject); - helper.setText(mailBody, mailBodyIsHtml); - - // 设置收件人抄送的名片和地址(相当于群发) - //helper.setCc(InternetAddress.parse(MimeUtility.encodeText("邮箱001") + " <@163.com>," + MimeUtility.encodeText("邮箱002") + " <@foxmail.com>")); + try { + // Create the email message + HtmlEmail email = new HtmlEmail(); - // 内嵌文件,第1个参数为cid标识这个文件,第2个参数为资源 - //helper.addInline(MimeUtility.encodeText(inLineFile.getName()), inLineFile); - - // 添加附件 - /*if (ArrayUtils.isNotEmpty(attachments)) { - for (File file : attachments) { - helper.addAttachment(MimeUtility.encodeText(file.getName()), file); - } - }*/ + //email.setDebug(true); // 将会打印一些log + //email.setTLS(true); // 是否TLS校验,,某些邮箱需要TLS安全校验,同理有SSL校验 + //email.setSSL(true); - // 群发 - //MimeMessage[] mailMessages = { mimeMessage }; - - mailSender.send(mimeMessage); + email.setHostName(host); + email.setSmtpPort(Integer.valueOf(port)); + //email.setSslSmtpPort(port); + email.setAuthenticator(new DefaultAuthenticator(username, password)); + email.setCharset(Charset.defaultCharset().name()); + + email.setFrom(username, sendNick); + email.addTo(toAddress); + email.setSubject(mailSubject); + email.setMsg(mailBody); + + //email.attach(attachment); // add the attachment + + email.send(); // send the email return true; - } catch (Exception e) { + } catch (EmailException e) { logger.error(e.getMessage(), e); + } return false; } - - static int total = 0; - public static void main(String[] args) { - - ExecutorService exec = Executors.newCachedThreadPool(); - for (int i = 0; i < 1; i++) { - exec.execute(new Thread(new Runnable() { - @Override - public void run() { - while(total < 1){ - String mailBody = "

新书快递通知

你的新书快递申请已推送新书,请到空间" - + "中查看"; - - sendMail("931591021@qq.com", "测试邮件", mailBody, true, null); - System.out.println(total); - total++; - } - } - })); - } - } - + } diff --git a/xxl-job-admin/src/test/java/com/xxl/job/dao/impl/MailUtilTest.java b/xxl-job-admin/src/test/java/com/xxl/job/dao/impl/MailUtilTest.java new file mode 100644 index 00000000..daee21a0 --- /dev/null +++ b/xxl-job-admin/src/test/java/com/xxl/job/dao/impl/MailUtilTest.java @@ -0,0 +1,44 @@ +package com.xxl.job.dao.impl; + +import com.xxl.job.admin.core.util.MailUtil; +import org.junit.Test; + +import java.text.MessageFormat; + +/** + * email util test + * + * @author xuxueli 2017-12-22 17:16:23 + */ +public class MailUtilTest { + + @Test + public void registryTest() throws Exception { + + String mailBodyTemplate = "
监控告警明细:" + + "\n" + + " " + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
执行器JobKey任务描述告警类型
{0}{1}{2}调度失败
"; + + mailBodyTemplate = MessageFormat.format(mailBodyTemplate, "1_1", "分组A", "任务A1"); + + boolean ret = MailUtil.sendMail("931591021@qq.com", "调度中心监控报警" , mailBodyTemplate); + System.out.println(ret); + } + +} From 9325afea089e8b99ba9aeac4993f55f872df12ec Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Fri, 22 Dec 2017 19:59:07 +0800 Subject: [PATCH 78/93] =?UTF-8?q?=E4=BF=AE=E5=A4=8DLog=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E7=94=9F=E6=88=90=E5=BC=82=E5=B8=B8=E9=97=AE=E9=A2=98=EF=BC=9B?= =?UTF-8?q?=20=E6=96=B0=E5=A2=9EJobKey=E5=A4=84=E7=90=86=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xxl/job/admin/core/util/JobKeyUtil.java | 21 +++++++++++++++++++ .../job/admin/service/impl/AdminBizImpl.java | 7 ++++--- .../admin/service/impl/XxlJobServiceImpl.java | 13 ++++++------ .../xxl/job/core/log/XxlJobFileAppender.java | 13 ++++++++---- 4 files changed, 41 insertions(+), 13 deletions(-) diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JobKeyUtil.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JobKeyUtil.java index 05378c6f..28aa8561 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JobKeyUtil.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JobKeyUtil.java @@ -1,6 +1,7 @@ package com.xxl.job.admin.core.util; import com.xxl.job.admin.core.model.XxlJobInfo; +import org.apache.commons.lang.StringUtils; /** * job key util @@ -20,4 +21,24 @@ public class JobKeyUtil { .concat("_").concat(String.valueOf(xxlJobInfo.getId())); } + /** + * parse jobId from JobKey + * + * @param jobKey + * @return + */ + public static int parseJobId(String jobKey){ + if (jobKey!=null && jobKey.trim().length()>0) { + String[] jobKeyArr = jobKey.split("_"); + if (jobKeyArr.length == 2) { + String jobIdStr = jobKeyArr[1]; + if (StringUtils.isNotBlank(jobIdStr) && StringUtils.isNumeric(jobIdStr)) { + int jobId = Integer.valueOf(jobIdStr); + return jobId; + } + } + } + return -1; + } + } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java index ba75365c..7831ea6a 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java @@ -5,6 +5,7 @@ import com.xxl.job.admin.core.model.XxlJobInfo; import com.xxl.job.admin.core.model.XxlJobLog; import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler; import com.xxl.job.admin.core.trigger.XxlJobTrigger; +import com.xxl.job.admin.core.util.JobKeyUtil; import com.xxl.job.admin.dao.XxlJobInfoDao; import com.xxl.job.admin.dao.XxlJobLogDao; import com.xxl.job.admin.dao.XxlJobRegistryDao; @@ -72,9 +73,9 @@ public class AdminBizImpl implements AdminBiz { String[] childJobKeys = xxlJobInfo.getChildJobKey().split(","); for (int i = 0; i < childJobKeys.length; i++) { - String[] jobKeyArr = childJobKeys[i].split("_"); - if (jobKeyArr!=null && jobKeyArr.length==2) { - ReturnT triggerChildResult = xxlJobService.triggerJob(Integer.valueOf(jobKeyArr[1])); + int childJobId = JobKeyUtil.parseJobId(childJobKeys[i]); + if (childJobId > 0) { + ReturnT triggerChildResult = xxlJobService.triggerJob(childJobId); // add msg callbackMsg += MessageFormat.format("{0}/{1} [JobKey={2}], 触发{3}, 触发备注: {4}
", diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java index 2eccb310..c976bc42 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java @@ -5,6 +5,7 @@ import com.xxl.job.admin.core.model.XxlJobGroup; import com.xxl.job.admin.core.model.XxlJobInfo; import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum; import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler; +import com.xxl.job.admin.core.util.JobKeyUtil; import com.xxl.job.admin.dao.XxlJobGroupDao; import com.xxl.job.admin.dao.XxlJobInfoDao; import com.xxl.job.admin.dao.XxlJobLogDao; @@ -107,11 +108,11 @@ public class XxlJobServiceImpl implements XxlJobService { if (StringUtils.isNotBlank(jobInfo.getChildJobKey())) { String[] childJobKeys = jobInfo.getChildJobKey().split(","); for (String childJobKeyItem: childJobKeys) { - String[] childJobKeyArr = childJobKeyItem.split("_"); - if (childJobKeyArr.length!=2) { + int childJobId = JobKeyUtil.parseJobId(childJobKeyItem); + if (childJobId <= 0) { return new ReturnT(ReturnT.FAIL_CODE, MessageFormat.format("子任务Key({0})格式错误", childJobKeyItem)); } - XxlJobInfo childJobInfo = xxlJobInfoDao.loadById(Integer.valueOf(childJobKeyArr[1])); + XxlJobInfo childJobInfo = xxlJobInfoDao.loadById(childJobId); if (childJobInfo==null) { return new ReturnT(ReturnT.FAIL_CODE, MessageFormat.format("子任务Key({0})无效", childJobKeyItem)); } @@ -170,11 +171,11 @@ public class XxlJobServiceImpl implements XxlJobService { if (StringUtils.isNotBlank(jobInfo.getChildJobKey())) { String[] childJobKeys = jobInfo.getChildJobKey().split(","); for (String childJobKeyItem: childJobKeys) { - String[] childJobKeyArr = childJobKeyItem.split("_"); - if (childJobKeyArr.length!=2) { + int childJobId = JobKeyUtil.parseJobId(childJobKeyItem); + if (childJobId <= 0) { return new ReturnT(ReturnT.FAIL_CODE, MessageFormat.format("子任务Key({0})格式错误", childJobKeyItem)); } - XxlJobInfo childJobInfo = xxlJobInfoDao.loadById(Integer.valueOf(childJobKeyArr[1])); + XxlJobInfo childJobInfo = xxlJobInfoDao.loadById(childJobId); if (childJobInfo==null) { return new ReturnT(ReturnT.FAIL_CODE, MessageFormat.format("子任务Key({0})无效", childJobKeyItem)); } diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobFileAppender.java b/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobFileAppender.java index 60166e6b..0e9dcc23 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobFileAppender.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobFileAppender.java @@ -53,11 +53,16 @@ public class XxlJobFileAppender { * @return */ public static String makeLogFileName(Date triggerDate, int logId) { - // filePath/yyyy-MM-dd/9999.log + + // filePath/yyyy-MM-dd SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); // avoid concurrent problem, can not be static - String logFileName = getLogPath() - .concat("/") - .concat(sdf.format(triggerDate)) + File logFilePath = new File(getLogPath(), sdf.format(triggerDate)); + if (!logFilePath.exists()) { + logFilePath.mkdir(); + } + + // filePath/yyyy-MM-dd/9999.log + String logFileName = logFilePath.getPath() .concat("/") .concat(String.valueOf(logId)) .concat(".log"); From f9acbb4610efcc2c6dae6c15f5bef865dbf1bd48 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Fri, 22 Dec 2017 20:17:48 +0800 Subject: [PATCH 79/93] =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=EF=BC=8C=E5=B7=A6=E4=BE=A7=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=E5=90=88=E5=B9=B6=E6=97=B6=E6=A0=B7=E5=BC=8F=E9=94=99=E4=B9=B1?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 1 + .../src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 8022ef56..54aeb9a2 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1080,6 +1080,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 15、Log地址格式兼容,支持非"/"结尾路径配置; - 16、JobHandler提供init/destroy方法,支持在JobHandler初始化和销毁时进行附加操作; - 17、告警邮件样式优化;邮件组件调整为commons-email简化邮件操作; +- 18、任务列表界面,左侧菜单合并时样式错乱问题修复; ### TODO LIST diff --git a/xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl b/xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl index ab1e5e75..797d5909 100644 --- a/xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl +++ b/xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl @@ -63,7 +63,7 @@

调度列表

- +
From d025f7152749f3a54663206aa188561204de45c3 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Fri, 22 Dec 2017 20:54:54 +0800 Subject: [PATCH 80/93] =?UTF-8?q?=E6=89=A7=E8=A1=8C=E5=99=A8=E5=9C=B0?= =?UTF-8?q?=E5=9D=80=E9=95=BF=E5=BA=A6=E6=89=A9=E5=B1=95=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E8=87=B3512=E4=BD=8D=EF=BC=8C=E6=94=AF=E6=8C=81=E5=A4=A7?= =?UTF-8?q?=E8=A7=84=E6=A8=A1=E6=89=A7=E8=A1=8C=E5=99=A8=E9=9B=86=E7=BE=A4?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 3 ++- doc/db/tables_xxl_job.sql | 2 +- .../template/jobgroup/jobgroup.index.ftl | 19 ++++++++++++++++--- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 54aeb9a2..fff7c9c8 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1073,7 +1073,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 8、修改JobThread捕获Error错误不更新JobLog的问题; - 9、任务注解调整为 “@JobHandler”,与任务注解统一; - 10、执行器端口支持随机生成(小于等于0时),避免端口定义冲突; -- 11、任务Cron长度扩展支持至128位; +- 11、任务Cron长度扩展支持至128位,支持负责类型Cron设置; - 12、调度报表优化,支持时间区间筛选; - 13、Log组件支持输出异常栈信息,底层实现优化; - 14、失败重试:调度中心调度失败且启用"失败重试"策略时,将会自动重试一次;执行器执行失败且回调失败重试状态时,也将会自动重试一次; @@ -1081,6 +1081,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 16、JobHandler提供init/destroy方法,支持在JobHandler初始化和销毁时进行附加操作; - 17、告警邮件样式优化;邮件组件调整为commons-email简化邮件操作; - 18、任务列表界面,左侧菜单合并时样式错乱问题修复; +- 19、执行器地址长度扩展支持至512位,支持大规模执行器集群配置; ### TODO LIST diff --git a/doc/db/tables_xxl_job.sql b/doc/db/tables_xxl_job.sql index 3441f147..dcc2bee8 100644 --- a/doc/db/tables_xxl_job.sql +++ b/doc/db/tables_xxl_job.sql @@ -210,7 +210,7 @@ CREATE TABLE `XXL_JOB_QRTZ_TRIGGER_GROUP` ( `title` varchar(12) NOT NULL COMMENT '执行器名称', `order` tinyint(4) NOT NULL DEFAULT '0' COMMENT '排序', `address_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '执行器地址类型:0=自动注册、1=手动录入', - `address_list` varchar(200) DEFAULT NULL COMMENT '执行器地址列表,多地址逗号分隔', + `address_list` varchar(512) DEFAULT NULL COMMENT '执行器地址列表,多地址逗号分隔', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/xxl-job-admin/src/main/webapp/WEB-INF/template/jobgroup/jobgroup.index.ftl b/xxl-job-admin/src/main/webapp/WEB-INF/template/jobgroup/jobgroup.index.ftl index 5819d83f..7d286984 100644 --- a/xxl-job-admin/src/main/webapp/WEB-INF/template/jobgroup/jobgroup.index.ftl +++ b/xxl-job-admin/src/main/webapp/WEB-INF/template/jobgroup/jobgroup.index.ftl @@ -53,7 +53,20 @@ - + \n" + "
id${group.appName} ${group.title} <#if group.addressType==0>自动注册<#else>手动录入<#if group.registryList?exists><#list group.registryList as item>${item}
+ <#if group.registryList?exists> + <#list group.registryList as item> + + <#if item?length gt 35> + ${item?substring(0, 35)}... + <#else> + ${item} + + +
+ + +
"; - mailBodyTemplate = MessageFormat.format(mailBodyTemplate, "1_1", "分组A", "任务A1"); + mailBodyTemplate = MessageFormat.format(mailBodyTemplate, "执行器A", "1_1", "任务A1"); boolean ret = MailUtil.sendMail("931591021@qq.com", "调度中心监控报警" , mailBodyTemplate); System.out.println(ret); From 6042011dc797b3475c8d30c05a89f930bb241f97 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Sat, 23 Dec 2017 14:28:32 +0800 Subject: [PATCH 83/93] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E4=BE=9D=E8=B5=96?= =?UTF-8?q?=E5=8D=87=E7=BA=A7=EF=BC=8C=E5=A6=82spring=E3=80=81jackson?= =?UTF-8?q?=E7=AD=89=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 1 + pom.xml | 29 ++++---- xxl-job-admin/pom.xml | 70 +++++++++---------- .../job/admin/controller/IndexController.java | 2 +- .../admin/controller/JobGroupController.java | 2 +- .../admin/controller/JobLogController.java | 4 +- .../interceptor/CookieInterceptor.java | 2 +- .../xxl/job/admin/core/model/XxlJobGroup.java | 2 +- .../core/thread/JobFailMonitorHelper.java | 2 +- .../core/thread/JobRegistryMonitorHelper.java | 4 +- .../job/admin/core/trigger/XxlJobTrigger.java | 2 +- .../xxl/job/admin/core/util/JobKeyUtil.java | 2 +- .../job/admin/service/impl/AdminBizImpl.java | 2 +- .../admin/service/impl/XxlJobServiceImpl.java | 8 +-- .../spring/applicationcontext-base.xml | 4 +- .../applicationcontext-xxl-job-admin.xml | 4 +- .../resources/spring/springmvc-context.xml | 6 +- .../xxl/job/dao/impl/XxlJobLogDaoTest.java | 2 +- xxl-job-core/pom.xml | 8 +-- .../com/xxl/job/core/util/JacksonUtil.java | 11 ++- .../resources/applicationcontext-xxl-job.xml | 4 +- 21 files changed, 83 insertions(+), 88 deletions(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 35629cf9..f71b6982 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1082,6 +1082,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 17、告警邮件样式优化;邮件组件调整为commons-email简化邮件操作; - 18、任务列表界面,左侧菜单合并时样式错乱问题修复; - 19、执行器地址录入交互优化,地址长度扩展支持至512位,支持大规模执行器集群配置; +- 20、项目依赖升级,如spring、jackson等; ### TODO LIST diff --git a/pom.xml b/pom.xml index fa21c08e..9ff7185d 100644 --- a/pom.xml +++ b/pom.xml @@ -20,32 +20,31 @@ 3.0.1 2.2 - 3.2.18.RELEASE - 1.9.13 - 1.8.7 + 4.3.13.RELEASE + 2.9.3 + 1.8.13 1.7.25 - 2.3.20 - 4.11 + 2.3.23 + 4.12 9.2.22.v20170606 - 4.0.38 - 4.3.6 + 4.0.51 + 4.5.4 1.3 - 1.9.2 - 2.6 + 4.1 + 3.7 1.5 0.9.5.2 - 5.1.29 - 1.2.2 - 3.2.8 + 5.1.45 + 1.3.1 + 3.4.5 - 2.4.5 - 1.4.6 + 2.4.13 2.3.0 - 1.5.6.RELEASE + 1.5.9.RELEASE diff --git a/xxl-job-admin/pom.xml b/xxl-job-admin/pom.xml index 18fe16d4..2498c234 100644 --- a/xxl-job-admin/pom.xml +++ b/xxl-job-admin/pom.xml @@ -40,18 +40,22 @@ - org.codehaus.jackson - jackson-mapper-asl - ${jackson-mapper-asl.version} + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} - + - org.slf4j - slf4j-log4j12 - ${slf4j-api.version} + javax.servlet + javax.servlet-api + ${javax.servlet-api.version} + + + javax.servlet.jsp + jsp-api + ${jsp-api.version} - org.freemarker @@ -59,37 +63,37 @@ ${freemarker.version} - + - commons-beanutils - commons-beanutils - ${commons-beanutils.version} + org.slf4j + slf4j-log4j12 + ${slf4j-api.version} - + - commons-lang - commons-lang - ${commons-lang.version} + junit + junit + ${junit.version} + test - + - javax.servlet - javax.servlet-api - ${javax.servlet-api.version} + org.apache.commons + commons-collections4 + ${commons-collections4.version} + - javax.servlet.jsp - jsp-api - ${jsp-api.version} + org.apache.commons + commons-lang3 + ${commons-lang3.version} - - + - junit - junit - ${junit.version} - test + org.apache.commons + commons-email + ${commons-email.version} @@ -116,7 +120,6 @@ ${mybatis.version} - org.apache.httpcomponents @@ -124,13 +127,6 @@ ${httpclient.version} - - - org.apache.commons - commons-email - ${commons-email.version} - - org.quartz-scheduler diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java index cc3c6120..23055c2f 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java @@ -5,7 +5,7 @@ import com.xxl.job.admin.controller.interceptor.PermissionInterceptor; import com.xxl.job.admin.core.util.PropertiesUtil; import com.xxl.job.admin.service.XxlJobService; import com.xxl.job.core.biz.model.ReturnT; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; 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 496d34e7..6211f3c7 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 @@ -4,7 +4,7 @@ import com.xxl.job.admin.core.model.XxlJobGroup; import com.xxl.job.admin.dao.XxlJobGroupDao; import com.xxl.job.admin.dao.XxlJobInfoDao; import com.xxl.job.core.biz.model.ReturnT; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; 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 f3192737..a31536cf 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 @@ -11,8 +11,8 @@ import com.xxl.job.core.biz.ExecutorBiz; import com.xxl.job.core.biz.model.LogResult; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.rpc.netcom.NetComClientProxy; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.lang.time.DateUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.time.DateUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; 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 8072b458..66532810 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 @@ -6,7 +6,7 @@ import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang3.ArrayUtils; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobGroup.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobGroup.java index 85fb4a10..040c9226 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobGroup.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobGroup.java @@ -1,6 +1,6 @@ package com.xxl.job.admin.core.model; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; import java.util.Arrays; diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java index a4f617bf..2695569c 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java @@ -8,7 +8,7 @@ import com.xxl.job.admin.core.util.JobKeyUtil; import com.xxl.job.admin.core.util.MailUtil; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.handler.IJobHandler; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryMonitorHelper.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryMonitorHelper.java index 94f40a0e..647c02ed 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryMonitorHelper.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryMonitorHelper.java @@ -4,8 +4,8 @@ import com.xxl.job.admin.core.model.XxlJobGroup; import com.xxl.job.admin.core.model.XxlJobRegistry; import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler; import com.xxl.job.core.enums.RegistryConfig; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java index 14f07bbd..784fb5fa 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java @@ -12,7 +12,7 @@ import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.TriggerParam; import com.xxl.job.core.enums.ExecutorBlockStrategyEnum; import com.xxl.job.core.util.IpUtil; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JobKeyUtil.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JobKeyUtil.java index 28aa8561..7eaea1f4 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JobKeyUtil.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JobKeyUtil.java @@ -1,7 +1,7 @@ package com.xxl.job.admin.core.util; import com.xxl.job.admin.core.model.XxlJobInfo; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; /** * job key util diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java index 7831ea6a..6f989b80 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java @@ -15,7 +15,7 @@ import com.xxl.job.core.biz.model.HandleCallbackParam; import com.xxl.job.core.biz.model.RegistryParam; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.handler.IJobHandler; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.quartz.SchedulerException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java index c976bc42..820e8968 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java @@ -14,10 +14,10 @@ import com.xxl.job.admin.service.XxlJobService; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.enums.ExecutorBlockStrategyEnum; import com.xxl.job.core.glue.GlueTypeEnum; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.lang.time.DateUtils; -import org.apache.commons.lang.time.FastDateFormat; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.time.DateUtils; +import org.apache.commons.lang3.time.FastDateFormat; import org.quartz.CronExpression; import org.quartz.SchedulerException; import org.slf4j.Logger; diff --git a/xxl-job-admin/src/main/resources/spring/applicationcontext-base.xml b/xxl-job-admin/src/main/resources/spring/applicationcontext-base.xml index 0e34f959..af486d7d 100644 --- a/xxl-job-admin/src/main/resources/spring/applicationcontext-base.xml +++ b/xxl-job-admin/src/main/resources/spring/applicationcontext-base.xml @@ -3,9 +3,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd"> + http://www.springframework.org/schema/context/spring-context.xsd"> diff --git a/xxl-job-admin/src/main/resources/spring/applicationcontext-xxl-job-admin.xml b/xxl-job-admin/src/main/resources/spring/applicationcontext-xxl-job-admin.xml index 79da65b3..c603f5f6 100644 --- a/xxl-job-admin/src/main/resources/spring/applicationcontext-xxl-job-admin.xml +++ b/xxl-job-admin/src/main/resources/spring/applicationcontext-xxl-job-admin.xml @@ -3,9 +3,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx - http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> + http://www.springframework.org/schema/tx/spring-tx.xsd"> diff --git a/xxl-job-admin/src/main/resources/spring/springmvc-context.xml b/xxl-job-admin/src/main/resources/spring/springmvc-context.xml index b1f11c89..a6285b90 100644 --- a/xxl-job-admin/src/main/resources/spring/springmvc-context.xml +++ b/xxl-job-admin/src/main/resources/spring/springmvc-context.xml @@ -4,11 +4,11 @@ xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd + http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc - http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> + http://www.springframework.org/schema/mvc/spring-mvc.xsd"> diff --git a/xxl-job-admin/src/test/java/com/xxl/job/dao/impl/XxlJobLogDaoTest.java b/xxl-job-admin/src/test/java/com/xxl/job/dao/impl/XxlJobLogDaoTest.java index b8c56e23..eb659848 100644 --- a/xxl-job-admin/src/test/java/com/xxl/job/dao/impl/XxlJobLogDaoTest.java +++ b/xxl-job-admin/src/test/java/com/xxl/job/dao/impl/XxlJobLogDaoTest.java @@ -2,7 +2,7 @@ package com.xxl.job.dao.impl; import com.xxl.job.admin.core.model.XxlJobLog; import com.xxl.job.admin.dao.XxlJobLogDao; -import org.apache.commons.lang.time.DateUtils; +import org.apache.commons.lang3.time.DateUtils; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; diff --git a/xxl-job-core/pom.xml b/xxl-job-core/pom.xml index bcc684ae..a46a61b1 100644 --- a/xxl-job-core/pom.xml +++ b/xxl-job-core/pom.xml @@ -49,11 +49,11 @@ - org.codehaus.jackson - jackson-mapper-asl - ${jackson-mapper-asl.version} + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} - + org.apache.httpcomponents diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/util/JacksonUtil.java b/xxl-job-core/src/main/java/com/xxl/job/core/util/JacksonUtil.java index 086c0ce1..a679fb04 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/util/JacksonUtil.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/util/JacksonUtil.java @@ -1,11 +1,10 @@ package com.xxl.job.core.util; - -import org.codehaus.jackson.JsonGenerationException; -import org.codehaus.jackson.JsonParseException; -import org.codehaus.jackson.map.JsonMappingException; -import org.codehaus.jackson.map.ObjectMapper; -import org.codehaus.jackson.type.TypeReference; +import com.fasterxml.jackson.core.JsonGenerationException; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/applicationcontext-xxl-job.xml b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/applicationcontext-xxl-job.xml index 9a96a4d8..90eded93 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/applicationcontext-xxl-job.xml +++ b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/resources/applicationcontext-xxl-job.xml @@ -3,9 +3,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd"> + http://www.springframework.org/schema/context/spring-context.xsd"> From 14d9d6a78547e266d7367636aa52bd47f6bbafc4 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Sat, 23 Dec 2017 15:50:46 +0800 Subject: [PATCH 84/93] =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E2=80=9CIJobHandler.execute=E2=80=9D=E5=85=A5=E5=8F=82?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E2=80=9CString=20params=E2=80=9D=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=BC=BA=E5=85=A5=E5=8F=82=E9=80=9A=E7=94=A8=E6=80=A7?= =?UTF-8?q?=E3=80=82=20=E8=84=9A=E6=9C=AC=E4=BB=BB=E5=8A=A1Shell=E3=80=81P?= =?UTF-8?q?ython=E5=92=8CNodejs=E7=AD=89=E6=94=AF=E6=8C=81=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=88=86=E7=89=87=E5=8F=82=E6=95=B0=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 27 +++++++++++++------ doc/db/tables_xxl_job.sql | 4 +-- .../template/jobinfo/jobinfo.index.ftl | 6 ++--- .../com/xxl/job/core/handler/IJobHandler.java | 4 +-- .../job/core/handler/impl/GlueJobHandler.java | 4 +-- .../core/handler/impl/ScriptJobHandler.java | 12 +++++++-- .../com/xxl/job/core/thread/JobThread.java | 9 ++----- .../jfinal/jobhandler/DemoJobHandler.java | 2 +- .../jfinal/jobhandler/ShardingJobHandler.java | 2 +- .../service/jobhandler/DemoJobHandler.java | 2 +- .../jobhandler/ShardingJobHandler.java | 2 +- .../service/jobhandler/DemoJobHandler.java | 2 +- .../jobhandler/ShardingJobHandler.java | 2 +- 13 files changed, 46 insertions(+), 32 deletions(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index f71b6982..1acbe454 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -791,11 +791,21 @@ XXL-JOB会为每次调度请求生成一个单独的日志文件,需要通过 "分片广播" 以执行器为维度进行分片,支持动态扩容执行器集群从而动态增加分片数量,协同进行业务处理;在进行大数据量业务操作时可显著提升任务处理能力和速度。 -"分片广播" 和普通任务开发流程一致,不同之处在于可以可以获取分片参数,获取分片参数对象的代码如下(可参考Sample示例执行器中的示例任务"ShardingJobHandler" ): +"分片广播" 和普通任务开发流程一致,不同之处在于可以可以获取分片参数,获取分片参数进行分片业务处理。 - ShardingUtil.ShardingVO shardingVO = ShardingUtil.getShardingVo(); +- Java语言任务获取分片参数方式:BEAN、GLUE模式(Java) +``` +// 可参考Sample示例执行器中的示例任务"ShardingJobHandler"了解试用 +ShardingUtil.ShardingVO shardingVO = ShardingUtil.getShardingVo(); +``` +- 脚本语言任务获取分片参数方式:GLUE模式(Shell)、GLUE模式(Python)、GLUE模式(Nodejs) +``` +// 脚本任务入参固定为三个,依次为:任务传参、分片序号、分片总数。以Shell模式任务为例,获取分片参数代码如下 +echo "分片序号 index = $2" +echo "分片总数 total = $3" +``` -该分片参数对象拥有两个属性: +分片参数属性说明: index:当前分片序号(从0开始),执行器集群列表中当前执行器的序号; total:总分片数,执行器集群的总机器数量; @@ -1083,7 +1093,8 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 18、任务列表界面,左侧菜单合并时样式错乱问题修复; - 19、执行器地址录入交互优化,地址长度扩展支持至512位,支持大规模执行器集群配置; - 20、项目依赖升级,如spring、jackson等; - +- 21、任务参数“IJobHandler.execute”入参改为“String params”,增强入参通用性。 +- 22、脚本任务Shell、Python和Nodejs等支持获取分片参数; ### TODO LIST - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限; @@ -1099,10 +1110,10 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 11、任务日志,记录发起调度的机器信息; - 12、任务告警逻辑调整:任务调度,以及任务回调失败时,均推送监控队列。后期考虑通过任务Log字段控制告警状态; - 13、执行器Log清理功能:调度中心Log删除时同步删除执行器中的Log文件; -- 14、脚本任务 Shell、Python和Nodejs,如何友好获取分片参数; -- 15、Bean模式任务,JobHandler自动从执行器中查询展示为下拉框,选择后自动填充任务名称等属性; -- 16、任务告警邮件优化,调整为表格形式; -- 17、执行器回调地址格式兼容,支持非"/"结尾路径配置; +- 14、Bean模式任务,JobHandler自动从执行器中查询展示为下拉框,选择后自动填充任务名称等属性; +- 15、任务告警邮件优化,调整为表格形式; +- 16、执行器回调地址格式兼容,支持非"/"结尾路径配置; +- 17、任务事件触发API服务优化,支持调用时动态传参; ## 七、其他 diff --git a/doc/db/tables_xxl_job.sql b/doc/db/tables_xxl_job.sql index dcc2bee8..f10c5f62 100644 --- a/doc/db/tables_xxl_job.sql +++ b/doc/db/tables_xxl_job.sql @@ -156,7 +156,7 @@ CREATE TABLE `XXL_JOB_QRTZ_TRIGGER_INFO` ( `alarm_email` varchar(255) DEFAULT NULL COMMENT '报警邮件', `executor_route_strategy` varchar(50) DEFAULT NULL COMMENT '执行器路由策略', `executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler', - `executor_param` varchar(255) DEFAULT NULL COMMENT '执行器任务参数', + `executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数', `executor_block_strategy` varchar(50) DEFAULT NULL COMMENT '阻塞处理策略', `executor_fail_strategy` varchar(50) DEFAULT NULL COMMENT '失败处理策略', `glue_type` varchar(50) NOT NULL COMMENT 'GLUE类型', @@ -174,7 +174,7 @@ CREATE TABLE `XXL_JOB_QRTZ_TRIGGER_LOG` ( `glue_type` varchar(50) DEFAULT NULL COMMENT 'GLUE类型', `executor_address` varchar(255) DEFAULT NULL COMMENT '执行器地址,本次执行的地址', `executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler', - `executor_param` varchar(255) DEFAULT NULL COMMENT 'executor_param', + `executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数', `trigger_time` datetime DEFAULT NULL COMMENT '调度-时间', `trigger_code` varchar(255) NOT NULL DEFAULT '0' COMMENT '调度-结果', `trigger_msg` varchar(2048) DEFAULT NULL COMMENT '调度-日志', diff --git a/xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl b/xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl index 797d5909..537baeb3 100644 --- a/xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl +++ b/xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl @@ -143,7 +143,7 @@
-
+
@@ -192,7 +192,7 @@ import com.xxl.job.core.handler.IJobHandler; public class DemoGlueJobHandler extends IJobHandler { @Override - public ReturnT execute(String... params) throws Exception { + public ReturnT execute(String param) throws Exception { XxlJobLogger.log("XXL-JOB, Hello World."); return ReturnT.SUCCESS; } @@ -300,7 +300,7 @@ process.exit(0)
-
+
diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/handler/IJobHandler.java b/xxl-job-core/src/main/java/com/xxl/job/core/handler/IJobHandler.java index 64b2f97b..424b026e 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/handler/IJobHandler.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/handler/IJobHandler.java @@ -21,11 +21,11 @@ public abstract class IJobHandler { /** * execute handler * - * @param params + * @param param * @return * @throws Exception */ - public abstract ReturnT execute(String... params) throws Exception; + public abstract ReturnT execute(String param) throws Exception; /** diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/GlueJobHandler.java b/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/GlueJobHandler.java index a0539fd8..3dc91a22 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/GlueJobHandler.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/GlueJobHandler.java @@ -21,9 +21,9 @@ public class GlueJobHandler extends IJobHandler { } @Override - public ReturnT execute(String... params) throws Exception { + public ReturnT execute(String param) throws Exception { XxlJobLogger.log("----------- glue.version:"+ glueUpdatetime +" -----------"); - return jobHandler.execute(params); + return jobHandler.execute(param); } } diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java b/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java index 2449440d..038eec44 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java @@ -6,6 +6,7 @@ import com.xxl.job.core.handler.IJobHandler; import com.xxl.job.core.log.XxlJobFileAppender; import com.xxl.job.core.log.XxlJobLogger; import com.xxl.job.core.util.ScriptUtil; +import com.xxl.job.core.util.ShardingUtil; /** * Created by xuxueli on 17/4/27. @@ -29,7 +30,7 @@ public class ScriptJobHandler extends IJobHandler { } @Override - public ReturnT execute(String... params) throws Exception { + public ReturnT execute(String param) throws Exception { if (!glueType.isScript()) { return new ReturnT(IJobHandler.FAIL.getCode(), "glueType["+ glueType +"] invalid."); @@ -50,9 +51,16 @@ public class ScriptJobHandler extends IJobHandler { // log file String logFileName = XxlJobFileAppender.contextHolder.get(); + // script params:0=param、1=分片序号、2=分片总数 + ShardingUtil.ShardingVO shardingVO = ShardingUtil.getShardingVo(); + String[] scriptParams = new String[3]; + scriptParams[0] = param; + scriptParams[1] = String.valueOf(shardingVO.getIndex()); + scriptParams[2] = String.valueOf(shardingVO.getTotal()); + // invoke XxlJobLogger.log("----------- script file:"+ scriptFileName +" -----------"); - int exitValue = ScriptUtil.execToFile(cmd, scriptFileName, logFileName, params); + int exitValue = ScriptUtil.execToFile(cmd, scriptFileName, logFileName, scriptParams); ReturnT result = (exitValue==0)?IJobHandler.SUCCESS:new ReturnT(IJobHandler.FAIL.getCode(), "script exit value("+exitValue+") is failed"); return result; } diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java b/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java index 22503eac..e6d03967 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java @@ -114,19 +114,14 @@ public class JobThread extends Thread{ idleTimes = 0; triggerLogIdSet.remove(triggerParam.getLogId()); - // parse param - String[] handlerParams = (triggerParam.getExecutorParams()!=null && triggerParam.getExecutorParams().trim().length()>0) - ? (String[])(Arrays.asList(triggerParam.getExecutorParams().split(",")).toArray()) : null; - - // log filename, like "logPath/yyyy-MM-dd/9999.log" String logFileName = XxlJobFileAppender.makeLogFileName(new Date(triggerParam.getLogDateTim()), triggerParam.getLogId()); XxlJobFileAppender.contextHolder.set(logFileName); ShardingUtil.setShardingVo(new ShardingUtil.ShardingVO(triggerParam.getBroadcastIndex(), triggerParam.getBroadcastTotal())); // execute - XxlJobLogger.log("
----------- xxl-job job execute start -----------
----------- Params:" + Arrays.toString(handlerParams)); - executeResult = handler.execute(handlerParams); + XxlJobLogger.log("
----------- xxl-job job execute start -----------
----------- Param:" + triggerParam.getExecutorParams()); + executeResult = handler.execute(triggerParam.getExecutorParams()); if (executeResult == null) { executeResult = IJobHandler.FAIL; } diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/java/com/xuxueli/executor/sample/jfinal/jobhandler/DemoJobHandler.java b/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/java/com/xuxueli/executor/sample/jfinal/jobhandler/DemoJobHandler.java index e3f88109..ceec9b44 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/java/com/xuxueli/executor/sample/jfinal/jobhandler/DemoJobHandler.java +++ b/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/java/com/xuxueli/executor/sample/jfinal/jobhandler/DemoJobHandler.java @@ -20,7 +20,7 @@ import java.util.concurrent.TimeUnit; public class DemoJobHandler extends IJobHandler { @Override - public ReturnT execute(String... params) throws Exception { + public ReturnT execute(String param) throws Exception { XxlJobLogger.log("XXL-JOB, Hello World."); for (int i = 0; i < 5; i++) { diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/java/com/xuxueli/executor/sample/jfinal/jobhandler/ShardingJobHandler.java b/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/java/com/xuxueli/executor/sample/jfinal/jobhandler/ShardingJobHandler.java index f2e8a755..85bd70cd 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/java/com/xuxueli/executor/sample/jfinal/jobhandler/ShardingJobHandler.java +++ b/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/src/main/java/com/xuxueli/executor/sample/jfinal/jobhandler/ShardingJobHandler.java @@ -14,7 +14,7 @@ import com.xxl.job.core.util.ShardingUtil; public class ShardingJobHandler extends IJobHandler { @Override - public ReturnT execute(String... params) throws Exception { + public ReturnT execute(String param) throws Exception { // 分片参数 ShardingUtil.ShardingVO shardingVO = ShardingUtil.getShardingVo(); diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java index 7d414922..c5fa304d 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java +++ b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java @@ -25,7 +25,7 @@ import java.util.concurrent.TimeUnit; public class DemoJobHandler extends IJobHandler { @Override - public ReturnT execute(String... params) throws Exception { + public ReturnT execute(String param) throws Exception { XxlJobLogger.log("XXL-JOB, Hello World."); for (int i = 0; i < 5; i++) { diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/java/com/xxl/job/executor/service/jobhandler/ShardingJobHandler.java b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/java/com/xxl/job/executor/service/jobhandler/ShardingJobHandler.java index e7fd1eb6..70578097 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/java/com/xxl/job/executor/service/jobhandler/ShardingJobHandler.java +++ b/xxl-job-executor-samples/xxl-job-executor-sample-spring/src/main/java/com/xxl/job/executor/service/jobhandler/ShardingJobHandler.java @@ -18,7 +18,7 @@ import org.springframework.stereotype.Service; public class ShardingJobHandler extends IJobHandler { @Override - public ReturnT execute(String... params) throws Exception { + public ReturnT execute(String param) throws Exception { // 分片参数 ShardingUtil.ShardingVO shardingVO = ShardingUtil.getShardingVo(); diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java index 353fc5ff..79b95c7d 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java +++ b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java @@ -25,7 +25,7 @@ import java.util.concurrent.TimeUnit; public class DemoJobHandler extends IJobHandler { @Override - public ReturnT execute(String... params) throws Exception { + public ReturnT execute(String param) throws Exception { XxlJobLogger.log("XXL-JOB, Hello World."); for (int i = 0; i < 5; i++) { diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/ShardingJobHandler.java b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/ShardingJobHandler.java index 4224f0a2..b58871fe 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/ShardingJobHandler.java +++ b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/ShardingJobHandler.java @@ -18,7 +18,7 @@ import org.springframework.stereotype.Service; public class ShardingJobHandler extends IJobHandler { @Override - public ReturnT execute(String... params) throws Exception { + public ReturnT execute(String param) throws Exception { // 分片参数 ShardingUtil.ShardingVO shardingVO = ShardingUtil.getShardingVo(); From 38f896532c53a9694df140c7c7b8c2ae37d658fe Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Mon, 25 Dec 2017 11:07:00 +0800 Subject: [PATCH 85/93] =?UTF-8?q?=E8=84=9A=E6=9C=AC=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E6=BA=90=E7=A0=81=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../template/jobinfo/jobinfo.index.ftl | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl b/xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl index 537baeb3..039321d2 100644 --- a/xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl +++ b/xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl @@ -204,12 +204,15 @@ public class DemoGlueJobHandler extends IJobHandler { echo "xxl-job: hello shell" echo "脚本位置:$0" -echo "参数数量:$#" +echo "任务参数:$1" +echo "分片序号 = $2" +echo "分片总数 = $3" +<#--echo "参数数量:$#" for param in $* do echo "参数 : $param" sleep 1s -done +done--> echo "Good bye!" exit 0 @@ -221,13 +224,18 @@ import time import sys print "xxl-job: hello python" + print "脚本文件:", sys.argv[0] -for i in range(1, len(sys.argv)): +print "任务参数:", sys.argv[1] +print "分片序号:", sys.argv[2] +print "分片总数:", sys.argv[3] +<#--for i in range(1, len(sys.argv)): time.sleep(1) - print "参数", i, sys.argv[i] + print "参数", i, sys.argv[i]--> print "Good bye!" -exit(0)<#-- +exit(0) +<#-- import logging logging.basicConfig(level=logging.DEBUG) logging.info("脚本文件:" + sys.argv[0]) @@ -240,9 +248,12 @@ console.log("xxl-job: hello nodejs") var arguments = process.argv console.log("脚本文件: " + arguments[1]) -for (var i = 2; i < arguments.length; i++){ +console.log("任务参数: " + arguments[2]) +console.log("分片序号: " + arguments[3]) +console.log("分片总数: " + arguments[4]) +<#--for (var i = 2; i < arguments.length; i++){ console.log("参数 %s = %s", (i-1), arguments[i]); -} +}--> console.log("Good bye!") process.exit(0) From 2984ac5c5f2a8b5f58b718e74dca904c79f900b0 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Mon, 25 Dec 2017 11:20:01 +0800 Subject: [PATCH 86/93] =?UTF-8?q?=E6=9B=B4=E6=96=B0RM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../job/admin/core/trigger/XxlJobTrigger.java | 124 +++++++++--------- 1 file changed, 62 insertions(+), 62 deletions(-) diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java index 784fb5fa..bf3c8567 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java @@ -117,73 +117,73 @@ public class XxlJobTrigger { logger.debug(">>>>>>>>>>> xxl-job trigger end, jobId:{}", jobLog.getId()); } - return; - } - - // 1、save log-id - XxlJobLog jobLog = new XxlJobLog(); - jobLog.setJobGroup(jobInfo.getJobGroup()); - jobLog.setJobId(jobInfo.getId()); - XxlJobDynamicScheduler.xxlJobLogDao.save(jobLog); - logger.debug(">>>>>>>>>>> xxl-job trigger start, jobId:{}", jobLog.getId()); - - // 2、prepare trigger-info - //jobLog.setExecutorAddress(executorAddress); - jobLog.setGlueType(jobInfo.getGlueType()); - jobLog.setExecutorHandler(jobInfo.getExecutorHandler()); - jobLog.setExecutorParam(jobInfo.getExecutorParam()); - jobLog.setTriggerTime(new Date()); - - ReturnT triggerResult = new ReturnT(null); - StringBuffer triggerMsgSb = new StringBuffer(); - triggerMsgSb.append("调度机器:").append(IpUtil.getIp()); - triggerMsgSb.append("
执行器-注册方式:").append( (group.getAddressType() == 0)?"自动注册":"手动录入" ); - triggerMsgSb.append("
执行器-地址列表:").append(group.getRegistryList()); - triggerMsgSb.append("
路由策略:").append(executorRouteStrategyEnum.getTitle()); - triggerMsgSb.append("
阻塞处理策略:").append(blockStrategy.getTitle()); - triggerMsgSb.append("
失败处理策略:").append(failStrategy.getTitle()); - - // 3、trigger-valid - if (triggerResult.getCode()==ReturnT.SUCCESS_CODE && CollectionUtils.isEmpty(addressList)) { - triggerResult.setCode(ReturnT.FAIL_CODE); - triggerMsgSb.append("
----------------------
").append("调度失败:").append("执行器地址为空"); - } + } else { + // 1、save log-id + XxlJobLog jobLog = new XxlJobLog(); + jobLog.setJobGroup(jobInfo.getJobGroup()); + jobLog.setJobId(jobInfo.getId()); + XxlJobDynamicScheduler.xxlJobLogDao.save(jobLog); + logger.debug(">>>>>>>>>>> xxl-job trigger start, jobId:{}", jobLog.getId()); + + // 2、prepare trigger-info + //jobLog.setExecutorAddress(executorAddress); + jobLog.setGlueType(jobInfo.getGlueType()); + jobLog.setExecutorHandler(jobInfo.getExecutorHandler()); + jobLog.setExecutorParam(jobInfo.getExecutorParam()); + jobLog.setTriggerTime(new Date()); + + ReturnT triggerResult = new ReturnT(null); + StringBuffer triggerMsgSb = new StringBuffer(); + triggerMsgSb.append("调度机器:").append(IpUtil.getIp()); + triggerMsgSb.append("
执行器-注册方式:").append( (group.getAddressType() == 0)?"自动注册":"手动录入" ); + triggerMsgSb.append("
执行器-地址列表:").append(group.getRegistryList()); + triggerMsgSb.append("
路由策略:").append(executorRouteStrategyEnum.getTitle()); + triggerMsgSb.append("
阻塞处理策略:").append(blockStrategy.getTitle()); + triggerMsgSb.append("
失败处理策略:").append(failStrategy.getTitle()); + + // 3、trigger-valid + if (triggerResult.getCode()==ReturnT.SUCCESS_CODE && CollectionUtils.isEmpty(addressList)) { + triggerResult.setCode(ReturnT.FAIL_CODE); + triggerMsgSb.append("
----------------------
").append("调度失败:").append("执行器地址为空"); + } - if (triggerResult.getCode() == ReturnT.SUCCESS_CODE) { - // 4.1、trigger-param - TriggerParam triggerParam = new TriggerParam(); - triggerParam.setJobId(jobInfo.getId()); - triggerParam.setExecutorHandler(jobInfo.getExecutorHandler()); - triggerParam.setExecutorParams(jobInfo.getExecutorParam()); - triggerParam.setExecutorBlockStrategy(jobInfo.getExecutorBlockStrategy()); - triggerParam.setLogId(jobLog.getId()); - triggerParam.setLogDateTim(jobLog.getTriggerTime().getTime()); - triggerParam.setGlueType(jobInfo.getGlueType()); - triggerParam.setGlueSource(jobInfo.getGlueSource()); - triggerParam.setGlueUpdatetime(jobInfo.getGlueUpdatetime().getTime()); - triggerParam.setBroadcastIndex(0); - triggerParam.setBroadcastTotal(1); - - // 4.2、trigger-run (route run / trigger remote executor) - triggerResult = executorRouteStrategyEnum.getRouter().routeRun(triggerParam, addressList); - triggerMsgSb.append("

>>>>>>>>>>>触发调度<<<<<<<<<<<
").append(triggerResult.getMsg()); - - // 4.3、trigger (fail retry) - if (triggerResult.getCode()!=ReturnT.SUCCESS_CODE && failStrategy == ExecutorFailStrategyEnum.FAIL_RETRY) { + if (triggerResult.getCode() == ReturnT.SUCCESS_CODE) { + // 4.1、trigger-param + TriggerParam triggerParam = new TriggerParam(); + triggerParam.setJobId(jobInfo.getId()); + triggerParam.setExecutorHandler(jobInfo.getExecutorHandler()); + triggerParam.setExecutorParams(jobInfo.getExecutorParam()); + triggerParam.setExecutorBlockStrategy(jobInfo.getExecutorBlockStrategy()); + triggerParam.setLogId(jobLog.getId()); + triggerParam.setLogDateTim(jobLog.getTriggerTime().getTime()); + triggerParam.setGlueType(jobInfo.getGlueType()); + triggerParam.setGlueSource(jobInfo.getGlueSource()); + triggerParam.setGlueUpdatetime(jobInfo.getGlueUpdatetime().getTime()); + triggerParam.setBroadcastIndex(0); + triggerParam.setBroadcastTotal(1); + + // 4.2、trigger-run (route run / trigger remote executor) triggerResult = executorRouteStrategyEnum.getRouter().routeRun(triggerParam, addressList); - triggerMsgSb.append("

>>>>>>>>>>>调度失败重试<<<<<<<<<<<
").append(triggerResult.getMsg()); + triggerMsgSb.append("

>>>>>>>>>>>触发调度<<<<<<<<<<<
").append(triggerResult.getMsg()); + + // 4.3、trigger (fail retry) + if (triggerResult.getCode()!=ReturnT.SUCCESS_CODE && failStrategy == ExecutorFailStrategyEnum.FAIL_RETRY) { + triggerResult = executorRouteStrategyEnum.getRouter().routeRun(triggerParam, addressList); + triggerMsgSb.append("

>>>>>>>>>>>调度失败重试<<<<<<<<<<<
").append(triggerResult.getMsg()); + } } - } - // 5、save trigger-info - jobLog.setExecutorAddress(triggerResult.getContent()); - jobLog.setTriggerCode(triggerResult.getCode()); - jobLog.setTriggerMsg(triggerMsgSb.toString()); - XxlJobDynamicScheduler.xxlJobLogDao.updateTriggerInfo(jobLog); + // 5、save trigger-info + jobLog.setExecutorAddress(triggerResult.getContent()); + jobLog.setTriggerCode(triggerResult.getCode()); + jobLog.setTriggerMsg(triggerMsgSb.toString()); + XxlJobDynamicScheduler.xxlJobLogDao.updateTriggerInfo(jobLog); + + // 6、monitor triger + JobFailMonitorHelper.monitor(jobLog.getId()); + logger.debug(">>>>>>>>>>> xxl-job trigger end, jobId:{}", jobLog.getId()); + } - // 6、monitor triger - JobFailMonitorHelper.monitor(jobLog.getId()); - logger.debug(">>>>>>>>>>> xxl-job trigger end, jobId:{}", jobLog.getId()); } /** From 36508c0c3cdbfd473cbd44b92cf55279388d6192 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Mon, 25 Dec 2017 11:30:52 +0800 Subject: [PATCH 87/93] =?UTF-8?q?=E7=99=BB=E9=99=86=E6=B3=A8=E9=94=80?= =?UTF-8?q?=E4=BA=A4=E4=BA=92=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xxl-job-admin/src/main/webapp/static/js/common.1.js | 8 ++++++-- xxl-job-admin/src/main/webapp/static/js/login.1.js | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/xxl-job-admin/src/main/webapp/static/js/common.1.js b/xxl-job-admin/src/main/webapp/static/js/common.1.js index 515325f5..b11af37a 100644 --- a/xxl-job-admin/src/main/webapp/static/js/common.1.js +++ b/xxl-job-admin/src/main/webapp/static/js/common.1.js @@ -7,14 +7,18 @@ $(function(){ $.post(base_url + "/logout", function(data, status) { if (data.code == "200") { - layer.open({ + layer.msg('注销成功'); + setTimeout(function(){ + window.location.href = base_url + "/"; + }, 500); + /*layer.open({ title: '系统提示', content: '注销成功', icon: '1', end: function(layero, index){ window.location.href = base_url + "/"; } - }); + });*/ } else { layer.open({ title: '系统提示', diff --git a/xxl-job-admin/src/main/webapp/static/js/login.1.js b/xxl-job-admin/src/main/webapp/static/js/login.1.js index 67bd6cac..6300cdbc 100644 --- a/xxl-job-admin/src/main/webapp/static/js/login.1.js +++ b/xxl-job-admin/src/main/webapp/static/js/login.1.js @@ -48,14 +48,18 @@ $(function(){ submitHandler : function(form) { $.post(base_url + "/login", $("#loginForm").serialize(), function(data, status) { if (data.code == "200") { - layer.open({ + layer.msg('登录成功'); + setTimeout(function(){ + window.location.href = base_url; + }, 500); + /*layer.open({ title: '系统提示', content: '登录成功', icon: '1', end: function(layero, index){ window.location.href = base_url; } - }); + });*/ } else { layer.open({ title: '系统提示', From c23a38373cf4200b807e3f0ceb5c3374efde50c9 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Mon, 25 Dec 2017 11:35:22 +0800 Subject: [PATCH 88/93] =?UTF-8?q?=E4=BA=A4=E4=BA=92=E4=BC=98=E5=8C=96?= =?UTF-8?q?=EF=BC=8C=E5=A6=82=E7=99=BB=E9=99=86=E6=B3=A8=E9=94=80=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 1 + .../controller/interceptor/CookieInterceptor.java | 10 +++++----- .../controller/interceptor/PermissionInterceptor.java | 3 ++- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 1acbe454..eed3d5ae 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1095,6 +1095,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 20、项目依赖升级,如spring、jackson等; - 21、任务参数“IJobHandler.execute”入参改为“String params”,增强入参通用性。 - 22、脚本任务Shell、Python和Nodejs等支持获取分片参数; +- 23、交互优化,如登陆注销; ### TODO LIST - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限; 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 66532810..bd84534f 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 @@ -1,17 +1,17 @@ package com.xxl.job.admin.controller.interceptor; -import java.util.HashMap; +import org.apache.commons.lang3.ArrayUtils; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; - -import org.apache.commons.lang3.ArrayUtils; -import org.springframework.web.servlet.ModelAndView; -import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; +import java.util.HashMap; /** * push cookies to model as cookieMap + * * @author xuxueli 2015-12-12 18:09:04 */ public class CookieInterceptor extends HandlerInterceptorAdapter { 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 ab565e1f..74633dd7 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 @@ -12,11 +12,12 @@ import java.math.BigInteger; /** * 权限拦截, 简易版 + * * @author xuxueli 2015-12-12 18:09:04 */ public class PermissionInterceptor extends HandlerInterceptorAdapter { - public static final String LOGIN_IDENTITY_KEY = "LOGIN_IDENTITY"; + public static final String LOGIN_IDENTITY_KEY = "XXL_JOB_LOGIN_IDENTITY"; public static final String LOGIN_IDENTITY_TOKEN; static { String username = PropertiesUtil.getString("xxl.job.login.username"); From f54b7f3484a4712e060054c435cb96b66b9c308b Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Mon, 25 Dec 2017 11:51:02 +0800 Subject: [PATCH 89/93] =?UTF-8?q?=E6=9B=B4=E6=96=B0RM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/xxl/job/core/handler/IJobHandler.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/handler/IJobHandler.java b/xxl-job-core/src/main/java/com/xxl/job/core/handler/IJobHandler.java index 424b026e..fd1d0b12 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/handler/IJobHandler.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/handler/IJobHandler.java @@ -19,7 +19,7 @@ public abstract class IJobHandler { /** - * execute handler + * execute handler, invoked when executor receives a scheduling request * * @param param * @return @@ -29,7 +29,7 @@ public abstract class IJobHandler { /** - * init handler + * init handler, invoked when JobThread init */ public void init() { // TODO @@ -37,7 +37,7 @@ public abstract class IJobHandler { /** - * destroy handler + * destroy handler, invoked when JobThread destroy */ public void destroy() { // TODO From 6cbe4a7568284de17c11c28549577bd9c5fbaa32 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Mon, 25 Dec 2017 12:06:24 +0800 Subject: [PATCH 90/93] =?UTF-8?q?=E6=9B=B4=E6=96=B0RM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 58 ++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index eed3d5ae..7e7a505d 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1074,28 +1074,30 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 ### 6.20 版本 V1.9.0 特性[迭代中] - 1、新增任务运行模式 "GLUE模式(NodeJS) ",支持NodeJS脚本任务; -- 2、失败告警策略扩展:默认提供邮件失败告警,可扩展短信等,扩展代码位置为 "JobFailMonitorHelper.failAlarm"; -- 3、修复任务监控线程被耗时任务阻塞的问题; -- 4、修复任务监控线程无法监控任务触发和执行状态均未0的问题; -- 5、调度中心项目日志配置改为xml文件格式; -- 6、执行器动态代理对象,拦截非业务方法的执行; -- 7、底层系统日志级别规范调整,清理遗留代码; -- 8、修改JobThread捕获Error错误不更新JobLog的问题; -- 9、任务注解调整为 “@JobHandler”,与任务注解统一; -- 10、执行器端口支持随机生成(小于等于0时),避免端口定义冲突; -- 11、任务Cron长度扩展支持至128位,支持负责类型Cron设置; -- 12、调度报表优化,支持时间区间筛选; -- 13、Log组件支持输出异常栈信息,底层实现优化; -- 14、失败重试:调度中心调度失败且启用"失败重试"策略时,将会自动重试一次;执行器执行失败且回调失败重试状态时,也将会自动重试一次; -- 15、Log地址格式兼容,支持非"/"结尾路径配置; -- 16、JobHandler提供init/destroy方法,支持在JobHandler初始化和销毁时进行附加操作; -- 17、告警邮件样式优化;邮件组件调整为commons-email简化邮件操作; -- 18、任务列表界面,左侧菜单合并时样式错乱问题修复; -- 19、执行器地址录入交互优化,地址长度扩展支持至512位,支持大规模执行器集群配置; -- 20、项目依赖升级,如spring、jackson等; -- 21、任务参数“IJobHandler.execute”入参改为“String params”,增强入参通用性。 -- 22、脚本任务Shell、Python和Nodejs等支持获取分片参数; -- 23、交互优化,如登陆注销; +- 2、脚本任务Shell、Python和Nodejs等支持获取分片参数; +- 3、失败重试,完整支持:调度中心调度失败且启用"失败重试"策略时,将会自动重试一次;执行器执行失败且回调失败重试状态(新增失败重试状态返回值)时,也将会自动重试一次; +- 4、失败告警策略扩展:默认提供邮件失败告警,可扩展短信等,扩展代码位置为 "JobFailMonitorHelper.failAlarm"; +- 5、执行器端口支持自动生成(小于等于0时),避免端口定义冲突; +- 6、调度报表优化,支持时间区间筛选; +- 7、Log组件支持输出异常栈信息,底层实现优化; +- 8、告警邮件样式优化,调整为表格形式,邮件组件调整为commons-email简化邮件操作; +- 9、项目依赖升级,如spring、jackson等; +- 10、任务日志,记录发起调度的机器信息; +- 11、交互优化,如登陆注销; +- 12、任务Cron长度扩展支持至128位,支持负责类型Cron设置; +- 13、执行器地址录入交互优化,地址长度扩展支持至512位,支持大规模执行器集群配置; +- 14、任务参数“IJobHandler.execute”入参改为“String params”,增强入参通用性。 +- 15、JobHandler提供init/destroy方法,支持在JobHandler初始化和销毁时进行附加操作; +- 16、任务注解调整为 “@JobHandler”,与任务抽象接口统一; +- 17、修复任务监控线程被耗时任务阻塞的问题; +- 18、修复任务监控线程无法监控任务触发和执行状态均未0的问题; +- 19、执行器动态代理对象,拦截非业务方法的执行; +- 20、修复JobThread捕获Error错误不更新JobLog的问题; +- 21、修复任务列表界面左侧菜单合并时样式错乱问题; +- 22、调度中心项目日志配置改为xml文件格式; +- 23、Log地址格式兼容,支持非"/"结尾路径配置; +- 24、底层系统日志级别规范调整,清理遗留代码; + ### TODO LIST - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限; @@ -1107,14 +1109,10 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 7、移除quartz依赖,重写调度模块:新增或恢复任务时将下次执行记录插入delayqueue,调度中心集群竞争分布式锁,成功节点批量加载到期delayqueue数据,批量执行。 - 8、springboot 和 docker镜像,并且推送docker镜像到中央仓库,更进一步实现产品开箱即用; - 9、国际化:调度中心界面。 -- 10、任务类方法"IJobHandler.execute"的参数类型改为"string",进一步方便参数传递;任务注解和任务类统一并改为"JobHandler""; -- 11、任务日志,记录发起调度的机器信息; -- 12、任务告警逻辑调整:任务调度,以及任务回调失败时,均推送监控队列。后期考虑通过任务Log字段控制告警状态; -- 13、执行器Log清理功能:调度中心Log删除时同步删除执行器中的Log文件; -- 14、Bean模式任务,JobHandler自动从执行器中查询展示为下拉框,选择后自动填充任务名称等属性; -- 15、任务告警邮件优化,调整为表格形式; -- 16、执行器回调地址格式兼容,支持非"/"结尾路径配置; -- 17、任务事件触发API服务优化,支持调用时动态传参; +- 10、任务告警逻辑调整:任务调度,以及任务回调失败时,均推送监控队列。后期考虑通过任务Log字段控制告警状态; +- 11、执行器Log清理功能:调度中心Log删除时同步删除执行器中的Log文件; +- 12、Bean模式任务,JobHandler自动从执行器中查询展示为下拉框,选择后自动填充任务名称等属性; +- 13、任务事件触发API服务优化,支持调用时动态传参; ## 七、其他 From 3b5dee19ab22cbfe28218d42aba39c5ff4fc100a Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Mon, 25 Dec 2017 12:16:00 +0800 Subject: [PATCH 91/93] =?UTF-8?q?=E6=9B=B4=E6=96=B0RM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/db/tables_xxl_job.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/db/tables_xxl_job.sql b/doc/db/tables_xxl_job.sql index a43f011d..6de19187 100644 --- a/doc/db/tables_xxl_job.sql +++ b/doc/db/tables_xxl_job.sql @@ -1,6 +1,8 @@ CREATE database if NOT EXISTS `xxl-job` default character set utf8 collate utf8_general_ci; use `xxl-job`; + + CREATE TABLE XXL_JOB_QRTZ_JOB_DETAILS ( SCHED_NAME VARCHAR(120) NOT NULL, From 7a8937ddf474692ee6eabf12ecfdfbd4d162a7e6 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Mon, 25 Dec 2017 16:00:01 +0800 Subject: [PATCH 92/93] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8Bpacka?= =?UTF-8?q?ge=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 3 +- .../job/admin/core/util/PropertiesUtil.java | 5 +- .../controller/AbstractSpringMvcTest.java | 2 + .../admin/controller/IndexControllerTest.java | 22 --- .../controller/JobInfoControllerTest.java | 39 ++--- .../dao}/XxlJobGroupDaoTest.java | 2 +- .../dao/XxlJobInfoDaoTest.java} | 156 +++++++++--------- .../impl => admin/dao}/XxlJobLogDaoTest.java | 2 +- .../dao}/XxlJobLogGlueDaoTest.java | 2 +- .../dao}/XxlJobRegistryDaoTest.java | 2 +- .../impl => admin/util}/MailUtilTest.java | 2 +- .../job/admin/util/PropertiesUtilTest.java | 18 ++ .../{dao/impl => adminbiz}/AdminBizTest.java | 2 +- 13 files changed, 124 insertions(+), 133 deletions(-) delete mode 100644 xxl-job-admin/src/test/java/com/xxl/job/admin/controller/IndexControllerTest.java rename xxl-job-admin/src/test/java/com/xxl/job/{dao/impl => admin/dao}/XxlJobGroupDaoTest.java (97%) rename xxl-job-admin/src/test/java/com/xxl/job/{dao/impl/XxlJobInfoTest.java => admin/dao/XxlJobInfoDaoTest.java} (94%) rename xxl-job-admin/src/test/java/com/xxl/job/{dao/impl => admin/dao}/XxlJobLogDaoTest.java (98%) rename xxl-job-admin/src/test/java/com/xxl/job/{dao/impl => admin/dao}/XxlJobLogGlueDaoTest.java (97%) rename xxl-job-admin/src/test/java/com/xxl/job/{dao/impl => admin/dao}/XxlJobRegistryDaoTest.java (96%) rename xxl-job-admin/src/test/java/com/xxl/job/{dao/impl => admin/util}/MailUtilTest.java (97%) create mode 100644 xxl-job-admin/src/test/java/com/xxl/job/admin/util/PropertiesUtilTest.java rename xxl-job-admin/src/test/java/com/xxl/job/{dao/impl => adminbiz}/AdminBizTest.java (98%) diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 7e7a505d..b9fa7b7d 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -834,7 +834,7 @@ echo "分片总数 total = $3" 调度中心API服务位置:com.xxl.job.core.biz.AdminBiz.java -调度中心API服务请求参考代码:com.xxl.job.dao.impl.AdminBizTest.java +调度中心API服务请求参考代码:com.xxl.job.adminbiz.AdminBizTest.java ### 5.12 执行器API服务 执行器提供了API服务,供调度中心选择使用,目前提供的API服务有: @@ -1097,6 +1097,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 22、调度中心项目日志配置改为xml文件格式; - 23、Log地址格式兼容,支持非"/"结尾路径配置; - 24、底层系统日志级别规范调整,清理遗留代码; +- 25、建表SQL优化,支持同步创建制定编码的库和表; ### TODO LIST diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/PropertiesUtil.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/PropertiesUtil.java index ed80e708..a3c60077 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/PropertiesUtil.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/PropertiesUtil.java @@ -12,6 +12,7 @@ import java.util.Properties; /** * properties util + * * @author xuxueli 2015-8-28 10:35:53 */ public class PropertiesUtil { @@ -33,9 +34,5 @@ public class PropertiesUtil { } return null; } - - public static void main(String[] args) { - System.out.println(getString("xxl.job.login.username")); - } } diff --git a/xxl-job-admin/src/test/java/com/xxl/job/admin/controller/AbstractSpringMvcTest.java b/xxl-job-admin/src/test/java/com/xxl/job/admin/controller/AbstractSpringMvcTest.java index 3aab69dd..bb156206 100644 --- a/xxl-job-admin/src/test/java/com/xxl/job/admin/controller/AbstractSpringMvcTest.java +++ b/xxl-job-admin/src/test/java/com/xxl/job/admin/controller/AbstractSpringMvcTest.java @@ -14,6 +14,7 @@ import org.springframework.web.context.WebApplicationContext; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath*:spring/*.xml"}) public class AbstractSpringMvcTest { + @Autowired private WebApplicationContext applicationContext; protected MockMvc mockMvc; @@ -22,4 +23,5 @@ public class AbstractSpringMvcTest { public void setup() { this.mockMvc = MockMvcBuilders.webAppContextSetup(this.applicationContext).build(); } + } diff --git a/xxl-job-admin/src/test/java/com/xxl/job/admin/controller/IndexControllerTest.java b/xxl-job-admin/src/test/java/com/xxl/job/admin/controller/IndexControllerTest.java deleted file mode 100644 index 1eb76743..00000000 --- a/xxl-job-admin/src/test/java/com/xxl/job/admin/controller/IndexControllerTest.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.xxl.job.admin.controller; - -import org.junit.Test; -import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.MvcResult; - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; - -public class IndexControllerTest extends AbstractSpringMvcTest { - - @Test - public void testLogin() throws Exception { - MvcResult ret = mockMvc.perform( - post("/login") - .contentType(MediaType.APPLICATION_FORM_URLENCODED) - .param("userName", "admin") - .param("password", "123456") - ).andReturn(); - - System.out.println(ret.getResponse().getContentAsString()); - } -} 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 33df92e9..8da5fda3 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 @@ -1,52 +1,47 @@ package com.xxl.job.admin.controller; -import com.xxl.job.admin.core.model.XxlJobInfo; -import org.codehaus.jackson.map.ObjectMapper; +import com.xxl.job.admin.controller.interceptor.PermissionInterceptor; +import com.xxl.job.admin.core.util.PropertiesUtil; import org.junit.Before; import org.junit.Test; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MvcResult; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; import javax.servlet.http.Cookie; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; public class JobInfoControllerTest extends AbstractSpringMvcTest { - Cookie cookie; + + private Cookie cookie; @Before public void login() throws Exception { MvcResult ret = mockMvc.perform( post("/login") .contentType(MediaType.APPLICATION_FORM_URLENCODED) - .param("userName", "admin") - .param("password", "123456") + .param("userName", PropertiesUtil.getString("xxl.job.login.username")) + .param("password", PropertiesUtil.getString("xxl.job.login.password")) ).andReturn(); - cookie = ret.getResponse().getCookie("LOGIN_IDENTITY"); + cookie = ret.getResponse().getCookie(PermissionInterceptor.LOGIN_IDENTITY_KEY); } @Test public void testAdd() throws Exception { - XxlJobInfo jobInfo = new XxlJobInfo(); - jobInfo.setJobGroup(1); - jobInfo.setJobDesc("autoEnquiryStatisPerWeek"); - jobInfo.setExecutorRouteStrategy("FIRST"); - jobInfo.setJobCron("0 0 1 ? * MON"); - jobInfo.setGlueType("BEAN"); - jobInfo.setExecutorHandler("AutoEnquriy"); - jobInfo.setExecutorBlockStrategy("SERIAL_EXECUTION"); - jobInfo.setExecutorFailStrategy("FAIL_ALARM"); - jobInfo.setAuthor("listening"); - - ObjectMapper mapper = new ObjectMapper(); - String jobInfoStr = mapper.writeValueAsString(jobInfo); + MultiValueMap parameters = new LinkedMultiValueMap(); + parameters.add("jobGroup", "1"); + MvcResult ret = mockMvc.perform( - post("/jobinfo/add") + post("/jobinfo/pageList") .contentType(MediaType.APPLICATION_FORM_URLENCODED) - .content(jobInfoStr) + //.content(paramsJson) + .params(parameters) .cookie(cookie) ).andReturn(); System.out.println(ret.getResponse().getContentAsString()); } + } diff --git a/xxl-job-admin/src/test/java/com/xxl/job/dao/impl/XxlJobGroupDaoTest.java b/xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobGroupDaoTest.java similarity index 97% rename from xxl-job-admin/src/test/java/com/xxl/job/dao/impl/XxlJobGroupDaoTest.java rename to xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobGroupDaoTest.java index 122d4780..5b99178f 100644 --- a/xxl-job-admin/src/test/java/com/xxl/job/dao/impl/XxlJobGroupDaoTest.java +++ b/xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobGroupDaoTest.java @@ -1,4 +1,4 @@ -package com.xxl.job.dao.impl; +package com.xxl.job.admin.dao; import com.xxl.job.admin.core.model.XxlJobGroup; import com.xxl.job.admin.dao.XxlJobGroupDao; diff --git a/xxl-job-admin/src/test/java/com/xxl/job/dao/impl/XxlJobInfoTest.java b/xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobInfoDaoTest.java similarity index 94% rename from xxl-job-admin/src/test/java/com/xxl/job/dao/impl/XxlJobInfoTest.java rename to xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobInfoDaoTest.java index d7d17d2d..5da58a1e 100644 --- a/xxl-job-admin/src/test/java/com/xxl/job/dao/impl/XxlJobInfoTest.java +++ b/xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobInfoDaoTest.java @@ -1,78 +1,78 @@ -package com.xxl.job.dao.impl; - -import com.xxl.job.admin.core.model.XxlJobInfo; -import com.xxl.job.admin.dao.XxlJobInfoDao; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -import javax.annotation.Resource; -import java.util.Date; -import java.util.List; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(locations = "classpath*:spring/applicationcontext-*.xml") -public class XxlJobInfoTest { - - @Resource - private XxlJobInfoDao xxlJobInfoDao; - - @Test - public void pageList(){ - List list = xxlJobInfoDao.pageList(0, 20, 0, null); - int list_count = xxlJobInfoDao.pageListCount(0, 20, 0, null); - - System.out.println(list); - System.out.println(list_count); - - List list2 = xxlJobInfoDao.getJobsByGroup(1); - } - - @Test - public void save_load(){ - XxlJobInfo info = new XxlJobInfo(); - info.setJobGroup(1); - info.setJobCron("jobCron"); - info.setJobDesc("desc"); - info.setAuthor("setAuthor"); - info.setAlarmEmail("setAlarmEmail"); - info.setExecutorRouteStrategy("setExecutorRouteStrategy"); - info.setExecutorHandler("setExecutorHandler"); - info.setExecutorParam("setExecutorParam"); - info.setExecutorBlockStrategy("setExecutorBlockStrategy"); - info.setExecutorFailStrategy("setExecutorFailStrategy"); - info.setGlueType("setGlueType"); - info.setGlueSource("setGlueSource"); - info.setGlueRemark("setGlueRemark"); - info.setChildJobKey("setChildJobKey"); - - int count = xxlJobInfoDao.save(info); - - XxlJobInfo info2 = xxlJobInfoDao.loadById(info.getId()); - info2.setJobCron("jobCron2"); - info2.setJobDesc("desc2"); - info2.setAuthor("setAuthor2"); - info2.setAlarmEmail("setAlarmEmail2"); - info2.setExecutorRouteStrategy("setExecutorRouteStrategy2"); - info2.setExecutorHandler("setExecutorHandler2"); - info2.setExecutorParam("setExecutorParam2"); - info2.setExecutorBlockStrategy("setExecutorBlockStrategy2"); - info2.setExecutorFailStrategy("setExecutorFailStrategy2"); - info2.setGlueType("setGlueType2"); - info2.setGlueSource("setGlueSource2"); - info2.setGlueRemark("setGlueRemark2"); - info2.setGlueUpdatetime(new Date()); - info2.setChildJobKey("setChildJobKey2"); - - int item2 = xxlJobInfoDao.update(info2); - - xxlJobInfoDao.delete(info2.getId()); - - List list2 = xxlJobInfoDao.getJobsByGroup(1); - - int ret3 = xxlJobInfoDao.findAllCount(); - - } - -} +package com.xxl.job.admin.dao; + +import com.xxl.job.admin.core.model.XxlJobInfo; +import com.xxl.job.admin.dao.XxlJobInfoDao; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(locations = "classpath*:spring/applicationcontext-*.xml") +public class XxlJobInfoDaoTest { + + @Resource + private XxlJobInfoDao xxlJobInfoDao; + + @Test + public void pageList(){ + List list = xxlJobInfoDao.pageList(0, 20, 0, null); + int list_count = xxlJobInfoDao.pageListCount(0, 20, 0, null); + + System.out.println(list); + System.out.println(list_count); + + List list2 = xxlJobInfoDao.getJobsByGroup(1); + } + + @Test + public void save_load(){ + XxlJobInfo info = new XxlJobInfo(); + info.setJobGroup(1); + info.setJobCron("jobCron"); + info.setJobDesc("desc"); + info.setAuthor("setAuthor"); + info.setAlarmEmail("setAlarmEmail"); + info.setExecutorRouteStrategy("setExecutorRouteStrategy"); + info.setExecutorHandler("setExecutorHandler"); + info.setExecutorParam("setExecutorParam"); + info.setExecutorBlockStrategy("setExecutorBlockStrategy"); + info.setExecutorFailStrategy("setExecutorFailStrategy"); + info.setGlueType("setGlueType"); + info.setGlueSource("setGlueSource"); + info.setGlueRemark("setGlueRemark"); + info.setChildJobKey("setChildJobKey"); + + int count = xxlJobInfoDao.save(info); + + XxlJobInfo info2 = xxlJobInfoDao.loadById(info.getId()); + info2.setJobCron("jobCron2"); + info2.setJobDesc("desc2"); + info2.setAuthor("setAuthor2"); + info2.setAlarmEmail("setAlarmEmail2"); + info2.setExecutorRouteStrategy("setExecutorRouteStrategy2"); + info2.setExecutorHandler("setExecutorHandler2"); + info2.setExecutorParam("setExecutorParam2"); + info2.setExecutorBlockStrategy("setExecutorBlockStrategy2"); + info2.setExecutorFailStrategy("setExecutorFailStrategy2"); + info2.setGlueType("setGlueType2"); + info2.setGlueSource("setGlueSource2"); + info2.setGlueRemark("setGlueRemark2"); + info2.setGlueUpdatetime(new Date()); + info2.setChildJobKey("setChildJobKey2"); + + int item2 = xxlJobInfoDao.update(info2); + + xxlJobInfoDao.delete(info2.getId()); + + List list2 = xxlJobInfoDao.getJobsByGroup(1); + + int ret3 = xxlJobInfoDao.findAllCount(); + + } + +} diff --git a/xxl-job-admin/src/test/java/com/xxl/job/dao/impl/XxlJobLogDaoTest.java b/xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobLogDaoTest.java similarity index 98% rename from xxl-job-admin/src/test/java/com/xxl/job/dao/impl/XxlJobLogDaoTest.java rename to xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobLogDaoTest.java index eb659848..02652bbc 100644 --- a/xxl-job-admin/src/test/java/com/xxl/job/dao/impl/XxlJobLogDaoTest.java +++ b/xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobLogDaoTest.java @@ -1,4 +1,4 @@ -package com.xxl.job.dao.impl; +package com.xxl.job.admin.dao; import com.xxl.job.admin.core.model.XxlJobLog; import com.xxl.job.admin.dao.XxlJobLogDao; diff --git a/xxl-job-admin/src/test/java/com/xxl/job/dao/impl/XxlJobLogGlueDaoTest.java b/xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobLogGlueDaoTest.java similarity index 97% rename from xxl-job-admin/src/test/java/com/xxl/job/dao/impl/XxlJobLogGlueDaoTest.java rename to xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobLogGlueDaoTest.java index fe8ebc8a..a4adc444 100644 --- a/xxl-job-admin/src/test/java/com/xxl/job/dao/impl/XxlJobLogGlueDaoTest.java +++ b/xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobLogGlueDaoTest.java @@ -1,4 +1,4 @@ -package com.xxl.job.dao.impl; +package com.xxl.job.admin.dao; import com.xxl.job.admin.core.model.XxlJobLogGlue; import com.xxl.job.admin.dao.XxlJobLogGlueDao; diff --git a/xxl-job-admin/src/test/java/com/xxl/job/dao/impl/XxlJobRegistryDaoTest.java b/xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobRegistryDaoTest.java similarity index 96% rename from xxl-job-admin/src/test/java/com/xxl/job/dao/impl/XxlJobRegistryDaoTest.java rename to xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobRegistryDaoTest.java index 349ef4b0..69448727 100644 --- a/xxl-job-admin/src/test/java/com/xxl/job/dao/impl/XxlJobRegistryDaoTest.java +++ b/xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobRegistryDaoTest.java @@ -1,4 +1,4 @@ -package com.xxl.job.dao.impl; +package com.xxl.job.admin.dao; import com.xxl.job.admin.core.model.XxlJobRegistry; import com.xxl.job.admin.dao.XxlJobRegistryDao; diff --git a/xxl-job-admin/src/test/java/com/xxl/job/dao/impl/MailUtilTest.java b/xxl-job-admin/src/test/java/com/xxl/job/admin/util/MailUtilTest.java similarity index 97% rename from xxl-job-admin/src/test/java/com/xxl/job/dao/impl/MailUtilTest.java rename to xxl-job-admin/src/test/java/com/xxl/job/admin/util/MailUtilTest.java index 7f96673f..a55c75f8 100644 --- a/xxl-job-admin/src/test/java/com/xxl/job/dao/impl/MailUtilTest.java +++ b/xxl-job-admin/src/test/java/com/xxl/job/admin/util/MailUtilTest.java @@ -1,4 +1,4 @@ -package com.xxl.job.dao.impl; +package com.xxl.job.admin.util; import com.xxl.job.admin.core.util.MailUtil; import org.junit.Test; diff --git a/xxl-job-admin/src/test/java/com/xxl/job/admin/util/PropertiesUtilTest.java b/xxl-job-admin/src/test/java/com/xxl/job/admin/util/PropertiesUtilTest.java new file mode 100644 index 00000000..5c8b7f04 --- /dev/null +++ b/xxl-job-admin/src/test/java/com/xxl/job/admin/util/PropertiesUtilTest.java @@ -0,0 +1,18 @@ +package com.xxl.job.admin.util; + +import com.xxl.job.admin.core.util.PropertiesUtil; +import org.junit.Test; + +/** + * prop util test + * + * @author xuxueli 2017-12-25 15:17:36 + */ +public class PropertiesUtilTest { + + @Test + public void registryTest() throws Exception { + System.out.println(PropertiesUtil.getString("xxl.job.login.username")); + } + +} diff --git a/xxl-job-admin/src/test/java/com/xxl/job/dao/impl/AdminBizTest.java b/xxl-job-admin/src/test/java/com/xxl/job/adminbiz/AdminBizTest.java similarity index 98% rename from xxl-job-admin/src/test/java/com/xxl/job/dao/impl/AdminBizTest.java rename to xxl-job-admin/src/test/java/com/xxl/job/adminbiz/AdminBizTest.java index 6ccea517..ae2f559d 100644 --- a/xxl-job-admin/src/test/java/com/xxl/job/dao/impl/AdminBizTest.java +++ b/xxl-job-admin/src/test/java/com/xxl/job/adminbiz/AdminBizTest.java @@ -1,4 +1,4 @@ -package com.xxl.job.dao.impl; +package com.xxl.job.adminbiz; import com.xxl.job.core.biz.AdminBiz; import com.xxl.job.core.biz.model.RegistryParam; From fa1ed59b8d673844e4d8707a5ae32ac72edf28ce Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Mon, 25 Dec 2017 16:41:02 +0800 Subject: [PATCH 93/93] =?UTF-8?q?clean=20code;=20=E5=8D=87=E7=BA=A7?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=E7=89=88=E6=9C=AC=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xxl-job-executor-sample-jfinal/pom.xml | 2 +- .../mvc/controller/IndexController.java | 36 +++++++++---------- .../service/jobhandler/DemoJobHandler.java | 10 +++--- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/pom.xml b/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/pom.xml index 2e6a68ce..17444ffb 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/pom.xml +++ b/xxl-job-executor-samples/xxl-job-executor-sample-jfinal/pom.xml @@ -16,7 +16,7 @@ com.jfinal jfinal - 2.0 + 2.2 diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/mvc/controller/IndexController.java b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/mvc/controller/IndexController.java index 1851d54f..37c90719 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/mvc/controller/IndexController.java +++ b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/mvc/controller/IndexController.java @@ -1,18 +1,18 @@ -package com.xxl.job.executor.mvc.controller; - -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; - -@Controller -@EnableAutoConfiguration -public class IndexController { - - @RequestMapping("/") - @ResponseBody - String index() { - return "xxl job executor running."; - } - -} \ No newline at end of file +//package com.xxl.job.executor.mvc.controller; +// +//import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +//import org.springframework.stereotype.Controller; +//import org.springframework.web.bind.annotation.RequestMapping; +//import org.springframework.web.bind.annotation.ResponseBody; +// +//@Controller +//@EnableAutoConfiguration +//public class IndexController { +// +// @RequestMapping("/") +// @ResponseBody +// String index() { +// return "xxl job executor running."; +// } +// +//} \ No newline at end of file diff --git a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java index 79b95c7d..01b4db84 100644 --- a/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java +++ b/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/DemoJobHandler.java @@ -4,7 +4,7 @@ import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.handler.IJobHandler; import com.xxl.job.core.handler.annotation.JobHandler; import com.xxl.job.core.log.XxlJobLogger; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Component; import java.util.concurrent.TimeUnit; @@ -13,15 +13,15 @@ import java.util.concurrent.TimeUnit; * 任务Handler的一个Demo(Bean模式) * * 开发步骤: - * 1、继承 “IJobHandler” ; - * 2、装配到Spring,例如加 “@Service” 注解; - * 3、加 “@JobHandler” 注解,注解value值为新增任务生成的JobKey的值;多个JobKey用逗号分割; + * 1、新建一个继承com.xxl.job.core.handler.IJobHandler的Java类; + * 2、该类被Spring容器扫描为Bean实例,如加“@Component”注解; + * 3、添加 “@JobHandler(value="自定义jobhandler名称")”注解,注解的value值为自定义的JobHandler名称,该名称对应的是调度中心新建任务的JobHandler属性的值。 * 4、执行日志:需要通过 "XxlJobLogger.log" 打印执行日志; * * @author xuxueli 2015-12-19 19:43:36 */ @JobHandler(value="demoJobHandler") -@Service +@Component public class DemoJobHandler extends IJobHandler { @Override

-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 j|wC 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