diff --git a/.github/ISSUE_TEMPLATE b/.github/ISSUE_TEMPLATE new file mode 100644 index 00000000..bed3a337 --- /dev/null +++ b/.github/ISSUE_TEMPLATE @@ -0,0 +1,11 @@ +Please answer some questions before submitting your issue. Thanks! + +### Which version of XXL-JOB do you using? + +### Expected behavior + +### Actual behavior + +### Steps to reproduce the behavior + +### Other information \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE b/.github/PULL_REQUEST_TEMPLATE new file mode 100644 index 00000000..cadcc886 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE @@ -0,0 +1,14 @@ +**What kind of change does this PR introduce?** (check at least one) + +- [ ] Bugfix +- [ ] Feature +- [ ] Code style update +- [ ] Refactor +- [ ] Build-related changes +- [ ] Other, please describe: + + +**The description of the PR:** + + +**Other information:** \ No newline at end of file diff --git a/README.md b/README.md index 2439e46e..f6c240ed 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,48 @@ - -# 分布式任务调度平台XXL-JOB - -[![Build Status](https://travis-ci.org/xuxueli/xxl-job.svg?branch=master)](https://travis-ci.org/xuxueli/xxl-job) -[![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/) -[![GitHub release](https://img.shields.io/github/release/xuxueli/xxl-job.svg)](https://github.com/xuxueli/xxl-job/releases) -[![License](https://img.shields.io/badge/license-GPLv3-blue.svg)](http://www.gnu.org/licenses/gpl-3.0.html) -[![Gitter](https://badges.gitter.im/xuxueli/xxl-job.svg)](https://gitter.im/xuxueli/xxl-job?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) +

+ + + +

XXL-JOB

+

+ XXL-JOB, a lightweight distributed task scheduling framework. +
+ -- Browse xuxueli's website. -- +
+
+ + + + + + + + + + + + + + + +

+

