ソースを参照

Merge pull request #1 from xuxueli/master

Mrwb 8 年 前
コミット
3fda544884
共有52 個のファイルを変更した740 個の追加433 個の削除を含む
  1. 11 0
      .github/ISSUE_TEMPLATE
  2. 14 0
      .github/PULL_REQUEST_TEMPLATE
  3. 61 54
      README.md
  4. 11 0
      doc/XXL-JOB-Englis-Documentation.md
  5. 77 34
      doc/XXL-JOB官方文档.md
  6. 32 1
      pom.xml
  7. 23 26
      xxl-job-admin/pom.xml
  8. 2 1
      xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java
  9. 3 1
      xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java
  10. 11 7
      xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java
  11. 0 28
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouter.java
  12. 4 3
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteBusyover.java
  13. 2 1
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteConsistentHash.java
  14. 4 3
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFailover.java
  15. 2 2
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFirst.java
  16. 2 1
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLFU.java
  17. 2 1
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLRU.java
  18. 2 2
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLast.java
  19. 2 1
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRandom.java
  20. 2 1
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRound.java
  21. 161 73
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/schedule/XxlJobDynamicScheduler.java
  22. 1 1
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java
  23. 1 1
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryMonitorHelper.java
  24. 29 3
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java
  25. 1 0
      xxl-job-admin/src/main/resources/spring/applicationcontext-xxl-job-admin.xml
  26. 5 2
      xxl-job-admin/src/main/resources/xxl-job-admin.properties
  27. 4 3
      xxl-job-admin/src/main/webapp/WEB-INF/template/common/common.macro.ftl
  28. 4 23
      xxl-job-admin/src/main/webapp/WEB-INF/template/help.ftl
  29. 2 2
      xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl
  30. 7 0
      xxl-job-admin/src/main/webapp/static/js/jobinfo.index.1.js
  31. 32 0
      xxl-job-admin/src/test/java/com/xxl/job/dao/impl/AdminBizTest.java
  32. 10 14
      xxl-job-core/pom.xml
  33. 2 0
      xxl-job-core/src/main/java/com/xxl/job/core/biz/AdminBiz.java
  34. 86 51
      xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java
  35. 5 5
      xxl-job-core/src/main/java/com/xxl/job/core/glue/GlueFactory.java
  36. 3 4
      xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java
  37. 5 5
      xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobFileAppender.java
  38. 30 7
      xxl-job-core/src/main/java/com/xxl/job/core/rpc/codec/RpcRequest.java
  39. 6 3
      xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/NetComClientProxy.java
  40. 10 2
      xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/NetComServerFactory.java
  41. 2 2
      xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/jetty/client/JettyClient.java
  42. 17 1
      xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/jetty/server/JettyServer.java
  43. 2 9
      xxl-job-core/src/main/java/com/xxl/job/core/thread/ExecutorRegistryThread.java
  44. 2 6
      xxl-job-core/src/main/java/com/xxl/job/core/thread/TriggerCallbackThread.java
  45. 2 2
      xxl-job-core/src/main/java/com/xxl/job/core/util/ScriptUtil.java
  46. 3 21
      xxl-job-executor-example/pom.xml
  47. 2 0
      xxl-job-executor-example/src/main/resources/applicationcontext-xxl-job.xml
  48. 4 1
      xxl-job-executor-example/src/main/resources/xxl-job-executor.properties
  49. 4 1
      xxl-job-executor-example/src/test/java/com/xxl/executor/test/DemoJobHandlerTest.java
  50. 25 24
      xxl-job-executor-springboot-example/pom.xml
  51. 3 0
      xxl-job-executor-springboot-example/src/main/java/com/xxl/job/executor/core/config/XxlJobConfig.java
  52. 3 0
      xxl-job-executor-springboot-example/src/main/resources/application.properties

+ 11 - 0
.github/ISSUE_TEMPLATE ファイルの表示

@@ -0,0 +1,11 @@
1
+Please answer some questions before submitting your issue. Thanks!
2
+
3
+### Which version of XXL-JOB do you using?
4
+
5
+### Expected behavior
6
+
7
+### Actual behavior
8
+
9
+### Steps to reproduce the behavior
10
+
11
+### Other information

+ 14 - 0
.github/PULL_REQUEST_TEMPLATE ファイルの表示

@@ -0,0 +1,14 @@
1
+**What kind of change does this PR introduce?** (check at least one)
2
+
3
+- [ ] Bugfix
4
+- [ ] Feature
5
+- [ ] Code style update
6
+- [ ] Refactor
7
+- [ ] Build-related changes
8
+- [ ] Other, please describe:
9
+
10
+
11
+**The description of the PR:**
12
+
13
+
14
+**Other information:**

+ 61 - 54
README.md ファイルの表示

@@ -1,21 +1,48 @@
1
-
2
-# 分布式任务调度平台XXL-JOB
3
-
4
-[![Build Status](https://travis-ci.org/xuxueli/xxl-job.svg?branch=master)](https://travis-ci.org/xuxueli/xxl-job)
5
-[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.xuxueli/xxl-job/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.xuxueli/xxl-job/)
6
-[![GitHub release](https://img.shields.io/github/release/xuxueli/xxl-job.svg)](https://github.com/xuxueli/xxl-job/releases)
7
-[![License](https://img.shields.io/badge/license-GPLv3-blue.svg)](http://www.gnu.org/licenses/gpl-3.0.html)
8
-[![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)
1
+<p align="center">
2
+    <a href="http://www.xuxueli.com/">
3
+        <img src="https://raw.githubusercontent.com/xuxueli/xxl-job/master/doc/images/xxl-logo.jpg" width="150">
4
+    </a>
5
+    <h3 align="center">XXL-JOB</h3>
6
+    <p align="center">
7
+        XXL-JOB, a lightweight distributed task scheduling framework.
8
+        <br>
9
+        <a href="http://www.xuxueli.com/"><strong>-- Browse xuxueli's website. --</strong></a>
10
+        <br>
11
+        <br>
12
+        <a href="https://travis-ci.org/xuxueli/xxl-job">
13
+            <img src="https://travis-ci.org/xuxueli/xxl-job.svg?branch=master" >
14
+        </a>
15
+        <a href="https://maven-badges.herokuapp.com/maven-central/com.xuxueli/xxl-job/">
16
+            <img src="https://maven-badges.herokuapp.com/maven-central/com.xuxueli/xxl-job/badge.svg" >
17
+        </a>
18
+         <a href="https://github.com/xuxueli/xxl-job/releases">
19
+             <img src="https://img.shields.io/github/release/xuxueli/xxl-job.svg" >
20
+         </a>
21
+         <a href="http://www.gnu.org/licenses/gpl-3.0.html">
22
+             <img src="https://img.shields.io/badge/license-GPLv3-blue.svg" >
23
+         </a>
24
+         <a href="https://gitter.im/xuxueli/xxl-job?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge">
25
+              <img src="https://badges.gitter.im/xuxueli/xxl-job.svg" >
26
+          </a>
27
+    </p>    
28
+</p>
29
+
30
+
31
+## Intro
32
+XXL-JOB is a lightweight distributed task scheduling framework. 
33
+It's core design goal is to develop quickly and learn simple, lightweight, and easy to expand. 
34
+Now, it's already open source, and many companies use it in production environments, real "out-of-the-box".
9 35
 
10 36
 XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
11 37
 
12
-![输入图片说明](https://raw.githubusercontent.com/xuxueli/xxl-job/master/doc/images/xxl-logo.jpg "在这里输入图片标题")
13 38
 
14
-### 文档
39
+## Documentation
40
+
41
+- [中文文档](https://github.com/xuxueli/xxl-job/blob/master/doc/XXL-JOB官方文档.md)
42
+- [Englis Documentation](https://github.com/xuxueli/xxl-job/blob/master/doc/XXL-JOB-Englis-Documentation.md)
15 43
 
16
-- 官方文档:[XXL-JOB官方文档](https://github.com/xuxueli/xxl-job/blob/master/doc/XXL-JOB官方文档.md)
17 44
 
18
-### 特性
45
+## Features
19 46
 - 1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手;
20 47
 - 2、动态:支持动态修改任务状态、暂停/恢复任务,以及终止运行中任务,即时生效;
21 48
 - 3、调度中心HA(中心式):调度采用中心式设计,“调度中心”基于集群Quartz实现,可保证调度中心HA;
@@ -41,11 +68,8 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是
41 68
 - 23、分片广播任务:执行器集群部署时,任务路由策略选择"分片广播"情况下,一次任务调度将会广播触发对应集群中所有执行器执行一次任务,同时传递分片参数;可根据分片参数开发分片任务;
42 69
 - 24、动态分片:分片广播任务以执行器为维度进行分片,支持动态扩容执行器集群从而动态增加分片数量,协同进行业务处理;在进行大数据量业务操作时可显著提升任务处理能力和速度。
43 70
 
44
-### 架构图
45 71
 
46
-![输入图片说明](https://static.oschina.net/uploads/img/201707/17190028_aEE2.png "在这里输入图片标题")
47
-
48
-### 发展
72
+## Development
49 73
 于2015年中,我在github上创建XXL-JOB项目仓库并提交第一个commit,随之进行系统结构设计,UI选型,交互设计……
50 74
 
51 75
 于2015-11月,XXL-JOB终于RELEASE了第一个大版本V1.0, 随后我将之发布到OSCHINA,XXL-JOB在OSCHINA上获得了@红薯的热门推荐,同期分别达到了OSCHINA的“热门动弹”排行第一和git.oschina的开源软件月热度排行第一,在此特别感谢红薯,感谢大家的关注和支持。
@@ -56,7 +80,7 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是
56 80
 
57 81
 于2017-05-13,在上海举办的 "[第62期开源中国源创会](https://www.oschina.net/event/2236961)" 的 "放码过来" 环节,我登台对XXL-JOB做了演讲,台下五百位在场观众反响热烈([图文回顾](https://www.oschina.net/question/2686220_2242120) )。
58 82
 
59
-#### 我司大众点评目前已接入XXL-JOB,内部别名《Ferrari》(Ferrari基于XXL-JOB的V1.1版本定制而成,新接入应用推荐升级最新版本)。
83
+** 我司大众点评目前已接入XXL-JOB,内部别名《Ferrari》(Ferrari基于XXL-JOB的V1.1版本定制而成,新接入应用推荐升级最新版本)。**
60 84
 据最新统计, 自2016-01-21接入至2017-07-07期间,该系统已调度约60万余次,表现优异。新接入应用推荐使用最新版本,因为经过数个大版本的更新,系统的任务模型、UI交互模型以及底层调度通讯模型都有了较大的优化和提升,核心功能更加稳定高效。
61 85
 
62 86
 至今,XXL-JOB已接入多家公司的线上产品线,接入场景如电商业务,O2O业务和大数据作业等,截止2016-07-19为止,XXL-JOB已接入的公司包括不限于:
@@ -94,60 +118,43 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是
94 118
 	- 31、四川互宜达科技有限公司
95 119
     - 32、钱包行云(北京)科技有限公司
96 120
     - 33、重庆欣才集团
121
+    - 34、咪咕互动娱乐有限公司(中国移动)
122
+    - 35、北京诺亦腾科技有限公司
123
+    - 36、增长引擎(北京)信息技术有限公司
97 124
 	- ……
98 125
 
99 126
 欢迎大家的关注和使用,XXL-JOB也将拥抱变化,持续发展。
100 127
 
101 128
 
102
-### 下载
103
-
104
-#### 源码仓库地址 (将会在两个git仓库同步发布最新代码)
105
-
106
-源码仓库地址 | Release Download
107
---- | ---
108
-[https://github.com/xuxueli/xxl-job](https://github.com/xuxueli/xxl-job) | [Download](https://github.com/xuxueli/xxl-job/releases)  
109
-[http://git.oschina.net/xuxueli0323/xxl-job](http://git.oschina.net/xuxueli0323/xxl-job) | [Download](http://git.oschina.net/xuxueli0323/xxl-job/releases)
110
-
111
-
112
-#### 中央仓库地址 (最新Release版本:1.8.0)
113
-
114
-```
115
-<!-- http://repo1.maven.org/maven2/com/xuxueli/xxl-job-core/ -->
116
-<dependency>
117
-    <groupId>com.xuxueli</groupId>
118
-    <artifactId>xxl-job-core</artifactId>
119
-    <version>1.8.0</version>
120
-</dependency>
121
-```
122
-
123
-#### 博客地址 (将会在两个博客同步更新文档)
124
-
125
-- [oschina地址](http://my.oschina.net/xuxueli/blog/690978)
126
-- [cnblogs地址](http://www.cnblogs.com/xuxueli/p/5021979.html)
129
+## Communication
127 130
 
128
-#### 技术交流群 (仅作技术交流)
131
+- 腾讯QQ群(6):399758605
132
+- 腾讯QQ群(5):138274130    (群即将满,请加群6)
133
+- 腾讯QQ群(4):464762661    (群即将满,请加群6)
134
+- 腾讯QQ群(3):242151780    (群即将满,请加群6)
135
+- 腾讯QQ群(2):438249535    (群即将满,请加群6)
136
+- 腾讯QQ群(1):367260654    (群即将满,请加群6)
137
+- [Gitter](https://gitter.im/xuxueli/xxl-job)
129 138
 
130 139
 
131
-- 群5:138274130      [![image](http://pub.idqqimg.com/wpa/images/group.png)](http://shang.qq.com/wpa/qunwpa?idkey=a3f3aea7e5943e7a24e9726495747ddc19bccd3592d7a70ecb5a97b616062241 )
132
-- 群4:464762661    (群即将满,请加群5)
133
-- 群3:242151780    (群即将满,请加群5)
134
-- 群2:438249535    (群即将满,请加群5)
135
-- 群1:367260654    (群即将满,请加群5)
140
+## Issue
141
+如有问题可在 [Github Issues](https://github.com/xuxueli/xxl-job/issues/) 上提问,也可以加入上文技术交流群;
136 142
 
137 143
 
138
-### 报告问题
139
-XXL-JOB托管在Github上,如有问题可在 [ISSUES](https://github.com/xuxueli/xxl-job/issues/) 上提问,也可以加入上文技术交流群;
144
+## User Registration
145
+登记仅为了产品推广,产品开源免费。   
146
+请接入使用的公司或个人进行用户登记 [登记地址](https://github.com/xuxueli/xxl-job/issues/1 ) 。
140 147
 
141
-### 接入登记(登记仅为了推广,产品开源免费)
142
-更多接入公司,欢迎在github [登记](https://github.com/xuxueli/xxl-job/issues/1 )
143 148
 
144
-### 开源协议
149
+## Copyright and license
145 150
 产品开源免费,并且将持续提供免费的社区技术支持。个人或企业内部可自由的接入和使用。
146 151
 
147 152
 XXL-JOB采用GPLv3协议,目的是为了保证用户的自由使用权利。协议可避免专利申请的特殊危险 "the GPL assures that patents cannot be used to render the program non-free.(摘自GPLv3)"。  
153
+Copyright (c) 2015-present, xuxueli.
148 154
 
149 155
 ---
150
-### 支持的话可以扫一扫,支持 [XXL系列](https://github.com/xuxueli) 的建设:)
156
+## Donate
157
+支持的话可以扫一扫,请作者喝杯咖啡吧:)
151 158
 
152 159
 微信:![输入图片说明](https://static.oschina.net/uploads/img/201707/07214300_qhxT.png "在这里输入图片标题")
153 160
 支付宝:![输入图片说明](http://images2015.cnblogs.com/blog/554415/201605/554415-20160513183306234-1939652116.png "在这里输入图片标题")

+ 11 - 0
doc/XXL-JOB-Englis-Documentation.md ファイルの表示

@@ -0,0 +1,11 @@
1
+# 《A lightweight distributed task scheduling framework. "XXL-JOB"》
2
+
3
+[![Build Status](https://travis-ci.org/xuxueli/xxl-job.svg?branch=master)](https://travis-ci.org/xuxueli/xxl-job)
4
+[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.xuxueli/xxl-job/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.xuxueli/xxl-job/)
5
+[![GitHub release](https://img.shields.io/github/release/xuxueli/xxl-job.svg)](https://github.com/xuxueli/xxl-job/releases)
6
+[![License](https://img.shields.io/badge/license-GPLv3-blue.svg)](http://www.gnu.org/licenses/gpl-3.0.html)
7
+[![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)
8
+
9
+## 1、Intro
10
+
11
+### 1.1 overview

+ 77 - 34
doc/XXL-JOB官方文档.md ファイルの表示

@@ -86,13 +86,16 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是
86 86
 	- 31、四川互宜达科技有限公司
87 87
 	- 32、钱包行云(北京)科技有限公司
88 88
 	- 33、重庆欣才集团
89
+    - 34、咪咕互动娱乐有限公司(中国移动)
90
+    - 35、北京诺亦腾科技有限公司
91
+    - 36、增长引擎(北京)信息技术有限公司
89 92
 	- ……
90 93
 
91 94
 欢迎大家的关注和使用,XXL-JOB也将拥抱变化,持续发展。
92 95
 
93 96
 ### 1.4 下载
94 97
 
95
-#### 源码仓库地址 (将会在两个git仓库同步发布最新代码)
98
+#### 源码仓库地址
96 99
 
97 100
 源码仓库地址 | Release Download
98 101
 --- | ---
@@ -100,35 +103,36 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是
100 103
 [http://git.oschina.net/xuxueli0323/xxl-job](http://git.oschina.net/xuxueli0323/xxl-job) | [Download](http://git.oschina.net/xuxueli0323/xxl-job/releases)
101 104
 
102 105
 
103
-#### 中央仓库地址 (最新Release版本:1.8.0)
106
+#### 中央仓库地址
104 107
 
105 108
 ```
106 109
 <!-- http://repo1.maven.org/maven2/com/xuxueli/xxl-job-core/ -->
107 110
 <dependency>
108 111
     <groupId>com.xuxueli</groupId>
109 112
     <artifactId>xxl-job-core</artifactId>
110
-    <version>1.8.0</version>
113
+    <version>1.8.1</version>
111 114
 </dependency>
112 115
 ```
113 116
 
114
-#### 博客地址 (将会在两个博客同步更新文档)
117
+#### 博客地址
115 118
 
116 119
 - [oschina地址](http://my.oschina.net/xuxueli/blog/690978)
117 120
 - [cnblogs地址](http://www.cnblogs.com/xuxueli/p/5021979.html)
118 121
 
119
-#### 技术交流群 (仅作技术交流)
122
+#### 技术交流
120 123
 
121
-- 群5:138274130      [![image](http://pub.idqqimg.com/wpa/images/group.png)](http://shang.qq.com/wpa/qunwpa?idkey=a3f3aea7e5943e7a24e9726495747ddc19bccd3592d7a70ecb5a97b616062241 )
122
-- 群4:464762661    (群即将满,请加群5)
123
-- 群3:242151780    (群即将满,请加群5)
124
-- 群2:438249535    (群即将满,请加群5)
125
-- 群1:367260654    (群即将满,请加群5)
124
+- 腾讯QQ群(6):399758605
125
+- 腾讯QQ群(5):138274130    (群即将满,请加群6)
126
+- 腾讯QQ群(4):464762661    (群即将满,请加群6)
127
+- 腾讯QQ群(3):242151780    (群即将满,请加群6)
128
+- 腾讯QQ群(2):438249535    (群即将满,请加群6)
129
+- 腾讯QQ群(1):367260654    (群即将满,请加群6)
126 130
 
127 131
 ### 1.5 环境
128 132
 - JDK:1.7+
129 133
 - Servlet/JSP Spec:3.1/2.3
130
-- Tomcat:8.5.x/Jetty9.2
131
-- Spring-boot:1.3.8/Spring4.x
134
+- Tomcat:8.5.x/Jetty9.2.x
135
+- Spring-boot:1.5.x/Spring4.x
132 136
 - Mysql:5.6+
133 137
 - Maven:3+
134 138
 
@@ -136,18 +140,18 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是
136 140
 ## 二、快速入门
137 141
 
138 142
 ### 2.1 初始化“调度数据库”
139
-请下载项目源码并解压,获取 "调度数据库初始化SQL脚本" 并执行即可。正常情况下应该生成16张表,脚本文件位置为:
143
+请下载项目源码并解压,获取 "调度数据库初始化SQL脚本" 并执行即可,正常情况下应该生成16张表。
140 144
 
141
-    源码解压根目录\xxl-job\db\tables_xxl_job.sql
145
+"调度数据库初始化SQL脚本" 位置为:
146
+
147
+    /xxl-job/db/tables_xxl_job.sql
142 148
 
143 149
 调度中心支持集群部署,集群情况下各节点务必连接同一个mysql实例;
144 150
 
145 151
 如果mysql做主从,调度中心集群节点务必强制走主库;
146 152
 
147 153
 ### 2.2 编译源码
148
-解压源码,按照maven格式将源码导入IDE, 使用maven进行编译即可,源码结构如下图所示:
149
-
150
-![输入图片说明](https://static.oschina.net/uploads/img/201705/11214348_aGgr.png "在这里输入图片标题")
154
+解压源码,按照maven格式将源码导入IDE, 使用maven进行编译即可,源码结构如下:
151 155
 
152 156
     xxl-job-admin:调度中心
153 157
     xxl-job-core:公共依赖
@@ -160,14 +164,16 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是
160 164
     作用:统一管理任务调度平台上调度任务,负责触发调度执行。
161 165
 
162 166
 #### 步骤一:调度中心配置:
163
-配置文件以及配置属性如下图所示。
167
+调度中心配置文件地址:
164 168
 
165
-![输入图片说明](https://static.oschina.net/uploads/img/201705/11214752_Ifvp.png "在这里输入图片标题")
169
+    /xxl-job/xxl-job-admin/src/main/resources/xxl-job-admin.properties
166 170
 
167 171
 
172
+调度中心配置内容说明:
173
+
168 174
     ### 调度中心JDBC链接:链接地址请保持和 2.1章节 所创建的调度数据库的地址一致
169 175
     xxl.job.db.driverClass=com.mysql.jdbc.Driver
170
-    xxl.job.db.url=jdbc:mysql://localhost:3306/xxl-job?useUnicode=true&amp;characterEncoding=UTF-8
176
+    xxl.job.db.url=jdbc:mysql://localhost:3306/xxl-job?useUnicode=true&characterEncoding=UTF-8
171 177
     xxl.job.db.user=root
172 178
     xxl.job.db.password=root_pwd
173 179
     
@@ -179,9 +185,12 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是
179 185
     xxl.job.mail.sendFrom=ovono802302@163.com
180 186
     xxl.job.mail.sendNick=《任务调度平台XXL-JOB》
181 187
     
182
-    # 登录账号
188
+    ### 登录账号
183 189
     xxl.job.login.username=admin
184 190
     xxl.job.login.password=123456
191
+    
192
+    ### 调度中心通讯TOKEN,非空时启用
193
+    xxl.job.accessToken=
185 194
 
186 195
 #### 步骤二:部署项目:
187 196
 如果已经正确进行上述配置,可将项目编译打war包并部署到tomcat中。
@@ -191,6 +200,13 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是
191 200
 
192 201
 至此“调度中心”项目已经部署成功。
193 202
 
203
+#### 步骤三:调度中心集群(可选):
204
+调度中心支持集群部署,提升调度系统可用性。
205
+
206
+集群部署唯一要求为:保证每个集群节点配置(db和登陆账号等)保持一致。调度中心通过db配置区分不同集群。
207
+
208
+调度中心在集群部署时可通过nginx负载均衡,此时可以为集群分配一个域名。该域名一方面可以用于访问,另一方面也可以用于配置执行器回调地址。
209
+
194 210
 ### 2.4 配置部署“执行器项目”
195 211
 
196 212
     “执行器”项目:xxl-job-executor-example (如新建执行器项目,可参考该Example执行器项目的配置步骤;)
@@ -200,10 +216,11 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是
200 216
 确认pom文件中引入了 "xxl-job-core" 的maven依赖;
201 217
     
202 218
 #### 步骤二:执行器配置
203
-配置文件以及配置属性如下图所示。
219
+执行器配置配置文件地址:
204 220
 
205
-![输入图片说明](https://static.oschina.net/uploads/img/201705/11214800_7G3o.png "在这里输入图片标题")
221
+    /xxl-job/xxl-job-executor-example/src/main/resources/xxl-job-executor.properties
206 222
 
223
+执行器配置配置内容说明:
207 224
 
208 225
     ### xxl-job admin address list:调度中心部署跟地址:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调"。
209 226
     xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
@@ -215,6 +232,9 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是
215 232
     
216 233
     ### xxl-job log path:执行器运行日志文件存储的磁盘位置
217 234
     xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler/
235
+    
236
+    ### xxl-job, access token:执行器通讯TOKEN,非空时启用
237
+    xxl.job.accessToken=
218 238
 
219 239
 
220 240
 #### 步骤三:执行器组件配置
@@ -225,7 +245,7 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是
225 245
     1、JobHandler 扫描路径:自动扫描容器中JobHandler;
226 246
     2、执行器Excutor配置:执行器核心配置;
227 247
 
228
-#### 步骤四:部署项目:
248
+#### 步骤四:部署执行器项目:
229 249
 如果已经正确进行上述配置,可将执行器项目编译打部署,系统提供两个执行器example项目,选择其中一个即可,各自的部署方式如下。
230 250
 
231 251
     xxl-job-executor-example:项目编译打包成WAR包,并部署到tomcat中。
@@ -233,6 +253,11 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是
233 253
 
234 254
 至此“执行器”项目已经部署结束。
235 255
 
256
+#### 步骤五:执行器集群(可选):
257
+执行器支持集群部署,提升调度系统可用性,同时提升任务处理能力。
258
+
259
+集群部署唯一要求为:保证集群中每个执行器的配置项 "xxl.job.admin.addresses/调度中心地址" 保持一致,执行器根据该配置进行执行器自动注册等操作。 
260
+
236 261
 
237 262
 ### 2.5 开发第一个任务“Hello World”       
238 263
 本示例以新建一个 “GLUE模式(Java)” 运行模式的任务为例。更多有关任务的详细配置,请查看“章节三:任务详解”。
@@ -706,6 +731,16 @@ XXL-JOB会为每次调度请求生成一个单独的日志文件,需要通过
706 731
 - 1、分片任务场景:10个执行器的集群来处理10w条数据,每台机器只需要处理1w条数据,耗时降低10倍;
707 732
 - 2、广播任务场景:广播执行器机器运行shell脚本、广播集群节点进行缓存更新等
708 733
 
734
+#### 5、10 访问令牌(AccessToken)
735
+为提升系统安全性,调度中心和执行器进行安全性校验,双方AccessToken匹配才允许通讯;
736
+
737
+调度中心和执行器,可通过配置项 "xxl.job.accessToken" 进行AccessToken的设置。
738
+
739
+调度中心和执行器,如果需要正常通讯,只有两种设置;
740
+
741
+- 设置一:调度中心和执行器,均不设置AccessToken;关闭安全性校验;
742
+- 设置二:调度中心和执行器,设置了相同的AccessToken;
743
+
709 744
 
710 745
 ## 六、版本更新日志
711 746
 #### 6.1 版本 V1.1.x,新特性[2015-12-05]
@@ -896,41 +931,49 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段
896 931
 - 10、执行日志,支持根据运行 "状态" 筛选日志;
897 932
 - 11、调度中心任务注册检测逻辑优化;
898 933
 
899
-#### 6.18 版本 V1.8.1 特性[快照版本]
934
+#### 6.18 版本 V1.8.1 特性[2017-07-30]
900 935
 - 1、分片广播任务:执行器集群部署时,任务路由策略选择"分片广播"情况下,一次任务调度将会广播触发集群中所有执行器执行一次任务,可根据分片参数处理分片任务;
901 936
 - 2、动态分片:分片广播任务以执行器为维度进行分片,支持动态扩容执行器集群从而动态增加分片数量,协同进行业务处理;在进行大数据量业务操作时可显著提升任务处理能力和速度。
902 937
 - 3、执行器JobHandler禁止命名冲突;
903 938
 - 4、执行器集群地址列表进行自然排序;
904 939
 - 5、调度中心,DAO层代码精简优化并且新增测试用例覆盖;
905 940
 - 6、调度中心API服务改为自研RPC形式,统一底层通讯模型;
941
+- 7、新增调度中心API服务测试Demo,方便在调度中心API扩展和测试;
942
+- 8、任务列表页交互优化,更换执行器分组时自动刷新任务列表,新建任务时默认定位在当前执行器位置;
943
+- 9、访问令牌(accessToken):为提升系统安全性,调度中心和执行器进行安全性校验,双方AccessToken匹配才允许通讯;
944
+- 10、springboot版本执行器,升级至1.5.6.RELEASE版本;
945
+- 11、统一maven依赖版本管理;
906 946
 
907 947
 #### TODO LIST
908 948
 - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限;
909
-- 2、任务分片路由:分片采用一致性Hash算法计算出尽量稳定的分片顺序,即使注册机器存在波动也不会引起分批分片顺序大的波动;
910
-- 3、失败重试优化:目前失败重试逻辑为,在本次调度请求失败后重新执行一次请求逻辑。优化点为针对调度和执行失败时均做失败重试,重试时重新触发一次完整调度,这将可能导致失败是调度死循环,考虑中。
949
+- 2、任务分片路由:分片采用一致性Hash算法计算出尽量稳定的分片顺序,即使注册机器存在波动也不会引起分批分片顺序大的波动;目前采用IP自然排序,可以满足需求,待定;
950
+- 3、失败重试优化:目前失败重试逻辑为,在本次调度请求失败后重新执行一次请求逻辑。优化点为针对调度和执行失败时均做失败重试,重试时重新触发一次完整调度,这将可能导致失败是调度死循环,待定
911 951
 - 4、回调失败写文件,查看日志时读文件确认,重启后回调确认;
912 952
 - 5、任务依赖,流程图,子任务+会签任务,各节点日志;
913 953
 - 6、调度任务优先级;
914 954
 - 7、移除quartz依赖,重写调度模块:新增或恢复任务时将下次执行记录插入delayqueue,调度中心集群竞争分布式锁,成功节点批量加载到期delayqueue数据,批量执行。
915
-- 8、任务执行结果回调失败后重试:待定,防止回调死循环
916
-- 9、springboot 和 docker镜像,并且推送docker镜像到中央仓库,更进一步实现产品开箱即用;
917
-- 10、安全校验:调度中心和执行器约定公共密匙,只有密匙一致才允许相互通讯;
955
+- 8、springboot 和 docker镜像,并且推送docker镜像到中央仓库,更进一步实现产品开箱即用
956
+- 9、国际化:调度中心界面 + 官方文档,新增英文版本。
957
+- 10、执行器摘除:执行器销毁时,主动通知调度中心并摘除对应执行器节点,提高执行器状态感知的时效性。
918 958
 
919 959
 ## 七、其他
920 960
 
921 961
 #### 7.1 报告问题
922 962
 XXL-JOB托管在Github上,如有问题可在 [ISSUES](https://github.com/xuxueli/xxl-job/issues/) 上提问,也可以加入上文技术交流群;
923 963
 
924
-#### 7.2 接入登记(登记仅为了推广,产品开源免费)
925
-更多接入公司,欢迎在github [登记](https://github.com/xuxueli/xxl-job/issues/1 )
964
+#### 7.2 用户接入登记
965
+登记仅为了产品推广,产品开源免费。   
966
+请接入使用的公司或个人进行用户登记 [登记地址](https://github.com/xuxueli/xxl-job/issues/1 ) 。
926 967
 
927
-#### 7.3 开源协议
968
+#### 7.3 开源协议和版权
928 969
 产品开源免费,并且将持续提供免费的社区技术支持。个人或企业内部可自由的接入和使用。
929 970
 
930 971
 XXL-JOB采用GPLv3协议,目的是为了保证用户的自由使用权利。协议可避免专利申请的特殊危险 "the GPL assures that patents cannot be used to render the program non-free.(摘自GPLv3)"。  
972
+Copyright (c) 2015-present, xuxueli.
931 973
 
932 974
 ---
933
-#### 支持的话可以扫一扫,支持 [XXL系列](https://github.com/xuxueli) 的建设:)
975
+#### 捐赠
976
+支持的话可以扫一扫,请作者喝杯咖啡吧:)
934 977
 
935 978
 微信:![输入图片说明](https://static.oschina.net/uploads/img/201707/07214300_qhxT.png "在这里输入图片标题")
936 979
 支付宝:![输入图片说明](http://images2015.cnblogs.com/blog/554415/201605/554415-20160513183306234-1939652116.png "在这里输入图片标题")

+ 32 - 1
pom.xml ファイルの表示

@@ -3,7 +3,7 @@
3 3
 	<modelVersion>4.0.0</modelVersion>
4 4
 	<groupId>com.xuxueli</groupId>
5 5
 	<artifactId>xxl-job</artifactId>
6
-	<version>1.8.1-SNAPSHOT</version>
6
+	<version>1.8.2-SNAPSHOT</version>
7 7
 	<packaging>pom</packaging>
8 8
 
9 9
 	<name>${project.artifactId}</name>
@@ -17,6 +17,37 @@
17 17
         <module>xxl-job-executor-springboot-example</module>
18 18
     </modules>
19 19
 
20
+	<properties>
21
+		<javax.servlet-api.version>3.0.1</javax.servlet-api.version>
22
+		<jsp-api.version>2.2</jsp-api.version>
23
+
24
+		<spring.version>3.2.18.RELEASE</spring.version>
25
+		<jackson-mapper-asl.version>1.9.13</jackson-mapper-asl.version>
26
+		<aspectjweaver.version>1.8.7</aspectjweaver.version>
27
+		<slf4j-api.version>1.7.25</slf4j-api.version>
28
+		<freemarker.version>2.3.20</freemarker.version>
29
+		<junit.version>4.11</junit.version>
30
+
31
+		<jetty-server.version>9.2.22.v20170606</jetty-server.version>
32
+		<hessian.version>4.0.38</hessian.version>
33
+		<httpclient.version>4.3.6</httpclient.version>
34
+
35
+		<commons-exec.version>1.3</commons-exec.version>
36
+		<commons-beanutils.version>1.9.2</commons-beanutils.version>
37
+		<commons-lang.version>2.6</commons-lang.version>
38
+
39
+		<c3p0.version>0.9.5.2</c3p0.version>
40
+		<mysql-connector-java.version>5.1.29</mysql-connector-java.version>
41
+		<mybatis-spring.version>1.2.2</mybatis-spring.version>
42
+		<mybatis.version>3.2.8</mybatis.version>
43
+
44
+		<groovy-all.version>2.4.5</groovy-all.version>
45
+		<mail.version>1.4.6</mail.version>
46
+		<quartz.version>2.3.0</quartz.version>
47
+
48
+		<spring-boot.version>1.5.6.RELEASE</spring-boot.version>
49
+	</properties>
50
+
20 51
 	<build>
21 52
 		<plugins>
22 53
 			<plugin>

+ 23 - 26
xxl-job-admin/pom.xml ファイルの表示

@@ -4,15 +4,11 @@
4 4
 	<parent>
5 5
 		<groupId>com.xuxueli</groupId>
6 6
 		<artifactId>xxl-job</artifactId>
7
-		<version>1.8.1-SNAPSHOT</version>
7
+		<version>1.8.2-SNAPSHOT</version>
8 8
 	</parent>
9 9
 	<artifactId>xxl-job-admin</artifactId>
10 10
 	<packaging>war</packaging>
11 11
 
12
-	<properties>
13
-		<spring.version>3.2.17.RELEASE</spring.version>
14
-	</properties>
15
-
16 12
 	<dependencies>
17 13
 		<!-- springframe start -->
18 14
 		<dependency>
@@ -40,59 +36,59 @@
40 36
 		<dependency>
41 37
 			<groupId>org.aspectj</groupId>
42 38
 			<artifactId>aspectjweaver</artifactId>
43
-			<version>1.8.7</version>
39
+			<version>${aspectjweaver.version}</version>
44 40
 		</dependency>
45 41
 		<!-- jackson (support spring json) -->
46 42
 		<dependency>
47 43
 			<groupId>org.codehaus.jackson</groupId>
48 44
 			<artifactId>jackson-mapper-asl</artifactId>
49
-			<version>1.9.13</version>
45
+			<version>${jackson-mapper-asl.version}</version>
50 46
 		</dependency>
51 47
 
52 48
 		<!-- slf4j -->
53 49
 		<dependency>
54 50
 			<groupId>org.slf4j</groupId>
55 51
 			<artifactId>slf4j-log4j12</artifactId>
56
-			<version>1.7.21</version>
52
+			<version>${slf4j-api.version}</version>
57 53
 		</dependency>
58 54
 
59 55
 		<!-- freemarker -->
60 56
 		<dependency>
61 57
 			<groupId>org.freemarker</groupId>
62 58
 			<artifactId>freemarker</artifactId>
63
-			<version>2.3.20</version>
59
+			<version>${freemarker.version}</version>
64 60
 		</dependency>
65 61
 
66 62
 		<!-- commons-beanutils -->
67 63
 		<dependency>
68 64
 			<groupId>commons-beanutils</groupId>
69 65
 			<artifactId>commons-beanutils</artifactId>
70
-			<version>1.9.2</version>
66
+			<version>${commons-beanutils.version}</version>
71 67
 		</dependency>
72 68
 		<!-- commons-lang -->
73 69
 		<dependency>
74 70
 			<groupId>commons-lang</groupId>
75 71
 			<artifactId>commons-lang</artifactId>
76
-			<version>2.6</version>
72
+			<version>${commons-lang.version}</version>
77 73
 		</dependency>
78 74
 
79 75
 		<!-- servlet -->
80 76
 		<dependency>
81 77
 			<groupId>javax.servlet</groupId>
82 78
 			<artifactId>javax.servlet-api</artifactId>
83
-			<version>3.0.1</version>
79
+			<version>${javax.servlet-api.version}</version>
84 80
 		</dependency>
85 81
 		<dependency>
86 82
 			<groupId>javax.servlet.jsp</groupId>
87 83
 			<artifactId>jsp-api</artifactId>
88
-			<version>2.2</version>
84
+			<version>${jsp-api.version}</version>
89 85
 		</dependency>
90 86
 
91 87
 		<!-- junit -->
92 88
 		<dependency>
93 89
 			<groupId>junit</groupId>
94 90
 			<artifactId>junit</artifactId>
95
-			<version>4.11</version>
91
+			<version>${junit.version}</version>
96 92
 			<scope>test</scope>
97 93
 		</dependency>
98 94
 
@@ -100,45 +96,46 @@
100 96
 		<dependency>
101 97
 			<groupId>com.mchange</groupId>
102 98
 			<artifactId>c3p0</artifactId>
103
-			<version>0.9.5.2</version>
99
+			<version>${c3p0.version}</version>
100
+		</dependency>
101
+		<!-- mysql-connector -->
102
+		<dependency>
103
+			<groupId>mysql</groupId>
104
+			<artifactId>mysql-connector-java</artifactId>
105
+			<version>${mysql-connector-java.version}</version>
104 106
 		</dependency>
105 107
 		<!-- mybatis-spring -->
106 108
 		<dependency>
107 109
 			<groupId>org.mybatis</groupId>
108 110
 			<artifactId>mybatis-spring</artifactId>
109
-			<version>1.2.2</version>
111
+			<version>${mybatis-spring.version}</version>
110 112
 		</dependency>
111 113
 		<dependency>
112 114
 			<groupId>org.mybatis</groupId>
113 115
 			<artifactId>mybatis</artifactId>
114
-			<version>3.2.8</version>
115
-		</dependency>
116
-		<!-- mysql-connector -->
117
-		<dependency>
118
-			<groupId>mysql</groupId>
119
-			<artifactId>mysql-connector-java</artifactId>
120
-			<version>5.1.29</version>
116
+			<version>${mybatis.version}</version>
121 117
 		</dependency>
122 118
 
119
+
123 120
 		<!-- httpclient -->
124 121
 		<dependency>
125 122
 			<groupId>org.apache.httpcomponents</groupId>
126 123
 			<artifactId>httpclient</artifactId>
127
-			<version>4.3.6</version>
124
+			<version>${httpclient.version}</version>
128 125
 		</dependency>
129 126
 
130 127
 		<!-- javax.mail -->
131 128
 		<dependency>
132 129
 			<groupId>javax.mail</groupId>
133 130
 			<artifactId>mail</artifactId>
134
-			<version>1.4.6</version>
131
+			<version>${mail.version}</version>
135 132
 		</dependency>
136 133
 
137 134
 		<!-- quartz :quartz-2.2.3/c3p0-0.9.1.1/slf4j-api-1.6.6 -->
138 135
 		<dependency>
139 136
 			<groupId>org.quartz-scheduler</groupId>
140 137
 			<artifactId>quartz</artifactId>
141
-			<version>2.3.0</version>
138
+			<version>${quartz.version}</version>
142 139
 		</dependency>
143 140
 
144 141
 		<!-- xxl-job-core -->

+ 2 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java ファイルの表示

@@ -1,6 +1,7 @@
1 1
 package com.xxl.job.admin.controller;
2 2
 
3 3
 import com.xxl.job.admin.controller.annotation.PermessionLimit;
4
+import com.xxl.job.core.biz.AdminBiz;
4 5
 import com.xxl.job.core.rpc.codec.RpcRequest;
5 6
 import com.xxl.job.core.rpc.codec.RpcResponse;
6 7
 import com.xxl.job.core.rpc.netcom.NetComServerFactory;
@@ -46,7 +47,7 @@ public class JobApiController {
46 47
         }
47 48
     }
48 49
 
49
-    @RequestMapping("/api")
50
+    @RequestMapping(AdminBiz.MAPPING)
50 51
     @PermessionLimit(limit=false)
51 52
     public void api(HttpServletRequest request, HttpServletResponse response) throws IOException {
52 53
 

+ 3 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java ファイルの表示

@@ -33,7 +33,7 @@ public class JobInfoController {
33 33
 	private XxlJobService xxlJobService;
34 34
 	
35 35
 	@RequestMapping
36
-	public String index(Model model) {
36
+	public String index(Model model, @RequestParam(required = false, defaultValue = "-1") int jobGroup) {
37 37
 
38 38
 		// 枚举-字典
39 39
 		model.addAttribute("ExecutorRouteStrategyEnum", ExecutorRouteStrategyEnum.values());	// 路由策略-列表
@@ -44,6 +44,8 @@ public class JobInfoController {
44 44
 		// 任务组
45 45
 		List<XxlJobGroup> jobGroupList =  xxlJobGroupDao.findAll();
46 46
 		model.addAttribute("JobGroupList", jobGroupList);
47
+		model.addAttribute("jobGroup", jobGroup);
48
+
47 49
 		return "jobinfo/jobinfo.index";
48 50
 	}
49 51
 	

+ 11 - 7
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java ファイルの表示

@@ -3,6 +3,7 @@ package com.xxl.job.admin.controller;
3 3
 import com.xxl.job.admin.core.model.XxlJobGroup;
4 4
 import com.xxl.job.admin.core.model.XxlJobInfo;
5 5
 import com.xxl.job.admin.core.model.XxlJobLog;
6
+import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
6 7
 import com.xxl.job.admin.dao.XxlJobGroupDao;
7 8
 import com.xxl.job.admin.dao.XxlJobInfoDao;
8 9
 import com.xxl.job.admin.dao.XxlJobLogDao;
@@ -12,6 +13,8 @@ import com.xxl.job.core.biz.model.ReturnT;
12 13
 import com.xxl.job.core.rpc.netcom.NetComClientProxy;
13 14
 import org.apache.commons.lang.StringUtils;
14 15
 import org.apache.commons.lang.time.DateUtils;
16
+import org.slf4j.Logger;
17
+import org.slf4j.LoggerFactory;
15 18
 import org.springframework.stereotype.Controller;
16 19
 import org.springframework.ui.Model;
17 20
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -32,6 +35,7 @@ import java.util.Map;
32 35
 @Controller
33 36
 @RequestMapping("/joblog")
34 37
 public class JobLogController {
38
+	private static Logger logger = LoggerFactory.getLogger(JobLogController.class);
35 39
 
36 40
 	@Resource
37 41
 	private XxlJobGroupDao xxlJobGroupDao;
@@ -116,7 +120,7 @@ public class JobLogController {
116 120
 	@ResponseBody
117 121
 	public ReturnT<LogResult> logDetailCat(String executorAddress, long triggerTime, int logId, int fromLineNum){
118 122
 		try {
119
-			ExecutorBiz executorBiz = (ExecutorBiz) new NetComClientProxy(ExecutorBiz.class, executorAddress).getObject();
123
+			ExecutorBiz executorBiz = XxlJobDynamicScheduler.getExecutorBiz(executorAddress);
120 124
 			ReturnT<LogResult> logResult = executorBiz.log(triggerTime, logId, fromLineNum);
121 125
 
122 126
 			// is end
@@ -129,7 +133,7 @@ public class JobLogController {
129 133
 
130 134
 			return logResult;
131 135
 		} catch (Exception e) {
132
-			e.printStackTrace();
136
+			logger.error(e.getMessage(), e);
133 137
 			return new ReturnT<LogResult>(ReturnT.FAIL_CODE, e.getMessage());
134 138
 		}
135 139
 	}
@@ -148,14 +152,14 @@ public class JobLogController {
148 152
 		}
149 153
 
150 154
 		// request of kill
151
-		ExecutorBiz executorBiz = null;
155
+		ReturnT<String> runResult = null;
152 156
 		try {
153
-			executorBiz = (ExecutorBiz) new NetComClientProxy(ExecutorBiz.class, log.getExecutorAddress()).getObject();
157
+			ExecutorBiz executorBiz = XxlJobDynamicScheduler.getExecutorBiz(log.getExecutorAddress());
158
+			runResult = executorBiz.kill(jobInfo.getId());
154 159
 		} catch (Exception e) {
155
-			e.printStackTrace();
156
-			return new ReturnT<String>(500, e.getMessage());
160
+			logger.error(e.getMessage(), e);
161
+			runResult = new ReturnT<String>(500, e.getMessage());
157 162
 		}
158
-		ReturnT<String> runResult = executorBiz.kill(jobInfo.getId());
159 163
 
160 164
 		if (ReturnT.SUCCESS_CODE == runResult.getCode()) {
161 165
 			log.setHandleCode(ReturnT.FAIL_CODE);

+ 0 - 28
xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouter.java ファイルの表示

@@ -1,9 +1,7 @@
1 1
 package com.xxl.job.admin.core.route;
2 2
 
3
-import com.xxl.job.core.biz.ExecutorBiz;
4 3
 import com.xxl.job.core.biz.model.ReturnT;
5 4
 import com.xxl.job.core.biz.model.TriggerParam;
6
-import com.xxl.job.core.rpc.netcom.NetComClientProxy;
7 5
 import org.slf4j.Logger;
8 6
 import org.slf4j.LoggerFactory;
9 7
 
@@ -24,30 +22,4 @@ public abstract class ExecutorRouter {
24 22
      */
25 23
     public abstract ReturnT<String> routeRun(TriggerParam triggerParam, ArrayList<String> addressList);
26 24
 
27
-    /**
28
-     * run executor
29
-     * @param triggerParam
30
-     * @param address
31
-     * @return  ReturnT.content: final address
32
-     */
33
-    public static ReturnT<String> runExecutor(TriggerParam triggerParam, String address){
34
-        ReturnT<String> runResult = null;
35
-        try {
36
-            ExecutorBiz executorBiz = (ExecutorBiz) new NetComClientProxy(ExecutorBiz.class, address).getObject();
37
-            runResult = executorBiz.run(triggerParam);
38
-        } catch (Exception e) {
39
-            logger.error("", e);
40
-            runResult = new ReturnT<String>(ReturnT.FAIL_CODE, ""+e );
41
-        }
42
-
43
-        StringBuffer runResultSB = new StringBuffer("触发调度:");
44
-        runResultSB.append("<br>address:").append(address);
45
-        runResultSB.append("<br>code:").append(runResult.getCode());
46
-        runResultSB.append("<br>msg:").append(runResult.getMsg());
47
-
48
-        runResult.setMsg(runResultSB.toString());
49
-        runResult.setContent(address);
50
-        return runResult;
51
-    }
52
-
53 25
 }

+ 4 - 3
xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteBusyover.java ファイルの表示

@@ -1,10 +1,11 @@
1 1
 package com.xxl.job.admin.core.route.strategy;
2 2
 
3 3
 import com.xxl.job.admin.core.route.ExecutorRouter;
4
+import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
5
+import com.xxl.job.admin.core.trigger.XxlJobTrigger;
4 6
 import com.xxl.job.core.biz.ExecutorBiz;
5 7
 import com.xxl.job.core.biz.model.ReturnT;
6 8
 import com.xxl.job.core.biz.model.TriggerParam;
7
-import com.xxl.job.core.rpc.netcom.NetComClientProxy;
8 9
 
9 10
 import java.util.ArrayList;
10 11
 
@@ -25,7 +26,7 @@ public class ExecutorRouteBusyover extends ExecutorRouter {
25 26
             // beat
26 27
             ReturnT<String> idleBeatResult = null;
27 28
             try {
28
-                ExecutorBiz executorBiz = (ExecutorBiz) new NetComClientProxy(ExecutorBiz.class, address).getObject();
29
+                ExecutorBiz executorBiz = XxlJobDynamicScheduler.getExecutorBiz(address);
29 30
                 idleBeatResult = executorBiz.idleBeat(triggerParam.getJobId());
30 31
             } catch (Exception e) {
31 32
                 logger.error(e.getMessage(), e);
@@ -40,7 +41,7 @@ public class ExecutorRouteBusyover extends ExecutorRouter {
40 41
             // beat success
41 42
             if (idleBeatResult.getCode() == ReturnT.SUCCESS_CODE) {
42 43
 
43
-                ReturnT<String> runResult = runExecutor(triggerParam, address);
44
+                ReturnT<String> runResult = XxlJobTrigger.runExecutor(triggerParam, address);
44 45
                 idleBeatResultSB.append("<br><br>").append(runResult.getMsg());
45 46
 
46 47
                 // result

+ 2 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteConsistentHash.java ファイルの表示

@@ -1,6 +1,7 @@
1 1
 package com.xxl.job.admin.core.route.strategy;
2 2
 
3 3
 import com.xxl.job.admin.core.route.ExecutorRouter;
4
+import com.xxl.job.admin.core.trigger.XxlJobTrigger;
4 5
 import com.xxl.job.core.biz.model.ReturnT;
5 6
 import com.xxl.job.core.biz.model.TriggerParam;
6 7
 
@@ -82,7 +83,7 @@ public class ExecutorRouteConsistentHash extends ExecutorRouter {
82 83
         String address = route(triggerParam.getJobId(), addressList);
83 84
 
84 85
         // run executor
85
-        ReturnT<String> runResult = runExecutor(triggerParam, address);
86
+        ReturnT<String> runResult = XxlJobTrigger.runExecutor(triggerParam, address);
86 87
         runResult.setContent(address);
87 88
         return runResult;
88 89
     }

+ 4 - 3
xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFailover.java ファイルの表示

@@ -1,10 +1,11 @@
1 1
 package com.xxl.job.admin.core.route.strategy;
2 2
 
3 3
 import com.xxl.job.admin.core.route.ExecutorRouter;
4
+import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
5
+import com.xxl.job.admin.core.trigger.XxlJobTrigger;
4 6
 import com.xxl.job.core.biz.ExecutorBiz;
5 7
 import com.xxl.job.core.biz.model.ReturnT;
6 8
 import com.xxl.job.core.biz.model.TriggerParam;
7
-import com.xxl.job.core.rpc.netcom.NetComClientProxy;
8 9
 
9 10
 import java.util.ArrayList;
10 11
 
@@ -25,7 +26,7 @@ public class ExecutorRouteFailover extends ExecutorRouter {
25 26
             // beat
26 27
             ReturnT<String> beatResult = null;
27 28
             try {
28
-                ExecutorBiz executorBiz = (ExecutorBiz) new NetComClientProxy(ExecutorBiz.class, address).getObject();
29
+                ExecutorBiz executorBiz = XxlJobDynamicScheduler.getExecutorBiz(address);
29 30
                 beatResult = executorBiz.beat();
30 31
             } catch (Exception e) {
31 32
                 logger.error(e.getMessage(), e);
@@ -40,7 +41,7 @@ public class ExecutorRouteFailover extends ExecutorRouter {
40 41
             // beat success
41 42
             if (beatResult.getCode() == ReturnT.SUCCESS_CODE) {
42 43
 
43
-                ReturnT<String> runResult = runExecutor(triggerParam, address);
44
+                ReturnT<String> runResult = XxlJobTrigger.runExecutor(triggerParam, address);
44 45
                 beatResultSB.append("<br><br>").append(runResult.getMsg());
45 46
 
46 47
                 // result

+ 2 - 2
xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFirst.java ファイルの表示

@@ -1,7 +1,7 @@
1 1
 package com.xxl.job.admin.core.route.strategy;
2 2
 
3
-import com.xxl.job.admin.core.model.XxlJobLog;
4 3
 import com.xxl.job.admin.core.route.ExecutorRouter;
4
+import com.xxl.job.admin.core.trigger.XxlJobTrigger;
5 5
 import com.xxl.job.core.biz.model.ReturnT;
6 6
 import com.xxl.job.core.biz.model.TriggerParam;
7 7
 
@@ -23,7 +23,7 @@ public class ExecutorRouteFirst extends ExecutorRouter {
23 23
         String address = route(triggerParam.getJobId(), addressList);
24 24
 
25 25
         // run executor
26
-        ReturnT<String> runResult = runExecutor(triggerParam, address);
26
+        ReturnT<String> runResult = XxlJobTrigger.runExecutor(triggerParam, address);
27 27
         runResult.setContent(address);
28 28
         return runResult;
29 29
     }

+ 2 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLFU.java ファイルの表示

@@ -1,6 +1,7 @@
1 1
 package com.xxl.job.admin.core.route.strategy;
2 2
 
3 3
 import com.xxl.job.admin.core.route.ExecutorRouter;
4
+import com.xxl.job.admin.core.trigger.XxlJobTrigger;
4 5
 import com.xxl.job.core.biz.model.ReturnT;
5 6
 import com.xxl.job.core.biz.model.TriggerParam;
6 7
 
@@ -62,7 +63,7 @@ public class ExecutorRouteLFU extends ExecutorRouter {
62 63
         String address = route(triggerParam.getJobId(), addressList);
63 64
 
64 65
         // run executor
65
-        ReturnT<String> runResult = runExecutor(triggerParam, address);
66
+        ReturnT<String> runResult = XxlJobTrigger.runExecutor(triggerParam, address);
66 67
         runResult.setContent(address);
67 68
         return runResult;
68 69
     }

+ 2 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLRU.java ファイルの表示

@@ -1,6 +1,7 @@
1 1
 package com.xxl.job.admin.core.route.strategy;
2 2
 
3 3
 import com.xxl.job.admin.core.route.ExecutorRouter;
4
+import com.xxl.job.admin.core.trigger.XxlJobTrigger;
4 5
 import com.xxl.job.core.biz.model.ReturnT;
5 6
 import com.xxl.job.core.biz.model.TriggerParam;
6 7
 
@@ -61,7 +62,7 @@ public class ExecutorRouteLRU extends ExecutorRouter {
61 62
         String address = route(triggerParam.getJobId(), addressList);
62 63
 
63 64
         // run executor
64
-        ReturnT<String> runResult = runExecutor(triggerParam, address);
65
+        ReturnT<String> runResult = XxlJobTrigger.runExecutor(triggerParam, address);
65 66
         runResult.setContent(address);
66 67
         return runResult;
67 68
     }

+ 2 - 2
xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLast.java ファイルの表示

@@ -1,7 +1,7 @@
1 1
 package com.xxl.job.admin.core.route.strategy;
2 2
 
3
-import com.xxl.job.admin.core.model.XxlJobLog;
4 3
 import com.xxl.job.admin.core.route.ExecutorRouter;
4
+import com.xxl.job.admin.core.trigger.XxlJobTrigger;
5 5
 import com.xxl.job.core.biz.model.ReturnT;
6 6
 import com.xxl.job.core.biz.model.TriggerParam;
7 7
 
@@ -22,7 +22,7 @@ public class ExecutorRouteLast extends ExecutorRouter {
22 22
         String address = route(triggerParam.getJobId(), addressList);
23 23
 
24 24
         // run executor
25
-        ReturnT<String> runResult = runExecutor(triggerParam, address);
25
+        ReturnT<String> runResult = XxlJobTrigger.runExecutor(triggerParam, address);
26 26
         runResult.setContent(address);
27 27
         return runResult;
28 28
     }

+ 2 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRandom.java ファイルの表示

@@ -1,6 +1,7 @@
1 1
 package com.xxl.job.admin.core.route.strategy;
2 2
 
3 3
 import com.xxl.job.admin.core.route.ExecutorRouter;
4
+import com.xxl.job.admin.core.trigger.XxlJobTrigger;
4 5
 import com.xxl.job.core.biz.model.ReturnT;
5 6
 import com.xxl.job.core.biz.model.TriggerParam;
6 7
 
@@ -25,7 +26,7 @@ public class ExecutorRouteRandom extends ExecutorRouter {
25 26
         String address = route(triggerParam.getJobId(), addressList);
26 27
 
27 28
         // run executor
28
-        ReturnT<String> runResult = runExecutor(triggerParam, address);
29
+        ReturnT<String> runResult = XxlJobTrigger.runExecutor(triggerParam, address);
29 30
         runResult.setContent(address);
30 31
         return runResult;
31 32
     }

+ 2 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRound.java ファイルの表示

@@ -1,6 +1,7 @@
1 1
 package com.xxl.job.admin.core.route.strategy;
2 2
 
3 3
 import com.xxl.job.admin.core.route.ExecutorRouter;
4
+import com.xxl.job.admin.core.trigger.XxlJobTrigger;
4 5
 import com.xxl.job.core.biz.model.ReturnT;
5 6
 import com.xxl.job.core.biz.model.TriggerParam;
6 7
 
@@ -41,7 +42,7 @@ public class ExecutorRouteRound extends ExecutorRouter {
41 42
         String address = route(triggerParam.getJobId(), addressList);
42 43
 
43 44
         // run executor
44
-        ReturnT<String> runResult = runExecutor(triggerParam, address);
45
+        ReturnT<String> runResult = XxlJobTrigger.runExecutor(triggerParam, address);
45 46
         runResult.setContent(address);
46 47
         return runResult;
47 48
     }

+ 161 - 73
xxl-job-admin/src/main/java/com/xxl/job/admin/core/schedule/XxlJobDynamicScheduler.java ファイルの表示

@@ -9,62 +9,52 @@ import com.xxl.job.admin.dao.XxlJobInfoDao;
9 9
 import com.xxl.job.admin.dao.XxlJobLogDao;
10 10
 import com.xxl.job.admin.dao.XxlJobRegistryDao;
11 11
 import com.xxl.job.core.biz.AdminBiz;
12
+import com.xxl.job.core.biz.ExecutorBiz;
13
+import com.xxl.job.core.rpc.netcom.NetComClientProxy;
12 14
 import com.xxl.job.core.rpc.netcom.NetComServerFactory;
13 15
 import org.quartz.*;
14 16
 import org.quartz.Trigger.TriggerState;
15
-import org.quartz.impl.matchers.GroupMatcher;
16 17
 import org.quartz.impl.triggers.CronTriggerImpl;
17 18
 import org.slf4j.Logger;
18 19
 import org.slf4j.LoggerFactory;
19 20
 import org.springframework.beans.BeansException;
20
-import org.springframework.beans.factory.InitializingBean;
21 21
 import org.springframework.context.ApplicationContext;
22 22
 import org.springframework.context.ApplicationContextAware;
23 23
 import org.springframework.util.Assert;
24 24
 
25
-import java.util.*;
25
+import java.util.Date;
26
+import java.util.HashSet;
27
+import java.util.concurrent.ConcurrentHashMap;
26 28
 
27 29
 /**
28 30
  * base quartz scheduler util
29 31
  * @author xuxueli 2015-12-19 16:13:53
30 32
  */
31
-public final class XxlJobDynamicScheduler implements ApplicationContextAware, InitializingBean {
33
+public final class XxlJobDynamicScheduler implements ApplicationContextAware {
32 34
     private static final Logger logger = LoggerFactory.getLogger(XxlJobDynamicScheduler.class);
33
-    
34
-    // Scheduler
35
+
36
+    // ---------------------- param ----------------------
37
+
38
+    // scheduler
35 39
     private static Scheduler scheduler;
36 40
     public void setScheduler(Scheduler scheduler) {
37 41
 		XxlJobDynamicScheduler.scheduler = scheduler;
38 42
 	}
39
-    
40
-    // init
41
-    public void init() throws Exception {
42
-		// admin registry monitor run
43
-        JobRegistryMonitorHelper.getInstance().start();
44 43
 
45
-        // admin monitor run
46
-        JobFailMonitorHelper.getInstance().start();
47
-
48
-        // rpc-service, base on spring-mvc
49
-        NetComServerFactory.putService(AdminBiz.class, XxlJobDynamicScheduler.adminBiz);
44
+	// accessToken
45
+    private static String accessToken;
46
+    public void setAccessToken(String accessToken) {
47
+        this.accessToken = accessToken;
50 48
     }
51
-    
52
-    // destroy
53
-    public void destroy(){
54
-        // admin registry stop
55
-        JobRegistryMonitorHelper.getInstance().toStop();
56 49
 
57
-        // admin monitor stop
58
-        JobFailMonitorHelper.getInstance().toStop();
59
-    }
60
-    
61
-    // xxlJobLogDao、xxlJobInfoDao
50
+    // dao
62 51
     public static XxlJobLogDao xxlJobLogDao;
63 52
     public static XxlJobInfoDao xxlJobInfoDao;
64 53
     public static XxlJobRegistryDao xxlJobRegistryDao;
65 54
     public static XxlJobGroupDao xxlJobGroupDao;
66 55
     public static AdminBiz adminBiz;
67 56
 
57
+    // ---------------------- applicationContext ----------------------
68 58
     @Override
69 59
 	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
70 60
 		XxlJobDynamicScheduler.xxlJobLogDao = applicationContext.getBean(XxlJobLogDao.class);
@@ -73,48 +63,60 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware, In
73 63
         XxlJobDynamicScheduler.xxlJobGroupDao = applicationContext.getBean(XxlJobGroupDao.class);
74 64
         XxlJobDynamicScheduler.adminBiz = applicationContext.getBean(AdminBiz.class);
75 65
 	}
76
-    
77
-	@Override
78
-    public void afterPropertiesSet() throws Exception {
66
+
67
+    // ---------------------- init + destroy ----------------------
68
+    public void init() throws Exception {
69
+        // admin registry monitor run
70
+        JobRegistryMonitorHelper.getInstance().start();
71
+
72
+        // admin monitor run
73
+        JobFailMonitorHelper.getInstance().start();
74
+
75
+        // admin-server(spring-mvc)
76
+        NetComServerFactory.putService(AdminBiz.class, XxlJobDynamicScheduler.adminBiz);
77
+        NetComServerFactory.setAccessToken(accessToken);
78
+
79
+        // valid
79 80
         Assert.notNull(scheduler, "quartz scheduler is null");
80 81
         logger.info(">>>>>>>>> init quartz scheduler success.[{}]", scheduler);
81
-       
82 82
     }
83
-	
84
-	// getJobKeys
85
-	@Deprecated
86
-	public static List<Map<String, Object>> getJobList(){
87
-		List<Map<String, Object>> jobList = new ArrayList<Map<String,Object>>();
88
-		
89
-		try {
90
-			if (scheduler.getJobGroupNames()==null || scheduler.getJobGroupNames().size()==0) {
91
-				return null;
92
-			}
93
-			String groupName = scheduler.getJobGroupNames().get(0);
94
-			Set<JobKey> jobKeys = scheduler.getJobKeys(GroupMatcher.jobGroupEquals(groupName));
95
-			if (jobKeys!=null && jobKeys.size()>0) {
96
-				for (JobKey jobKey : jobKeys) {
97
-			        TriggerKey triggerKey = TriggerKey.triggerKey(jobKey.getName(), Scheduler.DEFAULT_GROUP);
98
-			        Trigger trigger = scheduler.getTrigger(triggerKey);
99
-			        JobDetail jobDetail = scheduler.getJobDetail(jobKey);
100
-			        TriggerState triggerState = scheduler.getTriggerState(triggerKey);
101
-			        Map<String, Object> jobMap = new HashMap<String, Object>();
102
-			        jobMap.put("TriggerKey", triggerKey);
103
-			        jobMap.put("Trigger", trigger);
104
-			        jobMap.put("JobDetail", jobDetail);
105
-			        jobMap.put("TriggerState", triggerState);
106
-			        jobList.add(jobMap);
107
-				}
108
-			}
109
-			
110
-		} catch (SchedulerException e) {
111
-			e.printStackTrace();
112
-			return null;
113
-		}
114
-		return jobList;
115
-	}
116
-	
117
-	// fill job info
83
+
84
+    public void destroy(){
85
+        // admin registry stop
86
+        JobRegistryMonitorHelper.getInstance().toStop();
87
+
88
+        // admin monitor stop
89
+        JobFailMonitorHelper.getInstance().toStop();
90
+    }
91
+
92
+    // ---------------------- executor-client ----------------------
93
+    private static ConcurrentHashMap<String, ExecutorBiz> executorBizRepository = new ConcurrentHashMap<String, ExecutorBiz>();
94
+    public static ExecutorBiz getExecutorBiz(String address) throws Exception {
95
+        // valid
96
+        if (address==null || address.trim().length()==0) {
97
+            return null;
98
+        }
99
+
100
+        // load-cache
101
+        address = address.trim();
102
+        ExecutorBiz executorBiz = executorBizRepository.get(address);
103
+        if (executorBiz != null) {
104
+            return executorBiz;
105
+        }
106
+
107
+        // set-cache
108
+        executorBiz = (ExecutorBiz) new NetComClientProxy(ExecutorBiz.class, address, accessToken).getObject();
109
+        executorBizRepository.put(address, executorBiz);
110
+        return executorBiz;
111
+    }
112
+
113
+    // ---------------------- schedule util ----------------------
114
+
115
+    /**
116
+     * fill job info
117
+     *
118
+     * @param jobInfo
119
+     */
118 120
 	public static void fillJobInfo(XxlJobInfo jobInfo) {
119 121
 		// TriggerKey : name + group
120 122
         String group = String.valueOf(jobInfo.getJobGroup());
@@ -145,14 +147,28 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware, In
145 147
 		}
146 148
 	}
147 149
 	
148
-	// check if exists
150
+    /**
151
+     * check if exists
152
+     *
153
+     * @param jobName
154
+     * @param jobGroup
155
+     * @return
156
+     * @throws SchedulerException
157
+     */
149 158
 	public static boolean checkExists(String jobName, String jobGroup) throws SchedulerException{
150 159
 		TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
151 160
 		return scheduler.checkExists(triggerKey);
152 161
 	}
153 162
 
154
-	// addJob 新增
155
-	@SuppressWarnings("unchecked")
163
+    /**
164
+     * addJob
165
+     *
166
+     * @param jobName
167
+     * @param jobGroup
168
+     * @param cronExpression
169
+     * @return
170
+     * @throws SchedulerException
171
+     */
156 172
 	public static boolean addJob(String jobName, String jobGroup, String cronExpression) throws SchedulerException {
157 173
     	// TriggerKey : name + group
158 174
         TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
@@ -185,7 +201,15 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware, In
185 201
         return true;
186 202
     }
187 203
     
188
-    // reschedule
204
+    /**
205
+     * rescheduleJob
206
+     *
207
+     * @param jobGroup
208
+     * @param jobName
209
+     * @param cronExpression
210
+     * @return
211
+     * @throws SchedulerException
212
+     */
189 213
 	public static boolean rescheduleJob(String jobGroup, String jobName, String cronExpression) throws SchedulerException {
190 214
     	
191 215
     	// TriggerKey valid if_exists
@@ -234,7 +258,14 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware, In
234 258
         return true;
235 259
     }
236 260
     
237
-    // unscheduleJob
261
+    /**
262
+     * unscheduleJob
263
+     *
264
+     * @param jobName
265
+     * @param jobGroup
266
+     * @return
267
+     * @throws SchedulerException
268
+     */
238 269
     public static boolean removeJob(String jobName, String jobGroup) throws SchedulerException {
239 270
     	// TriggerKey : name + group
240 271
         TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
@@ -246,7 +277,14 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware, In
246 277
         return true;
247 278
     }
248 279
 
249
-    // Pause
280
+    /**
281
+     * pause
282
+     *
283
+     * @param jobName
284
+     * @param jobGroup
285
+     * @return
286
+     * @throws SchedulerException
287
+     */
250 288
     public static boolean pauseJob(String jobName, String jobGroup) throws SchedulerException {
251 289
     	// TriggerKey : name + group
252 290
     	TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
@@ -262,7 +300,14 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware, In
262 300
         return result;
263 301
     }
264 302
     
265
-    // resume
303
+    /**
304
+     * resume
305
+     *
306
+     * @param jobName
307
+     * @param jobGroup
308
+     * @return
309
+     * @throws SchedulerException
310
+     */
266 311
     public static boolean resumeJob(String jobName, String jobGroup) throws SchedulerException {
267 312
     	// TriggerKey : name + group
268 313
     	TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
@@ -278,7 +323,14 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware, In
278 323
         return result;
279 324
     }
280 325
     
281
-    // run
326
+    /**
327
+     * run
328
+     *
329
+     * @param jobName
330
+     * @param jobGroup
331
+     * @return
332
+     * @throws SchedulerException
333
+     */
282 334
     public static boolean triggerJob(String jobName, String jobGroup) throws SchedulerException {
283 335
     	// TriggerKey : name + group
284 336
     	JobKey jobKey = new JobKey(jobName, jobGroup);
@@ -294,5 +346,41 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware, In
294 346
         return result;
295 347
     }
296 348
 
349
+    /**
350
+     * finaAllJobList
351
+     *
352
+     * @return
353
+     *//*
354
+    @Deprecated
355
+    public static List<Map<String, Object>> finaAllJobList(){
356
+        List<Map<String, Object>> jobList = new ArrayList<Map<String,Object>>();
357
+
358
+        try {
359
+            if (scheduler.getJobGroupNames()==null || scheduler.getJobGroupNames().size()==0) {
360
+                return null;
361
+            }
362
+            String groupName = scheduler.getJobGroupNames().get(0);
363
+            Set<JobKey> jobKeys = scheduler.getJobKeys(GroupMatcher.jobGroupEquals(groupName));
364
+            if (jobKeys!=null && jobKeys.size()>0) {
365
+                for (JobKey jobKey : jobKeys) {
366
+                    TriggerKey triggerKey = TriggerKey.triggerKey(jobKey.getName(), Scheduler.DEFAULT_GROUP);
367
+                    Trigger trigger = scheduler.getTrigger(triggerKey);
368
+                    JobDetail jobDetail = scheduler.getJobDetail(jobKey);
369
+                    TriggerState triggerState = scheduler.getTriggerState(triggerKey);
370
+                    Map<String, Object> jobMap = new HashMap<String, Object>();
371
+                    jobMap.put("TriggerKey", triggerKey);
372
+                    jobMap.put("Trigger", trigger);
373
+                    jobMap.put("JobDetail", jobDetail);
374
+                    jobMap.put("TriggerState", triggerState);
375
+                    jobList.add(jobMap);
376
+                }
377
+            }
378
+
379
+        } catch (SchedulerException e) {
380
+            e.printStackTrace();
381
+            return null;
382
+        }
383
+        return jobList;
384
+    }*/
297 385
 
298 386
 }

+ 1 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java ファイルの表示

@@ -30,7 +30,7 @@ public class JobFailMonitorHelper {
30 30
 	private LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<Integer>(0xfff8);
31 31
 
32 32
 	private Thread monitorThread;
33
-	private boolean toStop = false;
33
+	private volatile boolean toStop = false;
34 34
 	public void start(){
35 35
 		monitorThread = new Thread(new Runnable() {
36 36
 

+ 1 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryMonitorHelper.java ファイルの表示

@@ -28,7 +28,7 @@ public class JobRegistryMonitorHelper {
28 28
 	}
29 29
 
30 30
 	private Thread registryThread;
31
-	private boolean toStop = false;
31
+	private volatile boolean toStop = false;
32 32
 	public void start(){
33 33
 		registryThread = new Thread(new Runnable() {
34 34
 			@Override

+ 29 - 3
xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java ファイルの表示

@@ -5,9 +5,9 @@ import com.xxl.job.admin.core.model.XxlJobGroup;
5 5
 import com.xxl.job.admin.core.model.XxlJobInfo;
6 6
 import com.xxl.job.admin.core.model.XxlJobLog;
7 7
 import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;
8
-import com.xxl.job.admin.core.route.ExecutorRouter;
9 8
 import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
10 9
 import com.xxl.job.admin.core.thread.JobFailMonitorHelper;
10
+import com.xxl.job.core.biz.ExecutorBiz;
11 11
 import com.xxl.job.core.biz.model.ReturnT;
12 12
 import com.xxl.job.core.biz.model.TriggerParam;
13 13
 import com.xxl.job.core.enums.ExecutorBlockStrategyEnum;
@@ -90,12 +90,12 @@ public class XxlJobTrigger {
90 90
                     triggerParam.setBroadcastTotal(addressList.size()); // update02
91 91
 
92 92
                     // 4.2、trigger-run (route run / trigger remote executor)
93
-                    triggerResult = ExecutorRouter.runExecutor(triggerParam, address);     // update03
93
+                    triggerResult = runExecutor(triggerParam, address);     // update03
94 94
                     triggerMsgSb.append("<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>").append(triggerResult.getMsg());
95 95
 
96 96
                     // 4.3、trigger (fail retry)
97 97
                     if (triggerResult.getCode()!=ReturnT.SUCCESS_CODE && failStrategy == ExecutorFailStrategyEnum.FAIL_RETRY) {
98
-                        triggerResult = ExecutorRouter.runExecutor(triggerParam, address);  // update04
98
+                        triggerResult = runExecutor(triggerParam, address);  // update04
99 99
                         triggerMsgSb.append("<br><br><span style=\"color:#F39C12;\" > >>>>>>>>>>>失败重试<<<<<<<<<<< </span><br>").append(triggerResult.getMsg());
100 100
                     }
101 101
                 }
@@ -179,4 +179,30 @@ public class XxlJobTrigger {
179 179
         logger.debug(">>>>>>>>>>> xxl-job trigger end, jobId:{}", jobLog.getId());
180 180
     }
181 181
 
182
+    /**
183
+     * run executor
184
+     * @param triggerParam
185
+     * @param address
186
+     * @return  ReturnT.content: final address
187
+     */
188
+    public static ReturnT<String> runExecutor(TriggerParam triggerParam, String address){
189
+        ReturnT<String> runResult = null;
190
+        try {
191
+            ExecutorBiz executorBiz = XxlJobDynamicScheduler.getExecutorBiz(address);
192
+            runResult = executorBiz.run(triggerParam);
193
+        } catch (Exception e) {
194
+            logger.error(e.getMessage(), e);
195
+            runResult = new ReturnT<String>(ReturnT.FAIL_CODE, ""+e );
196
+        }
197
+
198
+        StringBuffer runResultSB = new StringBuffer("触发调度:");
199
+        runResultSB.append("<br>address:").append(address);
200
+        runResultSB.append("<br>code:").append(runResult.getCode());
201
+        runResultSB.append("<br>msg:").append(runResult.getMsg());
202
+
203
+        runResult.setMsg(runResultSB.toString());
204
+        runResult.setContent(address);
205
+        return runResult;
206
+    }
207
+
182 208
 }

+ 1 - 0
xxl-job-admin/src/main/resources/spring/applicationcontext-xxl-job-admin.xml ファイルの表示

@@ -65,6 +65,7 @@
65 65
 	<bean id="xxlJobDynamicScheduler" class="com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler" init-method="init" destroy-method="destroy" >
66 66
 		<!-- (轻易不要变更“调度器名称”, 任务创建时会绑定该“调度器名称”) -->
67 67
 		<property name="scheduler" ref="quartzScheduler"/>
68
+		<property name="accessToken" value="${xxl.job.accessToken}" />
68 69
 	</bean>
69 70
 	
70 71
 </beans>

+ 5 - 2
xxl-job-admin/src/main/resources/xxl-job-admin.properties ファイルの表示

@@ -12,6 +12,9 @@ xxl.job.mail.password=asdfzxcv
12 12
 xxl.job.mail.sendFrom=ovono802302@163.com
13 13
 xxl.job.mail.sendNick=《任务调度平台XXL-JOB》
14 14
 
15
-# xxl-job login
15
+### xxl-job login
16 16
 xxl.job.login.username=admin
17
-xxl.job.login.password=123456
17
+xxl.job.login.password=123456
18
+
19
+### xxl-job, access token
20
+xxl.job.accessToken=

+ 4 - 3
xxl-job-admin/src/main/webapp/WEB-INF/template/common/common.macro.ftl ファイルの表示

@@ -175,11 +175,12 @@
175 175
 
176 176
 <#macro commonFooter >
177 177
 	<footer class="main-footer">
178
-        Powered by <b>XXL-JOB</b> 1.8.1(快照版)
178
+        Powered by <b>XXL-JOB</b> 1.8.2(快照版本)
179 179
 		<div class="pull-right hidden-xs">
180 180
             <strong>Copyright &copy; 2015-${.now?string('yyyy')} &nbsp;
181
-                <a href="https://github.com/xuxueli/xxl-job" target="_blank" >github</a>&nbsp;
182
-                <a href="http://my.oschina.net/xuxueli/blog/690978" target="_blank" >oschina</a>
181
+                <a href="http://www.xuxueli.com/" target="_blank" >xuxueli</a>
182
+				&nbsp;
183
+                <a href="https://github.com/xuxueli/xxl-job" target="_blank" >github</a>
183 184
             </strong><!-- All rights reserved. -->
184 185
 		</div>
185 186
 	</footer>

+ 4 - 23
xxl-job-admin/src/main/webapp/WEB-INF/template/help.ftl ファイルの表示

@@ -31,33 +31,14 @@
31 31
 				<h4>简介:XXL-JOB</h4>
32 32
 				<br>
33 33
 				<p>
34
-					<a target="_blank" href="https://github.com/xuxueli/xxl-job">github地址</a>&nbsp;&nbsp;&nbsp;&nbsp;
34
+                    <a target="_blank" href="http://www.xuxueli.com/">xuxueli</a>
35
+                    <br><br>
36
+					<a target="_blank" href="https://github.com/xuxueli/xxl-job">github</a>&nbsp;&nbsp;&nbsp;&nbsp;
35 37
 					<iframe src="https://ghbtns.com/github-btn.html?user=xuxueli&repo=xxl-job&type=star&count=true" frameborder="0" scrolling="0" width="170px" height="20px" style="margin-bottom:-5px;"></iframe> 
36 38
 					<br><br>
37
-					<a target="_blank" href="http://my.oschina.net/xuxueli/blog/690978">oschina地址</a>
38
-                    <br><br>
39
-
40
-                    <a >技术交流群5:138274130</a>&nbsp;&nbsp;&nbsp;&nbsp;
41
-                    <a target="_blank" href="//shang.qq.com/wpa/qunwpa?idkey=a3f3aea7e5943e7a24e9726495747ddc19bccd3592d7a70ecb5a97b616062241">
42
-						<img border="0" src="//pub.idqqimg.com/wpa/images/group.png" alt="《xxl-javaer》(五群)" title="《xxl-javaer》(五群)">
43
-					</a>
44
-                    <br><br>
45
-
46
-                    <a >技术交流群4:464762661</a>&nbsp;&nbsp;&nbsp;&nbsp;
47
-                    (群即将满,请加群5)
39
+                    <a target="_blank" href="http://my.oschina.net/xuxueli/blog/690978">oschina(文档中有交流群)</a>
48 40
                     <br><br>
49 41
 
50
-                    <a >技术交流群3:242151780</a>&nbsp;&nbsp;&nbsp;&nbsp;
51
-                    (群即将满,请加群5)
52
-                    <br><br>
53
-
54
-                    <a >技术交流群2:438249535</a>&nbsp;&nbsp;&nbsp;&nbsp;
55
-                    (群即将满,请加群5)
56
-                    <br><br>
57
-
58
-                    <a >技术交流群1:367260654</a>&nbsp;&nbsp;&nbsp;&nbsp;
59
-                    (群即将满,请加群5)
60
-
61 42
 				</p>
62 43
 				<p></p>
63 44
             </div>

+ 2 - 2
xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl ファイルの表示

@@ -37,7 +37,7 @@
37 37
 	                	<span class="input-group-addon">执行器</span>
38 38
                 		<select class="form-control" id="jobGroup" >
39 39
                 			<#list JobGroupList as group>
40
-                				<option value="${group.id}" >${group.title}</option>
40
+                				<option value="${group.id}" <#if jobGroup==group.id>selected</#if> >${group.title}</option>
41 41
                 			</#list>
42 42
 	                  	</select>
43 43
 	              	</div>
@@ -110,7 +110,7 @@
110 110
 						<div class="col-sm-4">
111 111
 							<select class="form-control" name="jobGroup" >
112 112
 		            			<#list JobGroupList as group>
113
-		            				<option value="${group.id}" >${group.title}</option>
113
+		            				<option value="${group.id}" <#if jobGroup==group.id>selected</#if> >${group.title}</option>
114 114
 		            			</#list>
115 115
 		                  	</select>
116 116
 						</div>

+ 7 - 0
xxl-job-admin/src/main/webapp/static/js/jobinfo.index.1.js ファイルの表示

@@ -167,6 +167,13 @@ $(function() {
167 167
 		jobTable.fnDraw();
168 168
 	});
169 169
 	
170
+	// jobGroup change
171
+	$('#jobGroup').on('change', function(){
172
+        //reload
173
+        var jobGroup = $('#jobGroup').val();
174
+        window.location.href = base_url + "/jobinfo?jobGroup=" + jobGroup;
175
+    });
176
+	
170 177
 	// job operate
171 178
 	$("#job_list").on('click', '.job_operate',function() {
172 179
 		var typeName;

+ 32 - 0
xxl-job-admin/src/test/java/com/xxl/job/dao/impl/AdminBizTest.java ファイルの表示

@@ -0,0 +1,32 @@
1
+package com.xxl.job.dao.impl;
2
+
3
+import com.xxl.job.core.biz.AdminBiz;
4
+import com.xxl.job.core.biz.model.RegistryParam;
5
+import com.xxl.job.core.biz.model.ReturnT;
6
+import com.xxl.job.core.enums.RegistryConfig;
7
+import com.xxl.job.core.rpc.netcom.NetComClientProxy;
8
+import org.junit.Assert;
9
+import org.junit.Test;
10
+
11
+/**
12
+ * admin-api client, test
13
+ * @author xuxueli 2017-07-28 22:14:52
14
+ */
15
+public class AdminBizTest {
16
+
17
+    @Test
18
+    public void registryTest() throws Exception {
19
+
20
+        // admin-client
21
+        String addressUrl = "http://127.0.0.1:8080/xxl-job-admin".concat(AdminBiz.MAPPING);
22
+        String accessToken = null;
23
+        AdminBiz adminBiz = (AdminBiz) new NetComClientProxy(AdminBiz.class, addressUrl, accessToken).getObject();
24
+
25
+        // test executor registry
26
+        RegistryParam registryParam = new RegistryParam(RegistryConfig.RegistType.EXECUTOR.name(), "xxl-job-executor-example", "127.0.0.1:9999");
27
+        ReturnT<String> returnT = adminBiz.registry(registryParam);
28
+        Assert.assertTrue(returnT.getCode() == ReturnT.SUCCESS_CODE);
29
+
30
+    }
31
+
32
+}

+ 10 - 14
xxl-job-core/pom.xml ファイルの表示

@@ -4,7 +4,7 @@
4 4
 	<parent>
5 5
 		<groupId>com.xuxueli</groupId>
6 6
 		<artifactId>xxl-job</artifactId>
7
-		<version>1.8.1-SNAPSHOT</version>
7
+		<version>1.8.2-SNAPSHOT</version>
8 8
 	</parent>
9 9
 	<artifactId>xxl-job-core</artifactId>
10 10
 	<packaging>jar</packaging>
@@ -13,56 +13,52 @@
13 13
 	<description>A lightweight distributed task scheduling framework.</description>
14 14
 	<url>http://www.xuxueli.com/</url>
15 15
 
16
-	<properties>
17
-		<spring.version>3.2.17.RELEASE</spring.version>
18
-	</properties>
19
-
20 16
 	<dependencies>
21 17
 		<!-- servlet -->
22 18
 		<dependency>
23 19
 			<groupId>javax.servlet</groupId>
24 20
 			<artifactId>javax.servlet-api</artifactId>
25
-			<version>3.0.1</version>
21
+			<version>${javax.servlet-api.version}</version>
26 22
 		</dependency>
27 23
 		<dependency>
28 24
 			<groupId>javax.servlet.jsp</groupId>
29 25
 			<artifactId>jsp-api</artifactId>
30
-			<version>2.2</version>
26
+			<version>${jsp-api.version}</version>
31 27
 		</dependency>
32 28
 
33 29
 		<!-- jetty -->
34 30
 		<dependency>
35 31
 			<groupId>org.eclipse.jetty</groupId>
36 32
 			<artifactId>jetty-server</artifactId>
37
-			<version>9.2.21.v20170120</version>
33
+			<version>${jetty-server.version}</version>
38 34
 		</dependency>
39 35
 
40 36
 		<!-- slf4j -->
41 37
 		<dependency>
42 38
 			<groupId>org.slf4j</groupId>
43 39
 			<artifactId>slf4j-api</artifactId>
44
-			<version>1.7.21</version>
40
+			<version>${slf4j-api.version}</version>
45 41
 		</dependency>
46 42
 
47 43
 		<!-- hessian -->
48 44
 		<dependency>
49 45
 			<groupId>com.caucho</groupId>
50 46
 			<artifactId>hessian</artifactId>
51
-			<version>4.0.38</version>
47
+			<version>${hessian.version}</version>
52 48
 		</dependency>
53 49
 
54 50
 		<!-- jackson -->
55 51
 		<dependency>
56 52
 			<groupId>org.codehaus.jackson</groupId>
57 53
 			<artifactId>jackson-mapper-asl</artifactId>
58
-			<version>1.9.13</version>
54
+			<version>${jackson-mapper-asl.version}</version>
59 55
 		</dependency>
60 56
 		
61 57
 		<!-- httpclient -->
62 58
 		<dependency>
63 59
 			<groupId>org.apache.httpcomponents</groupId>
64 60
 			<artifactId>httpclient</artifactId>
65
-			<version>4.3.6</version>
61
+			<version>${httpclient.version}</version>
66 62
 		</dependency>
67 63
 		
68 64
 		<!-- spring-context -->
@@ -76,14 +72,14 @@
76 72
 		<dependency>
77 73
 			<groupId>org.codehaus.groovy</groupId>
78 74
 			<artifactId>groovy-all</artifactId>
79
-			<version>2.4.5</version>
75
+			<version>${groovy-all.version}</version>
80 76
 		</dependency>
81 77
 
82 78
 		<!-- commons-exec -->
83 79
 		<dependency>
84 80
 			<groupId>org.apache.commons</groupId>
85 81
 			<artifactId>commons-exec</artifactId>
86
-			<version>1.3</version>
82
+			<version>${commons-exec.version}</version>
87 83
 		</dependency>
88 84
 
89 85
 	</dependencies>

+ 2 - 0
xxl-job-core/src/main/java/com/xxl/job/core/biz/AdminBiz.java ファイルの表示

@@ -11,6 +11,8 @@ import java.util.List;
11 11
  */
12 12
 public interface AdminBiz {
13 13
 
14
+    public static final String MAPPING = "/api";
15
+
14 16
     /**
15 17
      * callback
16 18
      *

+ 86 - 51
xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java ファイルの表示

@@ -1,36 +1,38 @@
1 1
 package com.xxl.job.core.executor;
2 2
 
3
+import com.xxl.job.core.biz.AdminBiz;
3 4
 import com.xxl.job.core.biz.ExecutorBiz;
4 5
 import com.xxl.job.core.biz.impl.ExecutorBizImpl;
5 6
 import com.xxl.job.core.handler.IJobHandler;
6 7
 import com.xxl.job.core.handler.annotation.JobHander;
8
+import com.xxl.job.core.log.XxlJobFileAppender;
9
+import com.xxl.job.core.rpc.netcom.NetComClientProxy;
7 10
 import com.xxl.job.core.rpc.netcom.NetComServerFactory;
8
-import com.xxl.job.core.thread.ExecutorRegistryThread;
9 11
 import com.xxl.job.core.thread.JobThread;
10
-import com.xxl.job.core.thread.TriggerCallbackThread;
11 12
 import org.slf4j.Logger;
12 13
 import org.slf4j.LoggerFactory;
13 14
 import org.springframework.beans.BeansException;
14 15
 import org.springframework.context.ApplicationContext;
15 16
 import org.springframework.context.ApplicationContextAware;
16
-import org.springframework.context.ApplicationEvent;
17
-import org.springframework.context.ApplicationListener;
18
-import org.springframework.context.event.ContextClosedEvent;
19 17
 
18
+import java.util.ArrayList;
19
+import java.util.List;
20 20
 import java.util.Map;
21 21
 import java.util.concurrent.ConcurrentHashMap;
22 22
 
23 23
 /**
24 24
  * Created by xuxueli on 2016/3/2 21:14.
25 25
  */
26
-public class XxlJobExecutor implements ApplicationContextAware, ApplicationListener {
26
+public class XxlJobExecutor implements ApplicationContextAware {
27 27
     private static final Logger logger = LoggerFactory.getLogger(XxlJobExecutor.class);
28 28
 
29
+    // ---------------------- param ----------------------
29 30
     private String ip;
30 31
     private int port = 9999;
31 32
     private String appName;
32
-    public static String adminAddresses;
33
-    public static String logPath;
33
+    private String adminAddresses;
34
+    private String accessToken;
35
+    private String logPath;
34 36
 
35 37
     public void setIp(String ip) {
36 38
         this.ip = ip;
@@ -44,48 +46,98 @@ public class XxlJobExecutor implements ApplicationContextAware, ApplicationListe
44 46
     public void setAdminAddresses(String adminAddresses) {
45 47
         this.adminAddresses = adminAddresses;
46 48
     }
49
+    public void setAccessToken(String accessToken) {
50
+        this.accessToken = accessToken;
51
+    }
47 52
     public void setLogPath(String logPath) {
48 53
         this.logPath = logPath;
49 54
     }
50 55
 
51
-    // ---------------------------------- job server ------------------------------------
52
-    private NetComServerFactory serverFactory = new NetComServerFactory();
53
-    public void start() throws Exception {
54
-        // executor start
55
-        NetComServerFactory.putService(ExecutorBiz.class, new ExecutorBizImpl());   // rpc-service, base on jetty
56
-        serverFactory.start(port, ip, appName);
57 56
 
58
-        // trigger callback thread start
59
-        TriggerCallbackThread.getInstance().start();
57
+    // ---------------------- applicationContext ----------------------
58
+    private static ApplicationContext applicationContext;
59
+    @Override
60
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
61
+        this.applicationContext = applicationContext;
60 62
     }
61
-    public void destroy(){
62
-        // 1、executor registry thread stop
63
-        ExecutorRegistryThread.getInstance().toStop();
63
+    public static ApplicationContext getApplicationContext() {
64
+        return applicationContext;
65
+    }
66
+
67
+
68
+    // ---------------------- start + stop ----------------------
69
+    public void start() throws Exception {
70
+        // init admin-client
71
+        initAdminBizList(adminAddresses, accessToken);
72
+
73
+        // init executor-jobHandlerRepository
74
+        initJobHandlerRepository(applicationContext);
64 75
 
65
-        // 2、executor stop
66
-        serverFactory.destroy();
76
+        // init logpath
77
+        if (logPath!=null && logPath.trim().length()>0) {
78
+            XxlJobFileAppender.logPath = logPath;
79
+        }
67 80
 
68
-        // 3、job thread repository destory
81
+        // init executor-server
82
+        initExecutorServer(port, ip, appName, accessToken);
83
+    }
84
+    public void destroy(){
85
+        // destory JobThreadRepository
69 86
         if (JobThreadRepository.size() > 0) {
70 87
             for (Map.Entry<Integer, JobThread> item: JobThreadRepository.entrySet()) {
71
-                JobThread jobThread = item.getValue();
72
-                jobThread.toStop("Web容器销毁终止");
73
-                jobThread.interrupt();
74
-
88
+                removeJobThread(item.getKey(), "Web容器销毁终止");
75 89
             }
76 90
             JobThreadRepository.clear();
77 91
         }
78 92
 
79
-        // 4、trigger callback thread stop
80
-        TriggerCallbackThread.getInstance().toStop();
93
+        // destory executor-server
94
+        stopExecutorServer();
95
+    }
96
+
97
+
98
+    // ---------------------- admin-client ----------------------
99
+    private static List<AdminBiz> adminBizList;
100
+    private static void initAdminBizList(String adminAddresses, String accessToken) throws Exception {
101
+        if (adminAddresses!=null && adminAddresses.trim().length()>0) {
102
+            for (String address: adminAddresses.trim().split(",")) {
103
+                if (address!=null && address.trim().length()>0) {
104
+                    String addressUrl = address.concat(AdminBiz.MAPPING);
105
+                    AdminBiz adminBiz = (AdminBiz) new NetComClientProxy(AdminBiz.class, addressUrl, accessToken).getObject();
106
+                    if (adminBizList == null) {
107
+                        adminBizList = new ArrayList<AdminBiz>();
108
+                    }
109
+                    adminBizList.add(adminBiz);
110
+                }
111
+            }
112
+        }
113
+    }
114
+    public static List<AdminBiz> getAdminBizList(){
115
+        return adminBizList;
116
+    }
117
+
118
+
119
+    // ---------------------- executor-server(jetty) ----------------------
120
+    private NetComServerFactory serverFactory = new NetComServerFactory();
121
+    private void initExecutorServer(int port, String ip, String appName, String accessToken) throws Exception {
122
+        NetComServerFactory.putService(ExecutorBiz.class, new ExecutorBizImpl());   // rpc-service, base on jetty
123
+        NetComServerFactory.setAccessToken(accessToken);
124
+        serverFactory.start(port, ip, appName); // jetty + registry
125
+    }
126
+    private void stopExecutorServer() {
127
+        serverFactory.destroy();    // jetty + registry + callback
81 128
     }
82 129
 
83
-    // ---------------------------------- init job handler ------------------------------------
84
-    public static ApplicationContext applicationContext;
85
-	@Override
86
-	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
87
-        XxlJobExecutor.applicationContext = applicationContext;
88 130
 
131
+    // ---------------------- job handler repository ----------------------
132
+    private static ConcurrentHashMap<String, IJobHandler> jobHandlerRepository = new ConcurrentHashMap<String, IJobHandler>();
133
+    public static IJobHandler registJobHandler(String name, IJobHandler jobHandler){
134
+        logger.info("xxl-job register jobhandler success, name:{}, jobHandler:{}", name, jobHandler);
135
+        return jobHandlerRepository.put(name, jobHandler);
136
+    }
137
+    public static IJobHandler loadJobHandler(String name){
138
+        return jobHandlerRepository.get(name);
139
+    }
140
+    private static void initJobHandlerRepository(ApplicationContext applicationContext){
89 141
         // init job handler action
90 142
         Map<String, Object> serviceBeanMap = applicationContext.getBeansWithAnnotation(JobHander.class);
91 143
 
@@ -101,27 +153,10 @@ public class XxlJobExecutor implements ApplicationContextAware, ApplicationListe
101 153
                 }
102 154
             }
103 155
         }
104
-	}
105
-
106
-    // ---------------------------------- destory job executor ------------------------------------
107
-    @Override
108
-    public void onApplicationEvent(ApplicationEvent applicationEvent) {
109
-        if(applicationEvent instanceof ContextClosedEvent){
110
-            // TODO
111
-        }
112 156
     }
113 157
 
114
-    // ---------------------------------- job handler repository
115
-    private static ConcurrentHashMap<String, IJobHandler> jobHandlerRepository = new ConcurrentHashMap<String, IJobHandler>();
116
-    public static IJobHandler registJobHandler(String name, IJobHandler jobHandler){
117
-        logger.info("xxl-job register jobhandler success, name:{}, jobHandler:{}", name, jobHandler);
118
-        return jobHandlerRepository.put(name, jobHandler);
119
-    }
120
-    public static IJobHandler loadJobHandler(String name){
121
-        return jobHandlerRepository.get(name);
122
-    }
123 158
 
124
-    // ---------------------------------- job thread repository
159
+    // ---------------------- job thread repository ----------------------
125 160
     private static ConcurrentHashMap<Integer, JobThread> JobThreadRepository = new ConcurrentHashMap<Integer, JobThread>();
126 161
     public static JobThread registJobThread(int jobId, IJobHandler handler, String removeOldReason){
127 162
         JobThread newJobThread = new JobThread(jobId, handler);

+ 5 - 5
xxl-job-core/src/main/java/com/xxl/job/core/glue/GlueFactory.java ファイルの表示

@@ -52,21 +52,21 @@ public class GlueFactory {
52 52
 				try {
53 53
 					Resource resource = AnnotationUtils.getAnnotation(field, Resource.class);
54 54
 					if (resource.name()!=null && resource.name().length()>0){
55
-						fieldBean = XxlJobExecutor.applicationContext.getBean(resource.name());
55
+						fieldBean = XxlJobExecutor.getApplicationContext().getBean(resource.name());
56 56
 					} else {
57
-						fieldBean = XxlJobExecutor.applicationContext.getBean(field.getName());
57
+						fieldBean = XxlJobExecutor.getApplicationContext().getBean(field.getName());
58 58
 					}
59 59
 				} catch (Exception e) {
60 60
 				}
61 61
 				if (fieldBean==null ) {
62
-					fieldBean = XxlJobExecutor.applicationContext.getBean(field.getType());
62
+					fieldBean = XxlJobExecutor.getApplicationContext().getBean(field.getType());
63 63
 				}
64 64
 			} else if (AnnotationUtils.getAnnotation(field, Autowired.class) != null) {
65 65
 				Qualifier qualifier = AnnotationUtils.getAnnotation(field, Qualifier.class);
66 66
 				if (qualifier!=null && qualifier.value()!=null && qualifier.value().length()>0) {
67
-					fieldBean = XxlJobExecutor.applicationContext.getBean(qualifier.value());
67
+					fieldBean = XxlJobExecutor.getApplicationContext().getBean(qualifier.value());
68 68
 				} else {
69
-					fieldBean = XxlJobExecutor.applicationContext.getBean(field.getType());
69
+					fieldBean = XxlJobExecutor.getApplicationContext().getBean(field.getType());
70 70
 				}
71 71
 			}
72 72
 			

+ 3 - 4
xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java ファイルの表示

@@ -1,7 +1,6 @@
1 1
 package com.xxl.job.core.handler.impl;
2 2
 
3 3
 import com.xxl.job.core.biz.model.ReturnT;
4
-import com.xxl.job.core.executor.XxlJobExecutor;
5 4
 import com.xxl.job.core.glue.GlueTypeEnum;
6 5
 import com.xxl.job.core.handler.IJobHandler;
7 6
 import com.xxl.job.core.log.XxlJobFileAppender;
@@ -37,17 +36,17 @@ public class ScriptJobHandler extends IJobHandler {
37 36
         String scriptFileName = null;
38 37
         if (GlueTypeEnum.GLUE_SHELL == glueType) {
39 38
             cmd = "bash";
40
-            scriptFileName = XxlJobExecutor.logPath.concat("gluesource/").concat(String.valueOf(jobId)).concat("_").concat(String.valueOf(glueUpdatetime)).concat(".sh");
39
+            scriptFileName = XxlJobFileAppender.logPath.concat("gluesource/").concat(String.valueOf(jobId)).concat("_").concat(String.valueOf(glueUpdatetime)).concat(".sh");
41 40
         } else if (GlueTypeEnum.GLUE_PYTHON == glueType) {
42 41
             cmd = "python";
43
-            scriptFileName = XxlJobExecutor.logPath.concat("gluesource/").concat(String.valueOf(jobId)).concat("_").concat(String.valueOf(glueUpdatetime)).concat(".py");
42
+            scriptFileName = XxlJobFileAppender.logPath.concat("gluesource/").concat(String.valueOf(jobId)).concat("_").concat(String.valueOf(glueUpdatetime)).concat(".py");
44 43
         }
45 44
 
46 45
         // make script file
47 46
         ScriptUtil.markScriptFile(scriptFileName, gluesource);
48 47
 
49 48
         // log file
50
-        String logFileName = XxlJobExecutor.logPath.concat(XxlJobFileAppender.contextHolder.get());
49
+        String logFileName = XxlJobFileAppender.logPath.concat(XxlJobFileAppender.contextHolder.get());
51 50
 
52 51
         // invoke
53 52
         XxlJobLogger.log("----------- script file:"+ scriptFileName +" -----------");

+ 5 - 5
xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobFileAppender.java ファイルの表示

@@ -1,7 +1,6 @@
1 1
 package com.xxl.job.core.log;
2 2
 
3 3
 import com.xxl.job.core.biz.model.LogResult;
4
-import com.xxl.job.core.executor.XxlJobExecutor;
5 4
 import org.slf4j.Logger;
6 5
 import org.slf4j.LoggerFactory;
7 6
 
@@ -20,7 +19,8 @@ public class XxlJobFileAppender {
20 19
 	//public static ThreadLocal<String> contextHolder = new ThreadLocal<String>();
21 20
 	public static final InheritableThreadLocal<String> contextHolder = new InheritableThreadLocal<String>();
22 21
 	public static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
23
-	
22
+	public static String logPath = "/data/applogs/xxl-job/jobhandler/";
23
+
24 24
 	/**
25 25
 	 * log filename: yyyy-MM-dd/9999.log
26 26
 	 *
@@ -31,7 +31,7 @@ public class XxlJobFileAppender {
31 31
 	public static String makeLogFileName(Date triggerDate, int logId) {
32 32
 
33 33
         // filePath/
34
-        File filePathDir = new File(XxlJobExecutor.logPath);
34
+        File filePathDir = new File(logPath);
35 35
         if (!filePathDir.exists()) {
36 36
             filePathDir.mkdirs();
37 37
         }
@@ -66,7 +66,7 @@ public class XxlJobFileAppender {
66 66
 		if (logFileName==null || logFileName.trim().length()==0) {
67 67
 			return;
68 68
 		}
69
-		File logFile = new File(XxlJobExecutor.logPath, logFileName);
69
+		File logFile = new File(logPath, logFileName);
70 70
 
71 71
 		if (!logFile.exists()) {
72 72
 			try {
@@ -111,7 +111,7 @@ public class XxlJobFileAppender {
111 111
 		if (logFileName==null || logFileName.trim().length()==0) {
112 112
             return new LogResult(fromLineNum, 0, "readLog fail, logFile not found", true);
113 113
 		}
114
-		File logFile = new File(XxlJobExecutor.logPath, logFileName);
114
+		File logFile = new File(logPath, logFileName);
115 115
 
116 116
 		if (!logFile.exists()) {
117 117
             return new LogResult(fromLineNum, 0, "readLog fail, logFile not exists", true);

+ 30 - 7
xxl-job-core/src/main/java/com/xxl/job/core/rpc/codec/RpcRequest.java ファイルの表示

@@ -12,12 +12,14 @@ public class RpcRequest implements Serializable{
12 12
 	
13 13
 	private String serverAddress;
14 14
 	private long createMillisTime;
15
+	private String accessToken;
15 16
 
16 17
     private String className;
17 18
     private String methodName;
18 19
     private Class<?>[] parameterTypes;
19 20
     private Object[] parameters;
20 21
 
22
+
21 23
 	public String getServerAddress() {
22 24
 		return serverAddress;
23 25
 	}
@@ -29,41 +31,62 @@ public class RpcRequest implements Serializable{
29 31
 	public long getCreateMillisTime() {
30 32
 		return createMillisTime;
31 33
 	}
34
+
32 35
 	public void setCreateMillisTime(long createMillisTime) {
33 36
 		this.createMillisTime = createMillisTime;
34 37
 	}
38
+
39
+	public String getAccessToken() {
40
+		return accessToken;
41
+	}
42
+
43
+	public void setAccessToken(String accessToken) {
44
+		this.accessToken = accessToken;
45
+	}
46
+
35 47
 	public String getClassName() {
36 48
 		return className;
37 49
 	}
50
+
38 51
 	public void setClassName(String className) {
39 52
 		this.className = className;
40 53
 	}
54
+
41 55
 	public String getMethodName() {
42 56
 		return methodName;
43 57
 	}
58
+
44 59
 	public void setMethodName(String methodName) {
45 60
 		this.methodName = methodName;
46 61
 	}
62
+
47 63
 	public Class<?>[] getParameterTypes() {
48 64
 		return parameterTypes;
49 65
 	}
66
+
50 67
 	public void setParameterTypes(Class<?>[] parameterTypes) {
51 68
 		this.parameterTypes = parameterTypes;
52 69
 	}
70
+
53 71
 	public Object[] getParameters() {
54 72
 		return parameters;
55 73
 	}
74
+
56 75
 	public void setParameters(Object[] parameters) {
57 76
 		this.parameters = parameters;
58 77
 	}
59
-	
78
+
60 79
 	@Override
61 80
 	public String toString() {
62
-		return "NettyRequest [serverAddress=" + serverAddress + ", createMillisTime="
63
-				+ createMillisTime + ", className=" + className
64
-				+ ", methodName=" + methodName + ", parameterTypes="
65
-				+ Arrays.toString(parameterTypes) + ", parameters="
66
-				+ Arrays.toString(parameters) + "]";
81
+		return "RpcRequest{" +
82
+				"serverAddress='" + serverAddress + '\'' +
83
+				", createMillisTime=" + createMillisTime +
84
+				", accessToken='" + accessToken + '\'' +
85
+				", className='" + className + '\'' +
86
+				", methodName='" + methodName + '\'' +
87
+				", parameterTypes=" + Arrays.toString(parameterTypes) +
88
+				", parameters=" + Arrays.toString(parameters) +
89
+				'}';
67 90
 	}
68
-	
91
+
69 92
 }

+ 6 - 3
xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/NetComClientProxy.java ファイルの表示

@@ -20,11 +20,13 @@ public class NetComClientProxy implements FactoryBean<Object> {
20 20
 
21 21
 	// ---------------------- config ----------------------
22 22
 	private Class<?> iface;
23
-	String serverAddress;
24
-	JettyClient client = new JettyClient();
25
-	public NetComClientProxy(Class<?> iface, String serverAddress) {
23
+	private String serverAddress;
24
+	private String accessToken;
25
+	private JettyClient client = new JettyClient();
26
+	public NetComClientProxy(Class<?> iface, String serverAddress, String accessToken) {
26 27
 		this.iface = iface;
27 28
 		this.serverAddress = serverAddress;
29
+		this.accessToken = accessToken;
28 30
 	}
29 31
 
30 32
 	@Override
@@ -39,6 +41,7 @@ public class NetComClientProxy implements FactoryBean<Object> {
39 41
 						RpcRequest request = new RpcRequest();
40 42
 	                    request.setServerAddress(serverAddress);
41 43
 	                    request.setCreateMillisTime(System.currentTimeMillis());
44
+	                    request.setAccessToken(accessToken);
42 45
 	                    request.setClassName(method.getDeclaringClass().getName());
43 46
 	                    request.setMethodName(method.getName());
44 47
 	                    request.setParameterTypes(method.getParameterTypes());

+ 10 - 2
xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/NetComServerFactory.java ファイルの表示

@@ -30,14 +30,18 @@ public class NetComServerFactory  {
30 30
 		server.destroy();
31 31
 	}
32 32
 
33
-	// ---------------------- server init ----------------------
33
+	// ---------------------- server instance ----------------------
34 34
 	/**
35 35
 	 * init local rpc service map
36 36
 	 */
37 37
 	private static Map<String, Object> serviceMap = new HashMap<String, Object>();
38
+	private static String accessToken;
38 39
 	public static void putService(Class<?> iface, Object serviceBean){
39 40
 		serviceMap.put(iface.getName(), serviceBean);
40 41
 	}
42
+	public static void setAccessToken(String accessToken) {
43
+		NetComServerFactory.accessToken = accessToken;
44
+	}
41 45
 	public static RpcResponse invokeService(RpcRequest request, Object serviceBean) {
42 46
 		if (serviceBean==null) {
43 47
 			serviceBean = serviceMap.get(request.getClassName());
@@ -49,7 +53,11 @@ public class NetComServerFactory  {
49 53
 		RpcResponse response = new RpcResponse();
50 54
 
51 55
 		if (System.currentTimeMillis() - request.getCreateMillisTime() > 180000) {
52
-			response.setResult(new ReturnT<String>(ReturnT.FAIL_CODE, "the timestamp difference between admin and executor exceeds the limit."));
56
+			response.setResult(new ReturnT<String>(ReturnT.FAIL_CODE, "The timestamp difference between admin and executor exceeds the limit."));
57
+			return response;
58
+		}
59
+		if (accessToken!=null && accessToken.trim().length()>0 && !accessToken.trim().equals(request.getAccessToken())) {
60
+			response.setResult(new ReturnT<String>(ReturnT.FAIL_CODE, "The access token[" + request.getAccessToken() + "] is wrong."));
53 61
 			return response;
54 62
 		}
55 63
 

+ 2 - 2
xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/jetty/client/JettyClient.java ファイルの表示

@@ -21,8 +21,8 @@ public class JettyClient {
21 21
 
22 22
 			// reqURL
23 23
 			String reqURL = request.getServerAddress();
24
-			if (reqURL!=null && reqURL.toLowerCase().indexOf("http://")==-1) {
25
-				reqURL = "http://" + request.getServerAddress() + "/";
24
+			if (reqURL!=null && reqURL.toLowerCase().indexOf("http")==-1) {
25
+				reqURL = "http://" + request.getServerAddress() + "/";	// IP:PORT, need parse to url
26 26
 			}
27 27
 
28 28
 			// remote invoke

+ 17 - 1
xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/jetty/server/JettyServer.java ファイルの表示

@@ -1,6 +1,7 @@
1 1
 package com.xxl.job.core.rpc.netcom.jetty.server;
2 2
 
3 3
 import com.xxl.job.core.thread.ExecutorRegistryThread;
4
+import com.xxl.job.core.thread.TriggerCallbackThread;
4 5
 import org.eclipse.jetty.server.Connector;
5 6
 import org.eclipse.jetty.server.Handler;
6 7
 import org.eclipse.jetty.server.Server;
@@ -38,10 +39,16 @@ public class JettyServer {
38 39
 				server.setHandler(handlerc);
39 40
 
40 41
 				try {
41
-					// Start the server
42
+					// Start server
42 43
 					server.start();
43 44
 					logger.info(">>>>>>>>>>>> xxl-job jetty server start success at port:{}.", port);
45
+
46
+					// Start Registry-Server
44 47
 					ExecutorRegistryThread.getInstance().start(port, ip, appName);
48
+
49
+					// Start Callback-Server
50
+					TriggerCallbackThread.getInstance().start();
51
+
45 52
 					server.join();	// block until thread stopped
46 53
 					logger.info(">>>>>>>>>>> xxl-rpc server join success, netcon={}, port={}", JettyServer.class.getName(), port);
47 54
 				} catch (Exception e) {
@@ -56,6 +63,8 @@ public class JettyServer {
56 63
 	}
57 64
 
58 65
 	public void destroy() {
66
+
67
+		// destroy server
59 68
 		if (server != null) {
60 69
 			try {
61 70
 				server.stop();
@@ -67,6 +76,13 @@ public class JettyServer {
67 76
 		if (thread.isAlive()) {
68 77
 			thread.interrupt();
69 78
 		}
79
+
80
+		// destroy Registry-Server
81
+		ExecutorRegistryThread.getInstance().toStop();
82
+
83
+		// destroy Callback-Server
84
+		TriggerCallbackThread.getInstance().toStop();
85
+
70 86
 		logger.info(">>>>>>>>>>> xxl-rpc server destroy success, netcon={}", JettyServer.class.getName());
71 87
 	}
72 88
 

+ 2 - 9
xxl-job-core/src/main/java/com/xxl/job/core/thread/ExecutorRegistryThread.java ファイルの表示

@@ -5,7 +5,6 @@ import com.xxl.job.core.biz.model.RegistryParam;
5 5
 import com.xxl.job.core.biz.model.ReturnT;
6 6
 import com.xxl.job.core.enums.RegistryConfig;
7 7
 import com.xxl.job.core.executor.XxlJobExecutor;
8
-import com.xxl.job.core.rpc.netcom.NetComClientProxy;
9 8
 import com.xxl.job.core.util.IpUtil;
10 9
 import org.slf4j.Logger;
11 10
 import org.slf4j.LoggerFactory;
@@ -32,7 +31,7 @@ public class ExecutorRegistryThread extends Thread {
32 31
             logger.warn(">>>>>>>>>>>> xxl-job, executor registry config fail, appName is null.");
33 32
             return;
34 33
         }
35
-        if (XxlJobExecutor.adminAddresses==null || XxlJobExecutor.adminAddresses.trim().length()==0) {
34
+        if (XxlJobExecutor.getAdminBizList() == null) {
36 35
             logger.warn(">>>>>>>>>>>> xxl-job, executor registry config fail, adminAddresses is null.");
37 36
             return;
38 37
         }
@@ -49,15 +48,10 @@ public class ExecutorRegistryThread extends Thread {
49 48
             @Override
50 49
             public void run() {
51 50
                 while (!toStop) {
52
-
53 51
                     try {
54 52
                         RegistryParam registryParam = new RegistryParam(RegistryConfig.RegistType.EXECUTOR.name(), appName, executorAddress);
55
-
56
-                        for (String addressUrl: XxlJobExecutor.adminAddresses.split(",")) {
57
-                            String apiUrl = addressUrl.concat("/api");
58
-
53
+                        for (AdminBiz adminBiz: XxlJobExecutor.getAdminBizList()) {
59 54
                             try {
60
-                                AdminBiz adminBiz = (AdminBiz) new NetComClientProxy(AdminBiz.class, apiUrl).getObject();
61 55
                                 ReturnT<String> registryResult = adminBiz.registry(registryParam);
62 56
                                 if (registryResult!=null && ReturnT.SUCCESS_CODE == registryResult.getCode()) {
63 57
                                     registryResult = ReturnT.SUCCESS;
@@ -71,7 +65,6 @@ public class ExecutorRegistryThread extends Thread {
71 65
                             }
72 66
 
73 67
                         }
74
-
75 68
                     } catch (Exception e) {
76 69
                         logger.error(e.getMessage(), e);
77 70
                     }

+ 2 - 6
xxl-job-core/src/main/java/com/xxl/job/core/thread/TriggerCallbackThread.java ファイルの表示

@@ -4,7 +4,6 @@ import com.xxl.job.core.biz.AdminBiz;
4 4
 import com.xxl.job.core.biz.model.HandleCallbackParam;
5 5
 import com.xxl.job.core.biz.model.ReturnT;
6 6
 import com.xxl.job.core.executor.XxlJobExecutor;
7
-import com.xxl.job.core.rpc.netcom.NetComClientProxy;
8 7
 import org.slf4j.Logger;
9 8
 import org.slf4j.LoggerFactory;
10 9
 
@@ -43,17 +42,14 @@ public class TriggerCallbackThread {
43 42
                             callbackParamList.add(callback);
44 43
 
45 44
                             // valid
46
-                            if (XxlJobExecutor.adminAddresses==null || XxlJobExecutor.adminAddresses.trim().length()==0) {
45
+                            if (XxlJobExecutor.getAdminBizList()==null) {
47 46
                                 logger.warn(">>>>>>>>>>>> xxl-job callback fail, adminAddresses is null, callbackParamList:{}", callbackParamList);
48 47
                                 continue;
49 48
                             }
50 49
 
51 50
                             // callback, will retry if error
52
-                            for (String addressUrl: XxlJobExecutor.adminAddresses.split(",")) {
53
-                                String apiUrl = addressUrl.concat("/api");
54
-
51
+                            for (AdminBiz adminBiz: XxlJobExecutor.getAdminBizList()) {
55 52
                                 try {
56
-                                    AdminBiz adminBiz = (AdminBiz) new NetComClientProxy(AdminBiz.class, apiUrl).getObject();
57 53
                                     ReturnT<String> callbackResult = adminBiz.callback(callbackParamList);
58 54
                                     if (callbackResult!=null && ReturnT.SUCCESS_CODE == callbackResult.getCode()) {
59 55
                                         callbackResult = ReturnT.SUCCESS;

+ 2 - 2
xxl-job-core/src/main/java/com/xxl/job/core/util/ScriptUtil.java ファイルの表示

@@ -1,6 +1,6 @@
1 1
 package com.xxl.job.core.util;
2 2
 
3
-import com.xxl.job.core.executor.XxlJobExecutor;
3
+import com.xxl.job.core.log.XxlJobFileAppender;
4 4
 import org.apache.commons.exec.CommandLine;
5 5
 import org.apache.commons.exec.DefaultExecutor;
6 6
 import org.apache.commons.exec.PumpStreamHandler;
@@ -28,7 +28,7 @@ public class ScriptUtil {
28 28
      */
29 29
     public static void markScriptFile(String scriptFileName, String content) throws IOException {
30 30
         // filePath/
31
-        File filePathDir = new File(XxlJobExecutor.logPath);
31
+        File filePathDir = new File(XxlJobFileAppender.logPath);
32 32
         if (!filePathDir.exists()) {
33 33
             filePathDir.mkdirs();
34 34
         }

+ 3 - 21
xxl-job-executor-example/pom.xml ファイルの表示

@@ -4,7 +4,7 @@
4 4
 	<parent>
5 5
 		<groupId>com.xuxueli</groupId>
6 6
 		<artifactId>xxl-job</artifactId>
7
-		<version>1.8.1-SNAPSHOT</version>
7
+		<version>1.8.2-SNAPSHOT</version>
8 8
 	</parent>
9 9
 	<artifactId>xxl-job-executor-example</artifactId>
10 10
 	<packaging>war</packaging>
@@ -13,12 +13,8 @@
13 13
 	<description>Executor project for spring boot.</description>
14 14
 	<url>http://www.xuxueli.com/</url>
15 15
 
16
-	<properties>
17
-		<spring.version>3.2.17.RELEASE</spring.version>
18
-	</properties>
19
-
20 16
 	<dependencies>
21
-		<!-- springframe start -->
17
+		<!-- spring-webmvc -->
22 18
 		<dependency>
23 19
 			<groupId>org.springframework</groupId>
24 20
 			<artifactId>spring-webmvc</artifactId>
@@ -29,20 +25,7 @@
29 25
 		<dependency>
30 26
 			<groupId>org.slf4j</groupId>
31 27
 			<artifactId>slf4j-log4j12</artifactId>
32
-			<version>1.7.21</version>
33
-		</dependency>
34
-		
35
-		<!-- c3p0 -->
36
-		<dependency>
37
-			<groupId>com.mchange</groupId>
38
-			<artifactId>c3p0</artifactId>
39
-			<version>0.9.5.2</version>
40
-		</dependency>
41
-		<!-- mysql-connector -->
42
-		<dependency>
43
-			<groupId>mysql</groupId>
44
-			<artifactId>mysql-connector-java</artifactId>
45
-			<version>5.1.29</version>
28
+			<version>${slf4j-api.version}</version>
46 29
 		</dependency>
47 30
 		
48 31
 		<!-- xxl-job-core -->
@@ -51,7 +34,6 @@
51 34
 			<artifactId>xxl-job-core</artifactId>
52 35
 			<version>${project.parent.version}</version>
53 36
 		</dependency>
54
-		
55 37
 	</dependencies>
56 38
 
57 39
 </project>

+ 2 - 0
xxl-job-executor-example/src/main/resources/applicationcontext-xxl-job.xml ファイルの表示

@@ -33,6 +33,8 @@
33 33
 		<property name="adminAddresses" value="${xxl.job.admin.addresses}" />
34 34
 		<!-- 执行器日志路径[必填] -->
35 35
 		<property name="logPath" value="${xxl.job.executor.logpath}" />
36
+		<!-- 访问令牌,非空则进行匹配校验[选填] -->
37
+		<property name="accessToken" value="${xxl.job.accessToken}" />
36 38
 	</bean>
37 39
 
38 40
 

+ 4 - 1
xxl-job-executor-example/src/main/resources/xxl-job-executor.properties ファイルの表示

@@ -7,4 +7,7 @@ xxl.job.executor.ip=
7 7
 xxl.job.executor.port=9999
8 8
 
9 9
 ### xxl-job log path
10
-xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler/
10
+xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler/
11
+
12
+### xxl-job, access token
13
+xxl.job.accessToken=

+ 4 - 1
xxl-job-executor-example/src/test/java/com/xxl/executor/test/DemoJobHandlerTest.java ファイルの表示

@@ -8,6 +8,8 @@ import com.xxl.job.core.glue.GlueTypeEnum;
8 8
 import com.xxl.job.core.rpc.netcom.NetComClientProxy;
9 9
 
10 10
 /**
11
+ * executor-api client, test
12
+ *
11 13
  * Created by xuxueli on 17/5/12.
12 14
  */
13 15
 public class DemoJobHandlerTest {
@@ -31,7 +33,8 @@ public class DemoJobHandlerTest {
31 33
         triggerParam.setLogDateTim(System.currentTimeMillis());
32 34
 
33 35
         // do remote trigger
34
-        ExecutorBiz executorBiz = (ExecutorBiz) new NetComClientProxy(ExecutorBiz.class, "127.0.0.1:9999").getObject();
36
+        String accessToken = null;
37
+        ExecutorBiz executorBiz = (ExecutorBiz) new NetComClientProxy(ExecutorBiz.class, "127.0.0.1:9999", null).getObject();
35 38
         ReturnT<String> runResult = executorBiz.run(triggerParam);
36 39
     }
37 40
 

+ 25 - 24
xxl-job-executor-springboot-example/pom.xml ファイルの表示

@@ -6,7 +6,7 @@
6 6
     <parent>
7 7
         <groupId>com.xuxueli</groupId>
8 8
         <artifactId>xxl-job</artifactId>
9
-        <version>1.8.1-SNAPSHOT</version>
9
+        <version>1.8.2-SNAPSHOT</version>
10 10
     </parent>
11 11
     <artifactId>xxl-job-executor-springboot-example</artifactId>
12 12
     <packaging>jar</packaging>
@@ -16,8 +16,6 @@
16 16
     <url>http://www.xuxueli.com/</url>
17 17
 
18 18
     <properties>
19
-        <spring-boot.version>1.3.8.RELEASE</spring-boot.version>
20
-
21 19
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
22 20
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
23 21
         <java.version>1.7</java.version>
@@ -33,41 +31,44 @@
33 31
                 <type>pom</type>
34 32
                 <scope>import</scope>
35 33
             </dependency>
34
+
35
+            <!-- jetty -->
36
+            <dependency>
37
+                <groupId>org.eclipse.jetty</groupId>
38
+                <artifactId>jetty-server</artifactId>
39
+                <version>${jetty-server.version}</version>
40
+            </dependency>
41
+            <dependency>
42
+                <groupId>org.eclipse.jetty</groupId>
43
+                <artifactId>jetty-util</artifactId>
44
+                <version>${jetty-server.version}</version>
45
+            </dependency>
46
+            <dependency>
47
+                <groupId>org.eclipse.jetty</groupId>
48
+                <artifactId>jetty-http</artifactId>
49
+                <version>${jetty-server.version}</version>
50
+            </dependency>
51
+            <dependency>
52
+                <groupId>org.eclipse.jetty</groupId>
53
+                <artifactId>jetty-io</artifactId>
54
+                <version>${jetty-server.version}</version>
55
+            </dependency>
56
+
36 57
         </dependencies>
37 58
     </dependencyManagement>
38 59
 
39 60
     <dependencies>
40
-
41
-        <dependency>
42
-            <groupId>org.springframework.boot</groupId>
43
-            <artifactId>spring-boot-starter</artifactId>
44
-        </dependency>
45
-
46
-        <!-- spring-boot-starter-web (提供了对web的支持,包含了spring webmvc和tomcat等web开发的特性) -->
61
+        <!-- spring-boot-starter-web (spring-webmvc + tomcat) -->
47 62
         <dependency>
48 63
             <groupId>org.springframework.boot</groupId>
49 64
             <artifactId>spring-boot-starter-web</artifactId>
50 65
         </dependency>
51
-
52 66
         <dependency>
53 67
             <groupId>org.springframework.boot</groupId>
54 68
             <artifactId>spring-boot-starter-test</artifactId>
55 69
             <scope>test</scope>
56 70
         </dependency>
57 71
 
58
-        <!-- c3p0 -->
59
-        <dependency>
60
-            <groupId>com.mchange</groupId>
61
-            <artifactId>c3p0</artifactId>
62
-            <version>0.9.5.2</version>
63
-        </dependency>
64
-        <!-- mysql-connector -->
65
-        <dependency>
66
-            <groupId>mysql</groupId>
67
-            <artifactId>mysql-connector-java</artifactId>
68
-            <version>5.1.29</version>
69
-        </dependency>
70
-
71 72
         <!-- xxl-job-core -->
72 73
         <dependency>
73 74
             <groupId>com.xuxueli</groupId>

+ 3 - 0
xxl-job-executor-springboot-example/src/main/java/com/xxl/job/executor/core/config/XxlJobConfig.java ファイルの表示

@@ -34,6 +34,8 @@ public class XxlJobConfig {
34 34
     @Value("${xxl.job.executor.logpath}")
35 35
     private String logpath;
36 36
 
37
+    @Value("${xxl.job.accessToken}")
38
+    private String accessToken;
37 39
 
38 40
     @Bean(initMethod = "start", destroyMethod = "destroy")
39 41
     public XxlJobExecutor xxlJobExecutor() {
@@ -44,6 +46,7 @@ public class XxlJobConfig {
44 46
         xxlJobExecutor.setAppName(appname);
45 47
         xxlJobExecutor.setAdminAddresses(addresses);
46 48
         xxlJobExecutor.setLogPath(logpath);
49
+        xxlJobExecutor.setAccessToken(accessToken);
47 50
         return xxlJobExecutor;
48 51
     }
49 52
 

+ 3 - 0
xxl-job-executor-springboot-example/src/main/resources/application.properties ファイルの表示

@@ -15,3 +15,6 @@ xxl.job.executor.port=9998
15 15
 
16 16
 ### xxl-job log path
17 17
 xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler/
18
+
19
+### xxl-job, access token
20
+xxl.job.accessToken=