+ + +## Intro +XXL-JOB is a lightweight distributed task scheduling framework. +It's core design goal is to develop quickly and learn simple, lightweight, and easy to expand. +Now, it's already open source, and many companies use it in production environments, real "out-of-the-box". XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。 -![输入图片说明](https://raw.githubusercontent.com/xuxueli/xxl-job/master/doc/images/xxl-logo.jpg "在这里输入图片标题") -### 文档 +## Documentation + +- [中文文档](https://github.com/xuxueli/xxl-job/blob/master/doc/XXL-JOB官方文档.md) +- [Englis Documentation](https://github.com/xuxueli/xxl-job/blob/master/doc/XXL-JOB-Englis-Documentation.md) -- 官方文档:[XXL-JOB官方文档](https://github.com/xuxueli/xxl-job/blob/master/doc/XXL-JOB官方文档.md) -### 特性 +## Features - 1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手; - 2、动态:支持动态修改任务状态、暂停/恢复任务,以及终止运行中任务,即时生效; - 3、调度中心HA(中心式):调度采用中心式设计,“调度中心”基于集群Quartz实现,可保证调度中心HA; @@ -41,11 +68,8 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 - 23、分片广播任务:执行器集群部署时,任务路由策略选择"分片广播"情况下,一次任务调度将会广播触发对应集群中所有执行器执行一次任务,同时传递分片参数;可根据分片参数开发分片任务; - 24、动态分片:分片广播任务以执行器为维度进行分片,支持动态扩容执行器集群从而动态增加分片数量,协同进行业务处理;在进行大数据量业务操作时可显著提升任务处理能力和速度。 -### 架构图 -![输入图片说明](https://static.oschina.net/uploads/img/201707/17190028_aEE2.png "在这里输入图片标题") - -### 发展 +## Development 于2015年中,我在github上创建XXL-JOB项目仓库并提交第一个commit,随之进行系统结构设计,UI选型,交互设计…… 于2015-11月,XXL-JOB终于RELEASE了第一个大版本V1.0, 随后我将之发布到OSCHINA,XXL-JOB在OSCHINA上获得了@红薯的热门推荐,同期分别达到了OSCHINA的“热门动弹”排行第一和git.oschina的开源软件月热度排行第一,在此特别感谢红薯,感谢大家的关注和支持。 @@ -56,7 +80,7 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 于2017-05-13,在上海举办的 "[第62期开源中国源创会](https://www.oschina.net/event/2236961)" 的 "放码过来" 环节,我登台对XXL-JOB做了演讲,台下五百位在场观众反响热烈([图文回顾](https://www.oschina.net/question/2686220_2242120) )。 -#### 我司大众点评目前已接入XXL-JOB,内部别名《Ferrari》(Ferrari基于XXL-JOB的V1.1版本定制而成,新接入应用推荐升级最新版本)。 +** 我司大众点评目前已接入XXL-JOB,内部别名《Ferrari》(Ferrari基于XXL-JOB的V1.1版本定制而成,新接入应用推荐升级最新版本)。** 据最新统计, 自2016-01-21接入至2017-07-07期间,该系统已调度约60万余次,表现优异。新接入应用推荐使用最新版本,因为经过数个大版本的更新,系统的任务模型、UI交互模型以及底层调度通讯模型都有了较大的优化和提升,核心功能更加稳定高效。 至今,XXL-JOB已接入多家公司的线上产品线,接入场景如电商业务,O2O业务和大数据作业等,截止2016-07-19为止,XXL-JOB已接入的公司包括不限于: @@ -94,60 +118,43 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 - 31、四川互宜达科技有限公司 - 32、钱包行云(北京)科技有限公司 - 33、重庆欣才集团 + - 34、咪咕互动娱乐有限公司(中国移动) + - 35、北京诺亦腾科技有限公司 + - 36、增长引擎(北京)信息技术有限公司 - …… 欢迎大家的关注和使用,XXL-JOB也将拥抱变化,持续发展。 -### 下载 - -#### 源码仓库地址 (将会在两个git仓库同步发布最新代码) - -源码仓库地址 | Release Download ---- | --- -[https://github.com/xuxueli/xxl-job](https://github.com/xuxueli/xxl-job) | [Download](https://github.com/xuxueli/xxl-job/releases) -[http://git.oschina.net/xuxueli0323/xxl-job](http://git.oschina.net/xuxueli0323/xxl-job) | [Download](http://git.oschina.net/xuxueli0323/xxl-job/releases) - - -#### 中央仓库地址 (最新Release版本:1.8.0) - -``` - - - com.xuxueli - xxl-job-core - 1.8.0 - -``` - -#### 博客地址 (将会在两个博客同步更新文档) - -- [oschina地址](http://my.oschina.net/xuxueli/blog/690978) -- [cnblogs地址](http://www.cnblogs.com/xuxueli/p/5021979.html) +## Communication -#### 技术交流群 (仅作技术交流) +- 腾讯QQ群(6):399758605 +- 腾讯QQ群(5):138274130 (群即将满,请加群6) +- 腾讯QQ群(4):464762661 (群即将满,请加群6) +- 腾讯QQ群(3):242151780 (群即将满,请加群6) +- 腾讯QQ群(2):438249535 (群即将满,请加群6) +- 腾讯QQ群(1):367260654 (群即将满,请加群6) +- [Gitter](https://gitter.im/xuxueli/xxl-job) -- 群5:138274130 [![image](http://pub.idqqimg.com/wpa/images/group.png)](http://shang.qq.com/wpa/qunwpa?idkey=a3f3aea7e5943e7a24e9726495747ddc19bccd3592d7a70ecb5a97b616062241 ) -- 群4:464762661 (群即将满,请加群5) -- 群3:242151780 (群即将满,请加群5) -- 群2:438249535 (群即将满,请加群5) -- 群1:367260654 (群即将满,请加群5) +## Issue +如有问题可在 [Github Issues](https://github.com/xuxueli/xxl-job/issues/) 上提问,也可以加入上文技术交流群; -### 报告问题 -XXL-JOB托管在Github上,如有问题可在 [ISSUES](https://github.com/xuxueli/xxl-job/issues/) 上提问,也可以加入上文技术交流群; +## User Registration +登记仅为了产品推广,产品开源免费。 +请接入使用的公司或个人进行用户登记 [登记地址](https://github.com/xuxueli/xxl-job/issues/1 ) 。 -### 接入登记(登记仅为了推广,产品开源免费) -更多接入公司,欢迎在github [登记](https://github.com/xuxueli/xxl-job/issues/1 ) -### 开源协议 +## Copyright and license 产品开源免费,并且将持续提供免费的社区技术支持。个人或企业内部可自由的接入和使用。 XXL-JOB采用GPLv3协议,目的是为了保证用户的自由使用权利。协议可避免专利申请的特殊危险 "the GPL assures that patents cannot be used to render the program non-free.(摘自GPLv3)"。 +Copyright (c) 2015-present, xuxueli. --- -### 支持的话可以扫一扫,支持 [XXL系列](https://github.com/xuxueli) 的建设:) +## Donate +支持的话可以扫一扫,请作者喝杯咖啡吧:) 微信:![输入图片说明](https://static.oschina.net/uploads/img/201707/07214300_qhxT.png "在这里输入图片标题") 支付宝:![输入图片说明](http://images2015.cnblogs.com/blog/554415/201605/554415-20160513183306234-1939652116.png "在这里输入图片标题") diff --git a/doc/XXL-JOB-Englis-Documentation.md b/doc/XXL-JOB-Englis-Documentation.md new file mode 100644 index 00000000..a4e668c0 --- /dev/null +++ b/doc/XXL-JOB-Englis-Documentation.md @@ -0,0 +1,11 @@ +# 《A lightweight distributed task scheduling framework. "XXL-JOB"》 + +[![Build Status](https://travis-ci.org/xuxueli/xxl-job.svg?branch=master)](https://travis-ci.org/xuxueli/xxl-job) +[![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/) +[![GitHub release](https://img.shields.io/github/release/xuxueli/xxl-job.svg)](https://github.com/xuxueli/xxl-job/releases) +[![License](https://img.shields.io/badge/license-GPLv3-blue.svg)](http://www.gnu.org/licenses/gpl-3.0.html) +[![Gitter](https://badges.gitter.im/xuxueli/xxl-job.svg)](https://gitter.im/xuxueli/xxl-job?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) + +## 1、Intro + +### 1.1 overview diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 486a4c54..e4d6318d 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -86,13 +86,16 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 - 31、四川互宜达科技有限公司 - 32、钱包行云(北京)科技有限公司 - 33、重庆欣才集团 + - 34、咪咕互动娱乐有限公司(中国移动) + - 35、北京诺亦腾科技有限公司 + - 36、增长引擎(北京)信息技术有限公司 - …… 欢迎大家的关注和使用,XXL-JOB也将拥抱变化,持续发展。 ### 1.4 下载 -#### 源码仓库地址 (将会在两个git仓库同步发布最新代码) +#### 源码仓库地址 源码仓库地址 | Release Download --- | --- @@ -100,35 +103,36 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 [http://git.oschina.net/xuxueli0323/xxl-job](http://git.oschina.net/xuxueli0323/xxl-job) | [Download](http://git.oschina.net/xuxueli0323/xxl-job/releases) -#### 中央仓库地址 (最新Release版本:1.8.0) +#### 中央仓库地址 ``` com.xuxueli xxl-job-core - 1.8.0 + 1.8.1 ``` -#### 博客地址 (将会在两个博客同步更新文档) +#### 博客地址 - [oschina地址](http://my.oschina.net/xuxueli/blog/690978) - [cnblogs地址](http://www.cnblogs.com/xuxueli/p/5021979.html) -#### 技术交流群 (仅作技术交流) +#### 技术交流 -- 群5:138274130 [![image](http://pub.idqqimg.com/wpa/images/group.png)](http://shang.qq.com/wpa/qunwpa?idkey=a3f3aea7e5943e7a24e9726495747ddc19bccd3592d7a70ecb5a97b616062241 ) -- 群4:464762661 (群即将满,请加群5) -- 群3:242151780 (群即将满,请加群5) -- 群2:438249535 (群即将满,请加群5) -- 群1:367260654 (群即将满,请加群5) +- 腾讯QQ群(6):399758605 +- 腾讯QQ群(5):138274130 (群即将满,请加群6) +- 腾讯QQ群(4):464762661 (群即将满,请加群6) +- 腾讯QQ群(3):242151780 (群即将满,请加群6) +- 腾讯QQ群(2):438249535 (群即将满,请加群6) +- 腾讯QQ群(1):367260654 (群即将满,请加群6) ### 1.5 环境 - JDK:1.7+ - Servlet/JSP Spec:3.1/2.3 -- Tomcat:8.5.x/Jetty9.2 -- Spring-boot:1.3.8/Spring4.x +- Tomcat:8.5.x/Jetty9.2.x +- Spring-boot:1.5.x/Spring4.x - Mysql:5.6+ - Maven:3+ @@ -136,18 +140,18 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 ## 二、快速入门 ### 2.1 初始化“调度数据库” -请下载项目源码并解压,获取 "调度数据库初始化SQL脚本" 并执行即可。正常情况下应该生成16张表,脚本文件位置为: +请下载项目源码并解压,获取 "调度数据库初始化SQL脚本" 并执行即可,正常情况下应该生成16张表。 - 源码解压根目录\xxl-job\db\tables_xxl_job.sql +"调度数据库初始化SQL脚本" 位置为: + + /xxl-job/db/tables_xxl_job.sql 调度中心支持集群部署,集群情况下各节点务必连接同一个mysql实例; 如果mysql做主从,调度中心集群节点务必强制走主库; ### 2.2 编译源码 -解压源码,按照maven格式将源码导入IDE, 使用maven进行编译即可,源码结构如下图所示: - -![输入图片说明](https://static.oschina.net/uploads/img/201705/11214348_aGgr.png "在这里输入图片标题") +解压源码,按照maven格式将源码导入IDE, 使用maven进行编译即可,源码结构如下: xxl-job-admin:调度中心 xxl-job-core:公共依赖 @@ -160,14 +164,16 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 作用:统一管理任务调度平台上调度任务,负责触发调度执行。 #### 步骤一:调度中心配置: -配置文件以及配置属性如下图所示。 +调度中心配置文件地址: -![输入图片说明](https://static.oschina.net/uploads/img/201705/11214752_Ifvp.png "在这里输入图片标题") + /xxl-job/xxl-job-admin/src/main/resources/xxl-job-admin.properties +调度中心配置内容说明: + ### 调度中心JDBC链接:链接地址请保持和 2.1章节 所创建的调度数据库的地址一致 xxl.job.db.driverClass=com.mysql.jdbc.Driver - xxl.job.db.url=jdbc:mysql://localhost:3306/xxl-job?useUnicode=true&characterEncoding=UTF-8 + xxl.job.db.url=jdbc:mysql://localhost:3306/xxl-job?useUnicode=true&characterEncoding=UTF-8 xxl.job.db.user=root xxl.job.db.password=root_pwd @@ -179,9 +185,12 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 xxl.job.mail.sendFrom=ovono802302@163.com xxl.job.mail.sendNick=《任务调度平台XXL-JOB》 - # 登录账号 + ### 登录账号 xxl.job.login.username=admin xxl.job.login.password=123456 + + ### 调度中心通讯TOKEN,非空时启用 + xxl.job.accessToken= #### 步骤二:部署项目: 如果已经正确进行上述配置,可将项目编译打war包并部署到tomcat中。 @@ -191,6 +200,13 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 至此“调度中心”项目已经部署成功。 +#### 步骤三:调度中心集群(可选): +调度中心支持集群部署,提升调度系统可用性。 + +集群部署唯一要求为:保证每个集群节点配置(db和登陆账号等)保持一致。调度中心通过db配置区分不同集群。 + +调度中心在集群部署时可通过nginx负载均衡,此时可以为集群分配一个域名。该域名一方面可以用于访问,另一方面也可以用于配置执行器回调地址。 + ### 2.4 配置部署“执行器项目” “执行器”项目:xxl-job-executor-example (如新建执行器项目,可参考该Example执行器项目的配置步骤;) @@ -200,10 +216,11 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 确认pom文件中引入了 "xxl-job-core" 的maven依赖; #### 步骤二:执行器配置 -配置文件以及配置属性如下图所示。 +执行器配置配置文件地址: -![输入图片说明](https://static.oschina.net/uploads/img/201705/11214800_7G3o.png "在这里输入图片标题") + /xxl-job/xxl-job-executor-example/src/main/resources/xxl-job-executor.properties +执行器配置配置内容说明: ### xxl-job admin address list:调度中心部署跟地址:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调"。 xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin @@ -215,6 +232,9 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 ### xxl-job log path:执行器运行日志文件存储的磁盘位置 xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler/ + + ### xxl-job, access token:执行器通讯TOKEN,非空时启用 + xxl.job.accessToken= #### 步骤三:执行器组件配置 @@ -225,7 +245,7 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 1、JobHandler 扫描路径:自动扫描容器中JobHandler; 2、执行器Excutor配置:执行器核心配置; -#### 步骤四:部署项目: +#### 步骤四:部署执行器项目: 如果已经正确进行上述配置,可将执行器项目编译打部署,系统提供两个执行器example项目,选择其中一个即可,各自的部署方式如下。 xxl-job-executor-example:项目编译打包成WAR包,并部署到tomcat中。 @@ -233,6 +253,11 @@ XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是 至此“执行器”项目已经部署结束。 +#### 步骤五:执行器集群(可选): +执行器支持集群部署,提升调度系统可用性,同时提升任务处理能力。 + +集群部署唯一要求为:保证集群中每个执行器的配置项 "xxl.job.admin.addresses/调度中心地址" 保持一致,执行器根据该配置进行执行器自动注册等操作。 + ### 2.5 开发第一个任务“Hello World” 本示例以新建一个 “GLUE模式(Java)” 运行模式的任务为例。更多有关任务的详细配置,请查看“章节三:任务详解”。 @@ -706,6 +731,16 @@ XXL-JOB会为每次调度请求生成一个单独的日志文件,需要通过 - 1、分片任务场景:10个执行器的集群来处理10w条数据,每台机器只需要处理1w条数据,耗时降低10倍; - 2、广播任务场景:广播执行器机器运行shell脚本、广播集群节点进行缓存更新等 +#### 5、10 访问令牌(AccessToken) +为提升系统安全性,调度中心和执行器进行安全性校验,双方AccessToken匹配才允许通讯; + +调度中心和执行器,可通过配置项 "xxl.job.accessToken" 进行AccessToken的设置。 + +调度中心和执行器,如果需要正常通讯,只有两种设置; + +- 设置一:调度中心和执行器,均不设置AccessToken;关闭安全性校验; +- 设置二:调度中心和执行器,设置了相同的AccessToken; + ## 六、版本更新日志 #### 6.1 版本 V1.1.x,新特性[2015-12-05] @@ -896,41 +931,49 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段 - 10、执行日志,支持根据运行 "状态" 筛选日志; - 11、调度中心任务注册检测逻辑优化; -#### 6.18 版本 V1.8.1 特性[快照版本] +#### 6.18 版本 V1.8.1 特性[2017-07-30] - 1、分片广播任务:执行器集群部署时,任务路由策略选择"分片广播"情况下,一次任务调度将会广播触发集群中所有执行器执行一次任务,可根据分片参数处理分片任务; - 2、动态分片:分片广播任务以执行器为维度进行分片,支持动态扩容执行器集群从而动态增加分片数量,协同进行业务处理;在进行大数据量业务操作时可显著提升任务处理能力和速度。 - 3、执行器JobHandler禁止命名冲突; - 4、执行器集群地址列表进行自然排序; - 5、调度中心,DAO层代码精简优化并且新增测试用例覆盖; - 6、调度中心API服务改为自研RPC形式,统一底层通讯模型; +- 7、新增调度中心API服务测试Demo,方便在调度中心API扩展和测试; +- 8、任务列表页交互优化,更换执行器分组时自动刷新任务列表,新建任务时默认定位在当前执行器位置; +- 9、访问令牌(accessToken):为提升系统安全性,调度中心和执行器进行安全性校验,双方AccessToken匹配才允许通讯; +- 10、springboot版本执行器,升级至1.5.6.RELEASE版本; +- 11、统一maven依赖版本管理; #### TODO LIST - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限; -- 2、任务分片路由:分片采用一致性Hash算法计算出尽量稳定的分片顺序,即使注册机器存在波动也不会引起分批分片顺序大的波动; -- 3、失败重试优化:目前失败重试逻辑为,在本次调度请求失败后重新执行一次请求逻辑。优化点为针对调度和执行失败时均做失败重试,重试时重新触发一次完整调度,这将可能导致失败是调度死循环,考虑中。 +- 2、任务分片路由:分片采用一致性Hash算法计算出尽量稳定的分片顺序,即使注册机器存在波动也不会引起分批分片顺序大的波动;目前采用IP自然排序,可以满足需求,待定; +- 3、失败重试优化:目前失败重试逻辑为,在本次调度请求失败后重新执行一次请求逻辑。优化点为针对调度和执行失败时均做失败重试,重试时重新触发一次完整调度,这将可能导致失败是调度死循环,待定。 - 4、回调失败写文件,查看日志时读文件确认,重启后回调确认; - 5、任务依赖,流程图,子任务+会签任务,各节点日志; - 6、调度任务优先级; - 7、移除quartz依赖,重写调度模块:新增或恢复任务时将下次执行记录插入delayqueue,调度中心集群竞争分布式锁,成功节点批量加载到期delayqueue数据,批量执行。 -- 8、任务执行结果回调失败后重试:待定,防止回调死循环; -- 9、springboot 和 docker镜像,并且推送docker镜像到中央仓库,更进一步实现产品开箱即用; -- 10、安全校验:调度中心和执行器约定公共密匙,只有密匙一致才允许相互通讯; +- 8、springboot 和 docker镜像,并且推送docker镜像到中央仓库,更进一步实现产品开箱即用; +- 9、国际化:调度中心界面 + 官方文档,新增英文版本。 +- 10、执行器摘除:执行器销毁时,主动通知调度中心并摘除对应执行器节点,提高执行器状态感知的时效性。 ## 七、其他 #### 7.1 报告问题 XXL-JOB托管在Github上,如有问题可在 [ISSUES](https://github.com/xuxueli/xxl-job/issues/) 上提问,也可以加入上文技术交流群; -#### 7.2 接入登记(登记仅为了推广,产品开源免费) -更多接入公司,欢迎在github [登记](https://github.com/xuxueli/xxl-job/issues/1 ) +#### 7.2 用户接入登记 +登记仅为了产品推广,产品开源免费。 +请接入使用的公司或个人进行用户登记 [登记地址](https://github.com/xuxueli/xxl-job/issues/1 ) 。 -#### 7.3 开源协议 +#### 7.3 开源协议和版权 产品开源免费,并且将持续提供免费的社区技术支持。个人或企业内部可自由的接入和使用。 XXL-JOB采用GPLv3协议,目的是为了保证用户的自由使用权利。协议可避免专利申请的特殊危险 "the GPL assures that patents cannot be used to render the program non-free.(摘自GPLv3)"。 +Copyright (c) 2015-present, xuxueli. --- -#### 支持的话可以扫一扫,支持 [XXL系列](https://github.com/xuxueli) 的建设:) +#### 捐赠 +支持的话可以扫一扫,请作者喝杯咖啡吧:) 微信:![输入图片说明](https://static.oschina.net/uploads/img/201707/07214300_qhxT.png "在这里输入图片标题") 支付宝:![输入图片说明](http://images2015.cnblogs.com/blog/554415/201605/554415-20160513183306234-1939652116.png "在这里输入图片标题") diff --git a/pom.xml b/pom.xml index 3927bceb..2d4a3f66 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.xuxueli xxl-job - 1.8.1-SNAPSHOT + 1.8.2-SNAPSHOT pom ${project.artifactId} @@ -17,6 +17,37 @@ xxl-job-executor-springboot-example + + 3.0.1 + 2.2 + + 3.2.18.RELEASE + 1.9.13 + 1.8.7 + 1.7.25 + 2.3.20 + 4.11 + + 9.2.22.v20170606 + 4.0.38 + 4.3.6 + + 1.3 + 1.9.2 + 2.6 + + 0.9.5.2 + 5.1.29 + 1.2.2 + 3.2.8 + + 2.4.5 + 1.4.6 + 2.3.0 + + 1.5.6.RELEASE + + diff --git a/xxl-job-admin/pom.xml b/xxl-job-admin/pom.xml index 0202b80c..cbddeecc 100644 --- a/xxl-job-admin/pom.xml +++ b/xxl-job-admin/pom.xml @@ -4,15 +4,11 @@ com.xuxueli xxl-job - 1.8.1-SNAPSHOT + 1.8.2-SNAPSHOT xxl-job-admin war - - 3.2.17.RELEASE - - @@ -40,59 +36,59 @@ org.aspectj aspectjweaver - 1.8.7 + ${aspectjweaver.version} org.codehaus.jackson jackson-mapper-asl - 1.9.13 + ${jackson-mapper-asl.version} org.slf4j slf4j-log4j12 - 1.7.21 + ${slf4j-api.version} org.freemarker freemarker - 2.3.20 + ${freemarker.version} commons-beanutils commons-beanutils - 1.9.2 + ${commons-beanutils.version} commons-lang commons-lang - 2.6 + ${commons-lang.version} javax.servlet javax.servlet-api - 3.0.1 + ${javax.servlet-api.version} javax.servlet.jsp jsp-api - 2.2 + ${jsp-api.version} junit junit - 4.11 + ${junit.version} test @@ -100,45 +96,46 @@ com.mchange c3p0 - 0.9.5.2 + ${c3p0.version} + + + + mysql + mysql-connector-java + ${mysql-connector-java.version} org.mybatis mybatis-spring - 1.2.2 + ${mybatis-spring.version} org.mybatis mybatis - 3.2.8 - - - - mysql - mysql-connector-java - 5.1.29 + ${mybatis.version} + org.apache.httpcomponents httpclient - 4.3.6 + ${httpclient.version} javax.mail mail - 1.4.6 + ${mail.version} org.quartz-scheduler quartz - 2.3.0 + ${quartz.version} diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java index d86fa4c3..a31bb293 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java @@ -1,6 +1,7 @@ package com.xxl.job.admin.controller; import com.xxl.job.admin.controller.annotation.PermessionLimit; +import com.xxl.job.core.biz.AdminBiz; import com.xxl.job.core.rpc.codec.RpcRequest; import com.xxl.job.core.rpc.codec.RpcResponse; import com.xxl.job.core.rpc.netcom.NetComServerFactory; @@ -46,7 +47,7 @@ public class JobApiController { } } - @RequestMapping("/api") + @RequestMapping(AdminBiz.MAPPING) @PermessionLimit(limit=false) public void api(HttpServletRequest request, HttpServletResponse response) throws IOException { diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java index ffac4a27..0962d397 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java @@ -33,7 +33,7 @@ public class JobInfoController { private XxlJobService xxlJobService; @RequestMapping - public String index(Model model) { + public String index(Model model, @RequestParam(required = false, defaultValue = "-1") int jobGroup) { // 枚举-字典 model.addAttribute("ExecutorRouteStrategyEnum", ExecutorRouteStrategyEnum.values()); // 路由策略-列表 @@ -44,6 +44,8 @@ public class JobInfoController { // 任务组 List jobGroupList = xxlJobGroupDao.findAll(); model.addAttribute("JobGroupList", jobGroupList); + model.addAttribute("jobGroup", jobGroup); + return "jobinfo/jobinfo.index"; } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java index 4a961ef2..5d801891 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java @@ -3,6 +3,7 @@ package com.xxl.job.admin.controller; import com.xxl.job.admin.core.model.XxlJobGroup; import com.xxl.job.admin.core.model.XxlJobInfo; import com.xxl.job.admin.core.model.XxlJobLog; +import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler; import com.xxl.job.admin.dao.XxlJobGroupDao; import com.xxl.job.admin.dao.XxlJobInfoDao; import com.xxl.job.admin.dao.XxlJobLogDao; @@ -12,6 +13,8 @@ import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.rpc.netcom.NetComClientProxy; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.time.DateUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @@ -32,6 +35,7 @@ import java.util.Map; @Controller @RequestMapping("/joblog") public class JobLogController { + private static Logger logger = LoggerFactory.getLogger(JobLogController.class); @Resource private XxlJobGroupDao xxlJobGroupDao; @@ -116,7 +120,7 @@ public class JobLogController { @ResponseBody public ReturnT logDetailCat(String executorAddress, long triggerTime, int logId, int fromLineNum){ try { - ExecutorBiz executorBiz = (ExecutorBiz) new NetComClientProxy(ExecutorBiz.class, executorAddress).getObject(); + ExecutorBiz executorBiz = XxlJobDynamicScheduler.getExecutorBiz(executorAddress); ReturnT logResult = executorBiz.log(triggerTime, logId, fromLineNum); // is end @@ -129,7 +133,7 @@ public class JobLogController { return logResult; } catch (Exception e) { - e.printStackTrace(); + logger.error(e.getMessage(), e); return new ReturnT(ReturnT.FAIL_CODE, e.getMessage()); } } @@ -148,14 +152,14 @@ public class JobLogController { } // request of kill - ExecutorBiz executorBiz = null; + ReturnT runResult = null; try { - executorBiz = (ExecutorBiz) new NetComClientProxy(ExecutorBiz.class, log.getExecutorAddress()).getObject(); + ExecutorBiz executorBiz = XxlJobDynamicScheduler.getExecutorBiz(log.getExecutorAddress()); + runResult = executorBiz.kill(jobInfo.getId()); } catch (Exception e) { - e.printStackTrace(); - return new ReturnT(500, e.getMessage()); + logger.error(e.getMessage(), e); + runResult = new ReturnT(500, e.getMessage()); } - ReturnT runResult = executorBiz.kill(jobInfo.getId()); if (ReturnT.SUCCESS_CODE == runResult.getCode()) { log.setHandleCode(ReturnT.FAIL_CODE); diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouter.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouter.java index d762de3e..58dd40d8 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouter.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouter.java @@ -1,9 +1,7 @@ package com.xxl.job.admin.core.route; -import com.xxl.job.core.biz.ExecutorBiz; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.TriggerParam; -import com.xxl.job.core.rpc.netcom.NetComClientProxy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -24,30 +22,4 @@ public abstract class ExecutorRouter { */ public abstract ReturnT routeRun(TriggerParam triggerParam, ArrayList addressList); - /** - * run executor - * @param triggerParam - * @param address - * @return ReturnT.content: final address - */ - public static ReturnT runExecutor(TriggerParam triggerParam, String address){ - ReturnT runResult = null; - try { - ExecutorBiz executorBiz = (ExecutorBiz) new NetComClientProxy(ExecutorBiz.class, address).getObject(); - runResult = executorBiz.run(triggerParam); - } catch (Exception e) { - logger.error("", e); - runResult = new ReturnT(ReturnT.FAIL_CODE, ""+e ); - } - - StringBuffer runResultSB = new StringBuffer("触发调度:"); - runResultSB.append("
address:").append(address); - runResultSB.append("
code:").append(runResult.getCode()); - runResultSB.append("
msg:").append(runResult.getMsg()); - - runResult.setMsg(runResultSB.toString()); - runResult.setContent(address); - return runResult; - } - } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteBusyover.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteBusyover.java index e200c704..f3840a02 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteBusyover.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteBusyover.java @@ -1,10 +1,11 @@ package com.xxl.job.admin.core.route.strategy; import com.xxl.job.admin.core.route.ExecutorRouter; +import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler; +import com.xxl.job.admin.core.trigger.XxlJobTrigger; import com.xxl.job.core.biz.ExecutorBiz; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.TriggerParam; -import com.xxl.job.core.rpc.netcom.NetComClientProxy; import java.util.ArrayList; @@ -25,7 +26,7 @@ public class ExecutorRouteBusyover extends ExecutorRouter { // beat ReturnT idleBeatResult = null; try { - ExecutorBiz executorBiz = (ExecutorBiz) new NetComClientProxy(ExecutorBiz.class, address).getObject(); + ExecutorBiz executorBiz = XxlJobDynamicScheduler.getExecutorBiz(address); idleBeatResult = executorBiz.idleBeat(triggerParam.getJobId()); } catch (Exception e) { logger.error(e.getMessage(), e); @@ -40,7 +41,7 @@ public class ExecutorRouteBusyover extends ExecutorRouter { // beat success if (idleBeatResult.getCode() == ReturnT.SUCCESS_CODE) { - ReturnT runResult = runExecutor(triggerParam, address); + ReturnT runResult = XxlJobTrigger.runExecutor(triggerParam, address); idleBeatResultSB.append("

").append(runResult.getMsg()); // result diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteConsistentHash.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteConsistentHash.java index 3cbda46d..a6540f7e 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteConsistentHash.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteConsistentHash.java @@ -1,6 +1,7 @@ package com.xxl.job.admin.core.route.strategy; import com.xxl.job.admin.core.route.ExecutorRouter; +import com.xxl.job.admin.core.trigger.XxlJobTrigger; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.TriggerParam; @@ -82,7 +83,7 @@ public class ExecutorRouteConsistentHash extends ExecutorRouter { String address = route(triggerParam.getJobId(), addressList); // run executor - ReturnT runResult = runExecutor(triggerParam, address); + ReturnT runResult = XxlJobTrigger.runExecutor(triggerParam, address); runResult.setContent(address); return runResult; } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFailover.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFailover.java index 0c260b95..d78cbaca 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFailover.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFailover.java @@ -1,10 +1,11 @@ package com.xxl.job.admin.core.route.strategy; import com.xxl.job.admin.core.route.ExecutorRouter; +import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler; +import com.xxl.job.admin.core.trigger.XxlJobTrigger; import com.xxl.job.core.biz.ExecutorBiz; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.TriggerParam; -import com.xxl.job.core.rpc.netcom.NetComClientProxy; import java.util.ArrayList; @@ -25,7 +26,7 @@ public class ExecutorRouteFailover extends ExecutorRouter { // beat ReturnT beatResult = null; try { - ExecutorBiz executorBiz = (ExecutorBiz) new NetComClientProxy(ExecutorBiz.class, address).getObject(); + ExecutorBiz executorBiz = XxlJobDynamicScheduler.getExecutorBiz(address); beatResult = executorBiz.beat(); } catch (Exception e) { logger.error(e.getMessage(), e); @@ -40,7 +41,7 @@ public class ExecutorRouteFailover extends ExecutorRouter { // beat success if (beatResult.getCode() == ReturnT.SUCCESS_CODE) { - ReturnT runResult = runExecutor(triggerParam, address); + ReturnT runResult = XxlJobTrigger.runExecutor(triggerParam, address); beatResultSB.append("

").append(runResult.getMsg()); // result diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFirst.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFirst.java index b3a71672..e500825d 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFirst.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFirst.java @@ -1,7 +1,7 @@ package com.xxl.job.admin.core.route.strategy; -import com.xxl.job.admin.core.model.XxlJobLog; import com.xxl.job.admin.core.route.ExecutorRouter; +import com.xxl.job.admin.core.trigger.XxlJobTrigger; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.TriggerParam; @@ -23,7 +23,7 @@ public class ExecutorRouteFirst extends ExecutorRouter { String address = route(triggerParam.getJobId(), addressList); // run executor - ReturnT runResult = runExecutor(triggerParam, address); + ReturnT runResult = XxlJobTrigger.runExecutor(triggerParam, address); runResult.setContent(address); return runResult; } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLFU.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLFU.java index 7b34ea99..a10fac4c 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLFU.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLFU.java @@ -1,6 +1,7 @@ package com.xxl.job.admin.core.route.strategy; import com.xxl.job.admin.core.route.ExecutorRouter; +import com.xxl.job.admin.core.trigger.XxlJobTrigger; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.TriggerParam; @@ -62,7 +63,7 @@ public class ExecutorRouteLFU extends ExecutorRouter { String address = route(triggerParam.getJobId(), addressList); // run executor - ReturnT runResult = runExecutor(triggerParam, address); + ReturnT runResult = XxlJobTrigger.runExecutor(triggerParam, address); runResult.setContent(address); return runResult; } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLRU.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLRU.java index 7b7e0909..7e8f6176 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLRU.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLRU.java @@ -1,6 +1,7 @@ package com.xxl.job.admin.core.route.strategy; import com.xxl.job.admin.core.route.ExecutorRouter; +import com.xxl.job.admin.core.trigger.XxlJobTrigger; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.TriggerParam; @@ -61,7 +62,7 @@ public class ExecutorRouteLRU extends ExecutorRouter { String address = route(triggerParam.getJobId(), addressList); // run executor - ReturnT runResult = runExecutor(triggerParam, address); + ReturnT runResult = XxlJobTrigger.runExecutor(triggerParam, address); runResult.setContent(address); return runResult; } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLast.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLast.java index c94dc938..81b72534 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLast.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLast.java @@ -1,7 +1,7 @@ package com.xxl.job.admin.core.route.strategy; -import com.xxl.job.admin.core.model.XxlJobLog; import com.xxl.job.admin.core.route.ExecutorRouter; +import com.xxl.job.admin.core.trigger.XxlJobTrigger; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.TriggerParam; @@ -22,7 +22,7 @@ public class ExecutorRouteLast extends ExecutorRouter { String address = route(triggerParam.getJobId(), addressList); // run executor - ReturnT runResult = runExecutor(triggerParam, address); + ReturnT runResult = XxlJobTrigger.runExecutor(triggerParam, address); runResult.setContent(address); return runResult; } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRandom.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRandom.java index f27a6bda..1db6438a 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRandom.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRandom.java @@ -1,6 +1,7 @@ package com.xxl.job.admin.core.route.strategy; import com.xxl.job.admin.core.route.ExecutorRouter; +import com.xxl.job.admin.core.trigger.XxlJobTrigger; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.TriggerParam; @@ -25,7 +26,7 @@ public class ExecutorRouteRandom extends ExecutorRouter { String address = route(triggerParam.getJobId(), addressList); // run executor - ReturnT runResult = runExecutor(triggerParam, address); + ReturnT runResult = XxlJobTrigger.runExecutor(triggerParam, address); runResult.setContent(address); return runResult; } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRound.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRound.java index a09412c0..e12e7490 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRound.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRound.java @@ -1,6 +1,7 @@ package com.xxl.job.admin.core.route.strategy; import com.xxl.job.admin.core.route.ExecutorRouter; +import com.xxl.job.admin.core.trigger.XxlJobTrigger; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.TriggerParam; @@ -41,7 +42,7 @@ public class ExecutorRouteRound extends ExecutorRouter { String address = route(triggerParam.getJobId(), addressList); // run executor - ReturnT runResult = runExecutor(triggerParam, address); + ReturnT runResult = XxlJobTrigger.runExecutor(triggerParam, address); runResult.setContent(address); return runResult; } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/schedule/XxlJobDynamicScheduler.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/schedule/XxlJobDynamicScheduler.java index cac05002..f30d6144 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/schedule/XxlJobDynamicScheduler.java +++ b/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; import com.xxl.job.admin.dao.XxlJobLogDao; import com.xxl.job.admin.dao.XxlJobRegistryDao; import com.xxl.job.core.biz.AdminBiz; +import com.xxl.job.core.biz.ExecutorBiz; +import com.xxl.job.core.rpc.netcom.NetComClientProxy; import com.xxl.job.core.rpc.netcom.NetComServerFactory; import org.quartz.*; import org.quartz.Trigger.TriggerState; -import org.quartz.impl.matchers.GroupMatcher; import org.quartz.impl.triggers.CronTriggerImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; -import org.springframework.beans.factory.InitializingBean; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.util.Assert; -import java.util.*; +import java.util.Date; +import java.util.HashSet; +import java.util.concurrent.ConcurrentHashMap; /** * base quartz scheduler util * @author xuxueli 2015-12-19 16:13:53 */ -public final class XxlJobDynamicScheduler implements ApplicationContextAware, InitializingBean { +public final class XxlJobDynamicScheduler implements ApplicationContextAware { private static final Logger logger = LoggerFactory.getLogger(XxlJobDynamicScheduler.class); - - // Scheduler + + // ---------------------- param ---------------------- + + // scheduler private static Scheduler scheduler; public void setScheduler(Scheduler scheduler) { XxlJobDynamicScheduler.scheduler = scheduler; } - - // init - public void init() throws Exception { - // admin registry monitor run - JobRegistryMonitorHelper.getInstance().start(); - // admin monitor run - JobFailMonitorHelper.getInstance().start(); - - // rpc-service, base on spring-mvc - NetComServerFactory.putService(AdminBiz.class, XxlJobDynamicScheduler.adminBiz); + // accessToken + private static String accessToken; + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; } - - // destroy - public void destroy(){ - // admin registry stop - JobRegistryMonitorHelper.getInstance().toStop(); - // admin monitor stop - JobFailMonitorHelper.getInstance().toStop(); - } - - // xxlJobLogDao、xxlJobInfoDao + // dao public static XxlJobLogDao xxlJobLogDao; public static XxlJobInfoDao xxlJobInfoDao; public static XxlJobRegistryDao xxlJobRegistryDao; public static XxlJobGroupDao xxlJobGroupDao; public static AdminBiz adminBiz; + // ---------------------- applicationContext ---------------------- @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { XxlJobDynamicScheduler.xxlJobLogDao = applicationContext.getBean(XxlJobLogDao.class); @@ -73,48 +63,60 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware, In XxlJobDynamicScheduler.xxlJobGroupDao = applicationContext.getBean(XxlJobGroupDao.class); XxlJobDynamicScheduler.adminBiz = applicationContext.getBean(AdminBiz.class); } - - @Override - public void afterPropertiesSet() throws Exception { + + // ---------------------- init + destroy ---------------------- + public void init() throws Exception { + // admin registry monitor run + JobRegistryMonitorHelper.getInstance().start(); + + // admin monitor run + JobFailMonitorHelper.getInstance().start(); + + // admin-server(spring-mvc) + NetComServerFactory.putService(AdminBiz.class, XxlJobDynamicScheduler.adminBiz); + NetComServerFactory.setAccessToken(accessToken); + + // valid Assert.notNull(scheduler, "quartz scheduler is null"); logger.info(">>>>>>>>> init quartz scheduler success.[{}]", scheduler); - } - - // getJobKeys - @Deprecated - public static List> getJobList(){ - List> jobList = new ArrayList>(); - - try { - if (scheduler.getJobGroupNames()==null || scheduler.getJobGroupNames().size()==0) { - return null; - } - String groupName = scheduler.getJobGroupNames().get(0); - Set jobKeys = scheduler.getJobKeys(GroupMatcher.jobGroupEquals(groupName)); - if (jobKeys!=null && jobKeys.size()>0) { - for (JobKey jobKey : jobKeys) { - TriggerKey triggerKey = TriggerKey.triggerKey(jobKey.getName(), Scheduler.DEFAULT_GROUP); - Trigger trigger = scheduler.getTrigger(triggerKey); - JobDetail jobDetail = scheduler.getJobDetail(jobKey); - TriggerState triggerState = scheduler.getTriggerState(triggerKey); - Map jobMap = new HashMap(); - jobMap.put("TriggerKey", triggerKey); - jobMap.put("Trigger", trigger); - jobMap.put("JobDetail", jobDetail); - jobMap.put("TriggerState", triggerState); - jobList.add(jobMap); - } - } - - } catch (SchedulerException e) { - e.printStackTrace(); - return null; - } - return jobList; - } - - // fill job info + + public void destroy(){ + // admin registry stop + JobRegistryMonitorHelper.getInstance().toStop(); + + // admin monitor stop + JobFailMonitorHelper.getInstance().toStop(); + } + + // ---------------------- executor-client ---------------------- + private static ConcurrentHashMap executorBizRepository = new ConcurrentHashMap(); + public static ExecutorBiz getExecutorBiz(String address) throws Exception { + // valid + if (address==null || address.trim().length()==0) { + return null; + } + + // load-cache + address = address.trim(); + ExecutorBiz executorBiz = executorBizRepository.get(address); + if (executorBiz != null) { + return executorBiz; + } + + // set-cache + executorBiz = (ExecutorBiz) new NetComClientProxy(ExecutorBiz.class, address, accessToken).getObject(); + executorBizRepository.put(address, executorBiz); + return executorBiz; + } + + // ---------------------- schedule util ---------------------- + + /** + * fill job info + * + * @param jobInfo + */ public static void fillJobInfo(XxlJobInfo jobInfo) { // TriggerKey : name + group String group = String.valueOf(jobInfo.getJobGroup()); @@ -145,14 +147,28 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware, In } } - // check if exists + /** + * check if exists + * + * @param jobName + * @param jobGroup + * @return + * @throws SchedulerException + */ public static boolean checkExists(String jobName, String jobGroup) throws SchedulerException{ TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup); return scheduler.checkExists(triggerKey); } - // addJob 新增 - @SuppressWarnings("unchecked") + /** + * addJob + * + * @param jobName + * @param jobGroup + * @param cronExpression + * @return + * @throws SchedulerException + */ public static boolean addJob(String jobName, String jobGroup, String cronExpression) throws SchedulerException { // TriggerKey : name + group TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup); @@ -185,7 +201,15 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware, In return true; } - // reschedule + /** + * rescheduleJob + * + * @param jobGroup + * @param jobName + * @param cronExpression + * @return + * @throws SchedulerException + */ public static boolean rescheduleJob(String jobGroup, String jobName, String cronExpression) throws SchedulerException { // TriggerKey valid if_exists @@ -234,7 +258,14 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware, In return true; } - // unscheduleJob + /** + * unscheduleJob + * + * @param jobName + * @param jobGroup + * @return + * @throws SchedulerException + */ public static boolean removeJob(String jobName, String jobGroup) throws SchedulerException { // TriggerKey : name + group TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup); @@ -246,7 +277,14 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware, In return true; } - // Pause + /** + * pause + * + * @param jobName + * @param jobGroup + * @return + * @throws SchedulerException + */ public static boolean pauseJob(String jobName, String jobGroup) throws SchedulerException { // TriggerKey : name + group TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup); @@ -262,7 +300,14 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware, In return result; } - // resume + /** + * resume + * + * @param jobName + * @param jobGroup + * @return + * @throws SchedulerException + */ public static boolean resumeJob(String jobName, String jobGroup) throws SchedulerException { // TriggerKey : name + group TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup); @@ -278,7 +323,14 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware, In return result; } - // run + /** + * run + * + * @param jobName + * @param jobGroup + * @return + * @throws SchedulerException + */ public static boolean triggerJob(String jobName, String jobGroup) throws SchedulerException { // TriggerKey : name + group JobKey jobKey = new JobKey(jobName, jobGroup); @@ -294,5 +346,41 @@ public final class XxlJobDynamicScheduler implements ApplicationContextAware, In return result; } + /** + * finaAllJobList + * + * @return + *//* + @Deprecated + public static List> finaAllJobList(){ + List> jobList = new ArrayList>(); + + try { + if (scheduler.getJobGroupNames()==null || scheduler.getJobGroupNames().size()==0) { + return null; + } + String groupName = scheduler.getJobGroupNames().get(0); + Set jobKeys = scheduler.getJobKeys(GroupMatcher.jobGroupEquals(groupName)); + if (jobKeys!=null && jobKeys.size()>0) { + for (JobKey jobKey : jobKeys) { + TriggerKey triggerKey = TriggerKey.triggerKey(jobKey.getName(), Scheduler.DEFAULT_GROUP); + Trigger trigger = scheduler.getTrigger(triggerKey); + JobDetail jobDetail = scheduler.getJobDetail(jobKey); + TriggerState triggerState = scheduler.getTriggerState(triggerKey); + Map jobMap = new HashMap(); + jobMap.put("TriggerKey", triggerKey); + jobMap.put("Trigger", trigger); + jobMap.put("JobDetail", jobDetail); + jobMap.put("TriggerState", triggerState); + jobList.add(jobMap); + } + } + + } catch (SchedulerException e) { + e.printStackTrace(); + return null; + } + return jobList; + }*/ } \ No newline at end of file diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java index bb1e63d6..3b4d95fd 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java @@ -30,7 +30,7 @@ public class JobFailMonitorHelper { private LinkedBlockingQueue queue = new LinkedBlockingQueue(0xfff8); private Thread monitorThread; - private boolean toStop = false; + private volatile boolean toStop = false; public void start(){ monitorThread = new Thread(new Runnable() { diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryMonitorHelper.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryMonitorHelper.java index e43ec7a0..00613738 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryMonitorHelper.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryMonitorHelper.java @@ -28,7 +28,7 @@ public class JobRegistryMonitorHelper { } private Thread registryThread; - private boolean toStop = false; + private volatile boolean toStop = false; public void start(){ registryThread = new Thread(new Runnable() { @Override diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java index bbad8c1e..7c916b9b 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java @@ -5,9 +5,9 @@ import com.xxl.job.admin.core.model.XxlJobGroup; import com.xxl.job.admin.core.model.XxlJobInfo; import com.xxl.job.admin.core.model.XxlJobLog; import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum; -import com.xxl.job.admin.core.route.ExecutorRouter; import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler; import com.xxl.job.admin.core.thread.JobFailMonitorHelper; +import com.xxl.job.core.biz.ExecutorBiz; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.TriggerParam; import com.xxl.job.core.enums.ExecutorBlockStrategyEnum; @@ -90,12 +90,12 @@ public class XxlJobTrigger { triggerParam.setBroadcastTotal(addressList.size()); // update02 // 4.2、trigger-run (route run / trigger remote executor) - triggerResult = ExecutorRouter.runExecutor(triggerParam, address); // update03 + triggerResult = runExecutor(triggerParam, address); // update03 triggerMsgSb.append("

>>>>>>>>>>>触发调度<<<<<<<<<<<
").append(triggerResult.getMsg()); // 4.3、trigger (fail retry) if (triggerResult.getCode()!=ReturnT.SUCCESS_CODE && failStrategy == ExecutorFailStrategyEnum.FAIL_RETRY) { - triggerResult = ExecutorRouter.runExecutor(triggerParam, address); // update04 + triggerResult = runExecutor(triggerParam, address); // update04 triggerMsgSb.append("

>>>>>>>>>>>失败重试<<<<<<<<<<<
").append(triggerResult.getMsg()); } } @@ -179,4 +179,30 @@ public class XxlJobTrigger { logger.debug(">>>>>>>>>>> xxl-job trigger end, jobId:{}", jobLog.getId()); } + /** + * run executor + * @param triggerParam + * @param address + * @return ReturnT.content: final address + */ + public static ReturnT runExecutor(TriggerParam triggerParam, String address){ + ReturnT runResult = null; + try { + ExecutorBiz executorBiz = XxlJobDynamicScheduler.getExecutorBiz(address); + runResult = executorBiz.run(triggerParam); + } catch (Exception e) { + logger.error(e.getMessage(), e); + runResult = new ReturnT(ReturnT.FAIL_CODE, ""+e ); + } + + StringBuffer runResultSB = new StringBuffer("触发调度:"); + runResultSB.append("
address:").append(address); + runResultSB.append("
code:").append(runResult.getCode()); + runResultSB.append("
msg:").append(runResult.getMsg()); + + runResult.setMsg(runResultSB.toString()); + runResult.setContent(address); + return runResult; + } + } diff --git a/xxl-job-admin/src/main/resources/spring/applicationcontext-xxl-job-admin.xml b/xxl-job-admin/src/main/resources/spring/applicationcontext-xxl-job-admin.xml index efd483a0..79da65b3 100644 --- a/xxl-job-admin/src/main/resources/spring/applicationcontext-xxl-job-admin.xml +++ b/xxl-job-admin/src/main/resources/spring/applicationcontext-xxl-job-admin.xml @@ -65,6 +65,7 @@ + \ No newline at end of file diff --git a/xxl-job-admin/src/main/resources/xxl-job-admin.properties b/xxl-job-admin/src/main/resources/xxl-job-admin.properties index 74134e3a..ac5576f7 100644 --- a/xxl-job-admin/src/main/resources/xxl-job-admin.properties +++ b/xxl-job-admin/src/main/resources/xxl-job-admin.properties @@ -12,6 +12,9 @@ xxl.job.mail.password=asdfzxcv xxl.job.mail.sendFrom=ovono802302@163.com xxl.job.mail.sendNick=《任务调度平台XXL-JOB》 -# xxl-job login +### xxl-job login xxl.job.login.username=admin -xxl.job.login.password=123456 \ No newline at end of file +xxl.job.login.password=123456 + +### xxl-job, access token +xxl.job.accessToken= \ No newline at end of file diff --git a/xxl-job-admin/src/main/webapp/WEB-INF/template/common/common.macro.ftl b/xxl-job-admin/src/main/webapp/WEB-INF/template/common/common.macro.ftl index 9df01bda..e7db9c38 100644 --- a/xxl-job-admin/src/main/webapp/WEB-INF/template/common/common.macro.ftl +++ b/xxl-job-admin/src/main/webapp/WEB-INF/template/common/common.macro.ftl @@ -175,11 +175,12 @@ <#macro commonFooter >
- Powered by XXL-JOB 1.8.1(快照版) + Powered by XXL-JOB 1.8.2(快照版本)
diff --git a/xxl-job-admin/src/main/webapp/WEB-INF/template/help.ftl b/xxl-job-admin/src/main/webapp/WEB-INF/template/help.ftl index dc73f6d4..20db085c 100644 --- a/xxl-job-admin/src/main/webapp/WEB-INF/template/help.ftl +++ b/xxl-job-admin/src/main/webapp/WEB-INF/template/help.ftl @@ -31,33 +31,14 @@

简介:XXL-JOB


- github地址     + xuxueli +

+ github    

- oschina地址 -

- - 技术交流群5:138274130     - - 《xxl-javaer》(五群) - -

- - 技术交流群4:464762661     - (群即将满,请加群5) + oschina(文档中有交流群)

- 技术交流群3:242151780     - (群即将满,请加群5) -

- - 技术交流群2:438249535     - (群即将满,请加群5) -

- - 技术交流群1:367260654     - (群即将满,请加群5) -

diff --git a/xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl b/xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl index 1389ae4b..cdf48c66 100644 --- a/xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl +++ b/xxl-job-admin/src/main/webapp/WEB-INF/template/jobinfo/jobinfo.index.ftl @@ -37,7 +37,7 @@ 执行器 @@ -110,7 +110,7 @@
diff --git a/xxl-job-admin/src/main/webapp/static/js/jobinfo.index.1.js b/xxl-job-admin/src/main/webapp/static/js/jobinfo.index.1.js index 72922944..6c72f6eb 100644 --- a/xxl-job-admin/src/main/webapp/static/js/jobinfo.index.1.js +++ b/xxl-job-admin/src/main/webapp/static/js/jobinfo.index.1.js @@ -167,6 +167,13 @@ $(function() { jobTable.fnDraw(); }); + // jobGroup change + $('#jobGroup').on('change', function(){ + //reload + var jobGroup = $('#jobGroup').val(); + window.location.href = base_url + "/jobinfo?jobGroup=" + jobGroup; + }); + // job operate $("#job_list").on('click', '.job_operate',function() { var typeName; diff --git a/xxl-job-admin/src/test/java/com/xxl/job/dao/impl/AdminBizTest.java b/xxl-job-admin/src/test/java/com/xxl/job/dao/impl/AdminBizTest.java new file mode 100644 index 00000000..017dcdb1 --- /dev/null +++ b/xxl-job-admin/src/test/java/com/xxl/job/dao/impl/AdminBizTest.java @@ -0,0 +1,32 @@ +package com.xxl.job.dao.impl; + +import com.xxl.job.core.biz.AdminBiz; +import com.xxl.job.core.biz.model.RegistryParam; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.enums.RegistryConfig; +import com.xxl.job.core.rpc.netcom.NetComClientProxy; +import org.junit.Assert; +import org.junit.Test; + +/** + * admin-api client, test + * @author xuxueli 2017-07-28 22:14:52 + */ +public class AdminBizTest { + + @Test + public void registryTest() throws Exception { + + // admin-client + String addressUrl = "http://127.0.0.1:8080/xxl-job-admin".concat(AdminBiz.MAPPING); + String accessToken = null; + AdminBiz adminBiz = (AdminBiz) new NetComClientProxy(AdminBiz.class, addressUrl, accessToken).getObject(); + + // test executor registry + RegistryParam registryParam = new RegistryParam(RegistryConfig.RegistType.EXECUTOR.name(), "xxl-job-executor-example", "127.0.0.1:9999"); + ReturnT returnT = adminBiz.registry(registryParam); + Assert.assertTrue(returnT.getCode() == ReturnT.SUCCESS_CODE); + + } + +} diff --git a/xxl-job-core/pom.xml b/xxl-job-core/pom.xml index 723bc03a..27bee2fa 100644 --- a/xxl-job-core/pom.xml +++ b/xxl-job-core/pom.xml @@ -4,7 +4,7 @@ com.xuxueli xxl-job - 1.8.1-SNAPSHOT + 1.8.2-SNAPSHOT xxl-job-core jar @@ -13,56 +13,52 @@ A lightweight distributed task scheduling framework. http://www.xuxueli.com/ - - 3.2.17.RELEASE - - javax.servlet javax.servlet-api - 3.0.1 + ${javax.servlet-api.version} javax.servlet.jsp jsp-api - 2.2 + ${jsp-api.version} org.eclipse.jetty jetty-server - 9.2.21.v20170120 + ${jetty-server.version} org.slf4j slf4j-api - 1.7.21 + ${slf4j-api.version} com.caucho hessian - 4.0.38 + ${hessian.version} org.codehaus.jackson jackson-mapper-asl - 1.9.13 + ${jackson-mapper-asl.version} org.apache.httpcomponents httpclient - 4.3.6 + ${httpclient.version} @@ -76,14 +72,14 @@ org.codehaus.groovy groovy-all - 2.4.5 + ${groovy-all.version} org.apache.commons commons-exec - 1.3 + ${commons-exec.version} diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/biz/AdminBiz.java b/xxl-job-core/src/main/java/com/xxl/job/core/biz/AdminBiz.java index 1e4b8313..fcb4f101 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/biz/AdminBiz.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/biz/AdminBiz.java @@ -11,6 +11,8 @@ import java.util.List; */ public interface AdminBiz { + public static final String MAPPING = "/api"; + /** * callback * diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java b/xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java index 89c63de2..1d5cb849 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java @@ -1,36 +1,38 @@ package com.xxl.job.core.executor; +import com.xxl.job.core.biz.AdminBiz; import com.xxl.job.core.biz.ExecutorBiz; import com.xxl.job.core.biz.impl.ExecutorBizImpl; import com.xxl.job.core.handler.IJobHandler; import com.xxl.job.core.handler.annotation.JobHander; +import com.xxl.job.core.log.XxlJobFileAppender; +import com.xxl.job.core.rpc.netcom.NetComClientProxy; import com.xxl.job.core.rpc.netcom.NetComServerFactory; -import com.xxl.job.core.thread.ExecutorRegistryThread; import com.xxl.job.core.thread.JobThread; -import com.xxl.job.core.thread.TriggerCallbackThread; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; -import org.springframework.context.ApplicationEvent; -import org.springframework.context.ApplicationListener; -import org.springframework.context.event.ContextClosedEvent; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * Created by xuxueli on 2016/3/2 21:14. */ -public class XxlJobExecutor implements ApplicationContextAware, ApplicationListener { +public class XxlJobExecutor implements ApplicationContextAware { private static final Logger logger = LoggerFactory.getLogger(XxlJobExecutor.class); + // ---------------------- param ---------------------- private String ip; private int port = 9999; private String appName; - public static String adminAddresses; - public static String logPath; + private String adminAddresses; + private String accessToken; + private String logPath; public void setIp(String ip) { this.ip = ip; @@ -44,48 +46,98 @@ public class XxlJobExecutor implements ApplicationContextAware, ApplicationListe public void setAdminAddresses(String adminAddresses) { this.adminAddresses = adminAddresses; } + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } public void setLogPath(String logPath) { this.logPath = logPath; } - // ---------------------------------- job server ------------------------------------ - private NetComServerFactory serverFactory = new NetComServerFactory(); - public void start() throws Exception { - // executor start - NetComServerFactory.putService(ExecutorBiz.class, new ExecutorBizImpl()); // rpc-service, base on jetty - serverFactory.start(port, ip, appName); - // trigger callback thread start - TriggerCallbackThread.getInstance().start(); + // ---------------------- applicationContext ---------------------- + private static ApplicationContext applicationContext; + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + this.applicationContext = applicationContext; } - public void destroy(){ - // 1、executor registry thread stop - ExecutorRegistryThread.getInstance().toStop(); + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + + + // ---------------------- start + stop ---------------------- + public void start() throws Exception { + // init admin-client + initAdminBizList(adminAddresses, accessToken); + + // init executor-jobHandlerRepository + initJobHandlerRepository(applicationContext); - // 2、executor stop - serverFactory.destroy(); + // init logpath + if (logPath!=null && logPath.trim().length()>0) { + XxlJobFileAppender.logPath = logPath; + } - // 3、job thread repository destory + // init executor-server + initExecutorServer(port, ip, appName, accessToken); + } + public void destroy(){ + // destory JobThreadRepository if (JobThreadRepository.size() > 0) { for (Map.Entry item: JobThreadRepository.entrySet()) { - JobThread jobThread = item.getValue(); - jobThread.toStop("Web容器销毁终止"); - jobThread.interrupt(); - + removeJobThread(item.getKey(), "Web容器销毁终止"); } JobThreadRepository.clear(); } - // 4、trigger callback thread stop - TriggerCallbackThread.getInstance().toStop(); + // destory executor-server + stopExecutorServer(); + } + + + // ---------------------- admin-client ---------------------- + private static List adminBizList; + private static void initAdminBizList(String adminAddresses, String accessToken) throws Exception { + if (adminAddresses!=null && adminAddresses.trim().length()>0) { + for (String address: adminAddresses.trim().split(",")) { + if (address!=null && address.trim().length()>0) { + String addressUrl = address.concat(AdminBiz.MAPPING); + AdminBiz adminBiz = (AdminBiz) new NetComClientProxy(AdminBiz.class, addressUrl, accessToken).getObject(); + if (adminBizList == null) { + adminBizList = new ArrayList(); + } + adminBizList.add(adminBiz); + } + } + } + } + public static List getAdminBizList(){ + return adminBizList; + } + + + // ---------------------- executor-server(jetty) ---------------------- + private NetComServerFactory serverFactory = new NetComServerFactory(); + private void initExecutorServer(int port, String ip, String appName, String accessToken) throws Exception { + NetComServerFactory.putService(ExecutorBiz.class, new ExecutorBizImpl()); // rpc-service, base on jetty + NetComServerFactory.setAccessToken(accessToken); + serverFactory.start(port, ip, appName); // jetty + registry + } + private void stopExecutorServer() { + serverFactory.destroy(); // jetty + registry + callback } - // ---------------------------------- init job handler ------------------------------------ - public static ApplicationContext applicationContext; - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - XxlJobExecutor.applicationContext = applicationContext; + // ---------------------- job handler repository ---------------------- + private static ConcurrentHashMap jobHandlerRepository = new ConcurrentHashMap(); + public static IJobHandler registJobHandler(String name, IJobHandler jobHandler){ + logger.info("xxl-job register jobhandler success, name:{}, jobHandler:{}", name, jobHandler); + return jobHandlerRepository.put(name, jobHandler); + } + public static IJobHandler loadJobHandler(String name){ + return jobHandlerRepository.get(name); + } + private static void initJobHandlerRepository(ApplicationContext applicationContext){ // init job handler action Map serviceBeanMap = applicationContext.getBeansWithAnnotation(JobHander.class); @@ -101,27 +153,10 @@ public class XxlJobExecutor implements ApplicationContextAware, ApplicationListe } } } - } - - // ---------------------------------- destory job executor ------------------------------------ - @Override - public void onApplicationEvent(ApplicationEvent applicationEvent) { - if(applicationEvent instanceof ContextClosedEvent){ - // TODO - } } - // ---------------------------------- job handler repository - private static ConcurrentHashMap jobHandlerRepository = new ConcurrentHashMap(); - public static IJobHandler registJobHandler(String name, IJobHandler jobHandler){ - logger.info("xxl-job register jobhandler success, name:{}, jobHandler:{}", name, jobHandler); - return jobHandlerRepository.put(name, jobHandler); - } - public static IJobHandler loadJobHandler(String name){ - return jobHandlerRepository.get(name); - } - // ---------------------------------- job thread repository + // ---------------------- job thread repository ---------------------- private static ConcurrentHashMap JobThreadRepository = new ConcurrentHashMap(); public static JobThread registJobThread(int jobId, IJobHandler handler, String removeOldReason){ JobThread newJobThread = new JobThread(jobId, handler); diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/glue/GlueFactory.java b/xxl-job-core/src/main/java/com/xxl/job/core/glue/GlueFactory.java index e16ccf0a..ba2ba3f1 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/glue/GlueFactory.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/glue/GlueFactory.java @@ -52,21 +52,21 @@ public class GlueFactory { try { Resource resource = AnnotationUtils.getAnnotation(field, Resource.class); if (resource.name()!=null && resource.name().length()>0){ - fieldBean = XxlJobExecutor.applicationContext.getBean(resource.name()); + fieldBean = XxlJobExecutor.getApplicationContext().getBean(resource.name()); } else { - fieldBean = XxlJobExecutor.applicationContext.getBean(field.getName()); + fieldBean = XxlJobExecutor.getApplicationContext().getBean(field.getName()); } } catch (Exception e) { } if (fieldBean==null ) { - fieldBean = XxlJobExecutor.applicationContext.getBean(field.getType()); + fieldBean = XxlJobExecutor.getApplicationContext().getBean(field.getType()); } } else if (AnnotationUtils.getAnnotation(field, Autowired.class) != null) { Qualifier qualifier = AnnotationUtils.getAnnotation(field, Qualifier.class); if (qualifier!=null && qualifier.value()!=null && qualifier.value().length()>0) { - fieldBean = XxlJobExecutor.applicationContext.getBean(qualifier.value()); + fieldBean = XxlJobExecutor.getApplicationContext().getBean(qualifier.value()); } else { - fieldBean = XxlJobExecutor.applicationContext.getBean(field.getType()); + fieldBean = XxlJobExecutor.getApplicationContext().getBean(field.getType()); } } diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java b/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java index 362e3c05..60dc82a8 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java @@ -1,7 +1,6 @@ package com.xxl.job.core.handler.impl; import com.xxl.job.core.biz.model.ReturnT; -import com.xxl.job.core.executor.XxlJobExecutor; import com.xxl.job.core.glue.GlueTypeEnum; import com.xxl.job.core.handler.IJobHandler; import com.xxl.job.core.log.XxlJobFileAppender; @@ -37,17 +36,17 @@ public class ScriptJobHandler extends IJobHandler { String scriptFileName = null; if (GlueTypeEnum.GLUE_SHELL == glueType) { cmd = "bash"; - scriptFileName = XxlJobExecutor.logPath.concat("gluesource/").concat(String.valueOf(jobId)).concat("_").concat(String.valueOf(glueUpdatetime)).concat(".sh"); + scriptFileName = XxlJobFileAppender.logPath.concat("gluesource/").concat(String.valueOf(jobId)).concat("_").concat(String.valueOf(glueUpdatetime)).concat(".sh"); } else if (GlueTypeEnum.GLUE_PYTHON == glueType) { cmd = "python"; - scriptFileName = XxlJobExecutor.logPath.concat("gluesource/").concat(String.valueOf(jobId)).concat("_").concat(String.valueOf(glueUpdatetime)).concat(".py"); + scriptFileName = XxlJobFileAppender.logPath.concat("gluesource/").concat(String.valueOf(jobId)).concat("_").concat(String.valueOf(glueUpdatetime)).concat(".py"); } // make script file ScriptUtil.markScriptFile(scriptFileName, gluesource); // log file - String logFileName = XxlJobExecutor.logPath.concat(XxlJobFileAppender.contextHolder.get()); + String logFileName = XxlJobFileAppender.logPath.concat(XxlJobFileAppender.contextHolder.get()); // invoke XxlJobLogger.log("----------- script file:"+ scriptFileName +" -----------"); diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobFileAppender.java b/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobFileAppender.java index de429c38..bd210256 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobFileAppender.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobFileAppender.java @@ -1,7 +1,6 @@ package com.xxl.job.core.log; import com.xxl.job.core.biz.model.LogResult; -import com.xxl.job.core.executor.XxlJobExecutor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -20,7 +19,8 @@ public class XxlJobFileAppender { //public static ThreadLocal contextHolder = new ThreadLocal(); public static final InheritableThreadLocal contextHolder = new InheritableThreadLocal(); public static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - + public static String logPath = "/data/applogs/xxl-job/jobhandler/"; + /** * log filename: yyyy-MM-dd/9999.log * @@ -31,7 +31,7 @@ public class XxlJobFileAppender { public static String makeLogFileName(Date triggerDate, int logId) { // filePath/ - File filePathDir = new File(XxlJobExecutor.logPath); + File filePathDir = new File(logPath); if (!filePathDir.exists()) { filePathDir.mkdirs(); } @@ -66,7 +66,7 @@ public class XxlJobFileAppender { if (logFileName==null || logFileName.trim().length()==0) { return; } - File logFile = new File(XxlJobExecutor.logPath, logFileName); + File logFile = new File(logPath, logFileName); if (!logFile.exists()) { try { @@ -111,7 +111,7 @@ public class XxlJobFileAppender { if (logFileName==null || logFileName.trim().length()==0) { return new LogResult(fromLineNum, 0, "readLog fail, logFile not found", true); } - File logFile = new File(XxlJobExecutor.logPath, logFileName); + File logFile = new File(logPath, logFileName); if (!logFile.exists()) { return new LogResult(fromLineNum, 0, "readLog fail, logFile not exists", true); diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/rpc/codec/RpcRequest.java b/xxl-job-core/src/main/java/com/xxl/job/core/rpc/codec/RpcRequest.java index 05ce00bb..5b598659 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/rpc/codec/RpcRequest.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/rpc/codec/RpcRequest.java @@ -12,12 +12,14 @@ public class RpcRequest implements Serializable{ private String serverAddress; private long createMillisTime; + private String accessToken; private String className; private String methodName; private Class[] parameterTypes; private Object[] parameters; + public String getServerAddress() { return serverAddress; } @@ -29,41 +31,62 @@ public class RpcRequest implements Serializable{ public long getCreateMillisTime() { return createMillisTime; } + public void setCreateMillisTime(long createMillisTime) { this.createMillisTime = createMillisTime; } + + public String getAccessToken() { + return accessToken; + } + + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } + public String getClassName() { return className; } + public void setClassName(String className) { this.className = className; } + public String getMethodName() { return methodName; } + public void setMethodName(String methodName) { this.methodName = methodName; } + public Class[] getParameterTypes() { return parameterTypes; } + public void setParameterTypes(Class[] parameterTypes) { this.parameterTypes = parameterTypes; } + public Object[] getParameters() { return parameters; } + public void setParameters(Object[] parameters) { this.parameters = parameters; } - + @Override public String toString() { - return "NettyRequest [serverAddress=" + serverAddress + ", createMillisTime=" - + createMillisTime + ", className=" + className - + ", methodName=" + methodName + ", parameterTypes=" - + Arrays.toString(parameterTypes) + ", parameters=" - + Arrays.toString(parameters) + "]"; + return "RpcRequest{" + + "serverAddress='" + serverAddress + '\'' + + ", createMillisTime=" + createMillisTime + + ", accessToken='" + accessToken + '\'' + + ", className='" + className + '\'' + + ", methodName='" + methodName + '\'' + + ", parameterTypes=" + Arrays.toString(parameterTypes) + + ", parameters=" + Arrays.toString(parameters) + + '}'; } - + } diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/NetComClientProxy.java b/xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/NetComClientProxy.java index 62f9a6f1..b71a3534 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/NetComClientProxy.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/NetComClientProxy.java @@ -20,11 +20,13 @@ public class NetComClientProxy implements FactoryBean { // ---------------------- config ---------------------- private Class iface; - String serverAddress; - JettyClient client = new JettyClient(); - public NetComClientProxy(Class iface, String serverAddress) { + private String serverAddress; + private String accessToken; + private JettyClient client = new JettyClient(); + public NetComClientProxy(Class iface, String serverAddress, String accessToken) { this.iface = iface; this.serverAddress = serverAddress; + this.accessToken = accessToken; } @Override @@ -39,6 +41,7 @@ public class NetComClientProxy implements FactoryBean { RpcRequest request = new RpcRequest(); request.setServerAddress(serverAddress); request.setCreateMillisTime(System.currentTimeMillis()); + request.setAccessToken(accessToken); request.setClassName(method.getDeclaringClass().getName()); request.setMethodName(method.getName()); request.setParameterTypes(method.getParameterTypes()); diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/NetComServerFactory.java b/xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/NetComServerFactory.java index 30b30cbc..8e73b30a 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/NetComServerFactory.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/NetComServerFactory.java @@ -30,14 +30,18 @@ public class NetComServerFactory { server.destroy(); } - // ---------------------- server init ---------------------- + // ---------------------- server instance ---------------------- /** * init local rpc service map */ private static Map serviceMap = new HashMap(); + private static String accessToken; public static void putService(Class iface, Object serviceBean){ serviceMap.put(iface.getName(), serviceBean); } + public static void setAccessToken(String accessToken) { + NetComServerFactory.accessToken = accessToken; + } public static RpcResponse invokeService(RpcRequest request, Object serviceBean) { if (serviceBean==null) { serviceBean = serviceMap.get(request.getClassName()); @@ -49,7 +53,11 @@ public class NetComServerFactory { RpcResponse response = new RpcResponse(); if (System.currentTimeMillis() - request.getCreateMillisTime() > 180000) { - response.setResult(new ReturnT(ReturnT.FAIL_CODE, "the timestamp difference between admin and executor exceeds the limit.")); + response.setResult(new ReturnT(ReturnT.FAIL_CODE, "The timestamp difference between admin and executor exceeds the limit.")); + return response; + } + if (accessToken!=null && accessToken.trim().length()>0 && !accessToken.trim().equals(request.getAccessToken())) { + response.setResult(new ReturnT(ReturnT.FAIL_CODE, "The access token[" + request.getAccessToken() + "] is wrong.")); return response; } diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/jetty/client/JettyClient.java b/xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/jetty/client/JettyClient.java index 2402949a..d03a28c1 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/jetty/client/JettyClient.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/jetty/client/JettyClient.java @@ -21,8 +21,8 @@ public class JettyClient { // reqURL String reqURL = request.getServerAddress(); - if (reqURL!=null && reqURL.toLowerCase().indexOf("http://")==-1) { - reqURL = "http://" + request.getServerAddress() + "/"; + if (reqURL!=null && reqURL.toLowerCase().indexOf("http")==-1) { + reqURL = "http://" + request.getServerAddress() + "/"; // IP:PORT, need parse to url } // remote invoke diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/jetty/server/JettyServer.java b/xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/jetty/server/JettyServer.java index 74a4c955..0b9621bc 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/jetty/server/JettyServer.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/jetty/server/JettyServer.java @@ -1,6 +1,7 @@ package com.xxl.job.core.rpc.netcom.jetty.server; import com.xxl.job.core.thread.ExecutorRegistryThread; +import com.xxl.job.core.thread.TriggerCallbackThread; import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Server; @@ -38,10 +39,16 @@ public class JettyServer { server.setHandler(handlerc); try { - // Start the server + // Start server server.start(); logger.info(">>>>>>>>>>>> xxl-job jetty server start success at port:{}.", port); + + // Start Registry-Server ExecutorRegistryThread.getInstance().start(port, ip, appName); + + // Start Callback-Server + TriggerCallbackThread.getInstance().start(); + server.join(); // block until thread stopped logger.info(">>>>>>>>>>> xxl-rpc server join success, netcon={}, port={}", JettyServer.class.getName(), port); } catch (Exception e) { @@ -56,6 +63,8 @@ public class JettyServer { } public void destroy() { + + // destroy server if (server != null) { try { server.stop(); @@ -67,6 +76,13 @@ public class JettyServer { if (thread.isAlive()) { thread.interrupt(); } + + // destroy Registry-Server + ExecutorRegistryThread.getInstance().toStop(); + + // destroy Callback-Server + TriggerCallbackThread.getInstance().toStop(); + logger.info(">>>>>>>>>>> xxl-rpc server destroy success, netcon={}", JettyServer.class.getName()); } diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/thread/ExecutorRegistryThread.java b/xxl-job-core/src/main/java/com/xxl/job/core/thread/ExecutorRegistryThread.java index 962504cc..c3e7eca2 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/thread/ExecutorRegistryThread.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/thread/ExecutorRegistryThread.java @@ -5,7 +5,6 @@ import com.xxl.job.core.biz.model.RegistryParam; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.enums.RegistryConfig; import com.xxl.job.core.executor.XxlJobExecutor; -import com.xxl.job.core.rpc.netcom.NetComClientProxy; import com.xxl.job.core.util.IpUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -32,7 +31,7 @@ public class ExecutorRegistryThread extends Thread { logger.warn(">>>>>>>>>>>> xxl-job, executor registry config fail, appName is null."); return; } - if (XxlJobExecutor.adminAddresses==null || XxlJobExecutor.adminAddresses.trim().length()==0) { + if (XxlJobExecutor.getAdminBizList() == null) { logger.warn(">>>>>>>>>>>> xxl-job, executor registry config fail, adminAddresses is null."); return; } @@ -49,15 +48,10 @@ public class ExecutorRegistryThread extends Thread { @Override public void run() { while (!toStop) { - try { RegistryParam registryParam = new RegistryParam(RegistryConfig.RegistType.EXECUTOR.name(), appName, executorAddress); - - for (String addressUrl: XxlJobExecutor.adminAddresses.split(",")) { - String apiUrl = addressUrl.concat("/api"); - + for (AdminBiz adminBiz: XxlJobExecutor.getAdminBizList()) { try { - AdminBiz adminBiz = (AdminBiz) new NetComClientProxy(AdminBiz.class, apiUrl).getObject(); ReturnT registryResult = adminBiz.registry(registryParam); if (registryResult!=null && ReturnT.SUCCESS_CODE == registryResult.getCode()) { registryResult = ReturnT.SUCCESS; @@ -71,7 +65,6 @@ public class ExecutorRegistryThread extends Thread { } } - } catch (Exception e) { logger.error(e.getMessage(), e); } diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/thread/TriggerCallbackThread.java b/xxl-job-core/src/main/java/com/xxl/job/core/thread/TriggerCallbackThread.java index 55ddcae6..8bb5463e 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/thread/TriggerCallbackThread.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/thread/TriggerCallbackThread.java @@ -4,7 +4,6 @@ import com.xxl.job.core.biz.AdminBiz; import com.xxl.job.core.biz.model.HandleCallbackParam; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.executor.XxlJobExecutor; -import com.xxl.job.core.rpc.netcom.NetComClientProxy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,17 +42,14 @@ public class TriggerCallbackThread { callbackParamList.add(callback); // valid - if (XxlJobExecutor.adminAddresses==null || XxlJobExecutor.adminAddresses.trim().length()==0) { + if (XxlJobExecutor.getAdminBizList()==null) { logger.warn(">>>>>>>>>>>> xxl-job callback fail, adminAddresses is null, callbackParamList:{}", callbackParamList); continue; } // callback, will retry if error - for (String addressUrl: XxlJobExecutor.adminAddresses.split(",")) { - String apiUrl = addressUrl.concat("/api"); - + for (AdminBiz adminBiz: XxlJobExecutor.getAdminBizList()) { try { - AdminBiz adminBiz = (AdminBiz) new NetComClientProxy(AdminBiz.class, apiUrl).getObject(); ReturnT callbackResult = adminBiz.callback(callbackParamList); if (callbackResult!=null && ReturnT.SUCCESS_CODE == callbackResult.getCode()) { callbackResult = ReturnT.SUCCESS; diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/util/ScriptUtil.java b/xxl-job-core/src/main/java/com/xxl/job/core/util/ScriptUtil.java index 9d352587..95c199d2 100644 --- a/xxl-job-core/src/main/java/com/xxl/job/core/util/ScriptUtil.java +++ b/xxl-job-core/src/main/java/com/xxl/job/core/util/ScriptUtil.java @@ -1,6 +1,6 @@ package com.xxl.job.core.util; -import com.xxl.job.core.executor.XxlJobExecutor; +import com.xxl.job.core.log.XxlJobFileAppender; import org.apache.commons.exec.CommandLine; import org.apache.commons.exec.DefaultExecutor; import org.apache.commons.exec.PumpStreamHandler; @@ -28,7 +28,7 @@ public class ScriptUtil { */ public static void markScriptFile(String scriptFileName, String content) throws IOException { // filePath/ - File filePathDir = new File(XxlJobExecutor.logPath); + File filePathDir = new File(XxlJobFileAppender.logPath); if (!filePathDir.exists()) { filePathDir.mkdirs(); } diff --git a/xxl-job-executor-example/pom.xml b/xxl-job-executor-example/pom.xml index 44e6966b..536d31a3 100644 --- a/xxl-job-executor-example/pom.xml +++ b/xxl-job-executor-example/pom.xml @@ -4,7 +4,7 @@ com.xuxueli xxl-job - 1.8.1-SNAPSHOT + 1.8.2-SNAPSHOT xxl-job-executor-example war @@ -13,12 +13,8 @@ Executor project for spring boot. http://www.xuxueli.com/ - - 3.2.17.RELEASE - - - + org.springframework spring-webmvc @@ -29,20 +25,7 @@ org.slf4j slf4j-log4j12 - 1.7.21 - - - - - com.mchange - c3p0 - 0.9.5.2 - - - - mysql - mysql-connector-java - 5.1.29 + ${slf4j-api.version} @@ -51,7 +34,6 @@ xxl-job-core ${project.parent.version} - \ No newline at end of file diff --git a/xxl-job-executor-example/src/main/resources/applicationcontext-xxl-job.xml b/xxl-job-executor-example/src/main/resources/applicationcontext-xxl-job.xml index 740106ee..be84182c 100644 --- a/xxl-job-executor-example/src/main/resources/applicationcontext-xxl-job.xml +++ b/xxl-job-executor-example/src/main/resources/applicationcontext-xxl-job.xml @@ -33,6 +33,8 @@ + + diff --git a/xxl-job-executor-example/src/main/resources/xxl-job-executor.properties b/xxl-job-executor-example/src/main/resources/xxl-job-executor.properties index 2cd00d07..7aa2da13 100644 --- a/xxl-job-executor-example/src/main/resources/xxl-job-executor.properties +++ b/xxl-job-executor-example/src/main/resources/xxl-job-executor.properties @@ -7,4 +7,7 @@ xxl.job.executor.ip= xxl.job.executor.port=9999 ### xxl-job log path -xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler/ \ No newline at end of file +xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler/ + +### xxl-job, access token +xxl.job.accessToken= \ No newline at end of file diff --git a/xxl-job-executor-example/src/test/java/com/xxl/executor/test/DemoJobHandlerTest.java b/xxl-job-executor-example/src/test/java/com/xxl/executor/test/DemoJobHandlerTest.java index d1325f73..69443804 100644 --- a/xxl-job-executor-example/src/test/java/com/xxl/executor/test/DemoJobHandlerTest.java +++ b/xxl-job-executor-example/src/test/java/com/xxl/executor/test/DemoJobHandlerTest.java @@ -8,6 +8,8 @@ import com.xxl.job.core.glue.GlueTypeEnum; import com.xxl.job.core.rpc.netcom.NetComClientProxy; /** + * executor-api client, test + * * Created by xuxueli on 17/5/12. */ public class DemoJobHandlerTest { @@ -31,7 +33,8 @@ public class DemoJobHandlerTest { triggerParam.setLogDateTim(System.currentTimeMillis()); // do remote trigger - ExecutorBiz executorBiz = (ExecutorBiz) new NetComClientProxy(ExecutorBiz.class, "127.0.0.1:9999").getObject(); + String accessToken = null; + ExecutorBiz executorBiz = (ExecutorBiz) new NetComClientProxy(ExecutorBiz.class, "127.0.0.1:9999", null).getObject(); ReturnT runResult = executorBiz.run(triggerParam); } diff --git a/xxl-job-executor-springboot-example/pom.xml b/xxl-job-executor-springboot-example/pom.xml index adf3da8e..b09f38ac 100644 --- a/xxl-job-executor-springboot-example/pom.xml +++ b/xxl-job-executor-springboot-example/pom.xml @@ -6,7 +6,7 @@ com.xuxueli xxl-job - 1.8.1-SNAPSHOT + 1.8.2-SNAPSHOT xxl-job-executor-springboot-example jar @@ -16,8 +16,6 @@ http://www.xuxueli.com/ - 1.3.8.RELEASE - UTF-8 UTF-8 1.7 @@ -33,41 +31,44 @@ pom import + + + + org.eclipse.jetty + jetty-server + ${jetty-server.version} + + + org.eclipse.jetty + jetty-util + ${jetty-server.version} + + + org.eclipse.jetty + jetty-http + ${jetty-server.version} + + + org.eclipse.jetty + jetty-io + ${jetty-server.version} + + - - - org.springframework.boot - spring-boot-starter - - - + org.springframework.boot spring-boot-starter-web - org.springframework.boot spring-boot-starter-test test - - - com.mchange - c3p0 - 0.9.5.2 - - - - mysql - mysql-connector-java - 5.1.29 - - com.xuxueli diff --git a/xxl-job-executor-springboot-example/src/main/java/com/xxl/job/executor/core/config/XxlJobConfig.java b/xxl-job-executor-springboot-example/src/main/java/com/xxl/job/executor/core/config/XxlJobConfig.java index 5a1da344..8f3345e1 100644 --- a/xxl-job-executor-springboot-example/src/main/java/com/xxl/job/executor/core/config/XxlJobConfig.java +++ b/xxl-job-executor-springboot-example/src/main/java/com/xxl/job/executor/core/config/XxlJobConfig.java @@ -34,6 +34,8 @@ public class XxlJobConfig { @Value("${xxl.job.executor.logpath}") private String logpath; + @Value("${xxl.job.accessToken}") + private String accessToken; @Bean(initMethod = "start", destroyMethod = "destroy") public XxlJobExecutor xxlJobExecutor() { @@ -44,6 +46,7 @@ public class XxlJobConfig { xxlJobExecutor.setAppName(appname); xxlJobExecutor.setAdminAddresses(addresses); xxlJobExecutor.setLogPath(logpath); + xxlJobExecutor.setAccessToken(accessToken); return xxlJobExecutor; } diff --git a/xxl-job-executor-springboot-example/src/main/resources/application.properties b/xxl-job-executor-springboot-example/src/main/resources/application.properties index b4073e98..e6a6c1d9 100644 --- a/xxl-job-executor-springboot-example/src/main/resources/application.properties +++ b/xxl-job-executor-springboot-example/src/main/resources/application.properties @@ -15,3 +15,6 @@ xxl.job.executor.port=9998 ### xxl-job log path xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler/ + +### xxl-job, access token +xxl.job.accessToken=