Bläddra i källkod

Merge remote-tracking branch 'upstream/master'

Zhouchuanwen 5 år sedan
förälder
incheckning
8512a34469
44 ändrade filer med 715 tillägg och 418 borttagningar
  1. 17 0
      .github/workflows/maven.yml
  2. 0 6
      .travis.yml
  3. 12 2
      README.md
  4. 1 1
      doc/XXL-JOB-English-Documentation.md
  5. 40 12
      doc/XXL-JOB官方文档.md
  6. 12 12
      doc/db/tables_xxl_job.sql
  7. 1 1
      pom.xml
  8. 74 11
      xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java
  9. 5 0
      xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java
  10. 2 5
      xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java
  11. 1 1
      xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java
  12. 41 8
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java
  13. 0 150
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobScheduler.java
  14. 8 6
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogGlue.java
  15. 1 1
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteBusyover.java
  16. 1 1
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFailover.java
  17. 109 0
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/scheduler/XxlJobScheduler.java
  18. 3 6
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryMonitorHelper.java
  19. 6 8
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java
  20. 47 35
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java
  21. 2 2
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java
  22. 1 1
      xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobInfoDao.java
  23. 9 4
      xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobRegistryDao.java
  24. 20 3
      xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java
  25. 7 0
      xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java
  26. 4 0
      xxl-job-admin/src/main/resources/application.properties
  27. 7 5
      xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml
  28. 2 2
      xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogGlueMapper.xml
  29. 1 0
      xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml
  30. 6 6
      xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobRegistryMapper.xml
  31. 1 1
      xxl-job-admin/src/main/resources/templates/common/common.macro.ftl
  32. 2 2
      xxl-job-admin/src/main/resources/templates/login.ftl
  33. 5 2
      xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobInfoDaoTest.java
  34. 4 3
      xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobLogGlueDaoTest.java
  35. 4 3
      xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobRegistryDaoTest.java
  36. 29 43
      xxl-job-admin/src/test/java/com/xxl/job/adminbiz/AdminBizTest.java
  37. 18 15
      xxl-job-admin/src/test/java/com/xxl/job/executor/ExecutorBizTest.java
  38. 0 2
      xxl-job-core/src/main/java/com/xxl/job/core/biz/AdminBiz.java
  39. 48 0
      xxl-job-core/src/main/java/com/xxl/job/core/biz/client/AdminBizClient.java
  40. 6 6
      xxl-job-core/src/main/java/com/xxl/job/core/biz/model/TriggerParam.java
  41. 15 33
      xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java
  42. 4 4
      xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java
  43. 122 0
      xxl-job-core/src/main/java/com/xxl/job/core/util/XxlJobRemotingUtil.java
  44. 17 15
      xxl-job-core/src/test/java/com/xxl/job/core/biz/impl/ExecutorBizImplTest.java

+ 17 - 0
.github/workflows/maven.yml Visa fil

@@ -0,0 +1,17 @@
1
+name: Java CI
2
+
3
+on: [push]
4
+
5
+jobs:
6
+  build:
7
+
8
+    runs-on: ubuntu-latest
9
+
10
+    steps:
11
+    - uses: actions/checkout@v1
12
+    - name: Set up JDK 1.8
13
+      uses: actions/setup-java@v1
14
+      with:
15
+        java-version: 1.8
16
+    - name: Build with Maven
17
+      run: mvn -B package --file pom.xml

+ 0 - 6
.travis.yml Visa fil

@@ -1,6 +0,0 @@
1
-language: java
2
-jdk:
3
-  - openjdk8
4
-install: mvn install -DskipTests=true -Dmaven.javadoc.skip=true
5
-#script: mvn test
6
-script: mvn -DskipTests=true clean package

+ 12 - 2
README.md Visa fil

@@ -7,8 +7,8 @@
7 7
         <a href="https://www.xuxueli.com/xxl-job/"><strong>-- Home Page --</strong></a>
8 8
         <br>
9 9
         <br>
10
-        <a href="https://travis-ci.org/xuxueli/xxl-job">
11
-            <img src="https://travis-ci.org/xuxueli/xxl-job.svg?branch=master" >
10
+        <a href="https://github.com/xuxueli/xxl-job/actions">
11
+            <img src="https://github.com/xuxueli/xxl-job/workflows/Java%20CI/badge.svg" >
12 12
         </a>
13 13
         <a href="https://hub.docker.com/r/xuxueli/xxl-job-admin/">
14 14
             <img src="https://img.shields.io/badge/docker-passing-brightgreen.svg" >
@@ -378,6 +378,16 @@ XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是
378 378
     - 259、爱乐优(二手平台)
379 379
     - 260、猫眼电影(私有化部署)【猫眼电影】
380 380
     - 261、美团大象(私有化部署)【美团大象】
381
+    - 262、作业帮教育科技(北京)有限公司【作业帮】
382
+    - 263、北京小年糕互联网技术有限公司
383
+    - 264、山东矩阵软件工程股份有限公司
384
+    - 265、陕西国驿软件科技有限公司
385
+    - 266、君开信息科技
386
+    - 267、村鸟网络科技有限责任公司
387
+    - 268、云南国际信托有限公司
388
+    - 269、金智教育
389
+    - 270、珠海市筑巢科技有限公司
390
+    - 271、上海百胜软件股份有限公司
381 391
 	- ……
382 392
 
383 393
 > 更多接入的公司,欢迎在 [登记地址](https://github.com/xuxueli/xxl-job/issues/1 ) 登记,登记仅仅为了产品推广。

+ 1 - 1
doc/XXL-JOB-English-Documentation.md Visa fil

@@ -1,6 +1,6 @@
1 1
 ## 《Distributed task scheduling framework XXL-JOB》
2 2
 
3
-[![Build Status](https://travis-ci.org/xuxueli/xxl-job.svg?branch=master)](https://travis-ci.org/xuxueli/xxl-job)
3
+[![Actions Status](https://github.com/xuxueli/xxl-job/workflows/Java%20CI/badge.svg)](https://github.com/xuxueli/xxl-job/actions)
4 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 5
 [![GitHub release](https://img.shields.io/github/release/xuxueli/xxl-job.svg)](https://github.com/xuxueli/xxl-job/releases)
6 6
 [![License](https://img.shields.io/badge/license-GPLv3-blue.svg)](http://www.gnu.org/licenses/gpl-3.0.html)

+ 40 - 12
doc/XXL-JOB官方文档.md Visa fil

@@ -1,6 +1,6 @@
1 1
 ## 《分布式任务调度平台XXL-JOB》
2 2
 
3
-[![Build Status](https://travis-ci.org/xuxueli/xxl-job.svg?branch=master)](https://travis-ci.org/xuxueli/xxl-job)
3
+[![Actions Status](https://github.com/xuxueli/xxl-job/workflows/Java%20CI/badge.svg)](https://github.com/xuxueli/xxl-job/actions)
4 4
 [![Docker Status](https://img.shields.io/badge/docker-passing-brightgreen.svg)](https://hub.docker.com/r/xuxueli/xxl-job-admin/)
5 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 6
 [![GitHub release](https://img.shields.io/github/release/xuxueli/xxl-job.svg)](https://github.com/xuxueli/xxl-job/releases)
@@ -346,6 +346,16 @@ XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是
346 346
     - 259、爱乐优(二手平台)
347 347
     - 260、猫眼电影(私有化部署)【猫眼电影】
348 348
     - 261、美团大象(私有化部署)【美团大象】
349
+    - 262、作业帮教育科技(北京)有限公司【作业帮】
350
+    - 263、北京小年糕互联网技术有限公司
351
+    - 264、山东矩阵软件工程股份有限公司
352
+    - 265、陕西国驿软件科技有限公司
353
+    - 266、君开信息科技
354
+    - 267、村鸟网络科技有限责任公司
355
+    - 268、云南国际信托有限公司
356
+    - 269、金智教育
357
+    - 270、珠海市筑巢科技有限公司
358
+    - 271、上海百胜软件股份有限公司
349 359
 	- ……
350 360
 
351 361
 > 更多接入的公司,欢迎在 [登记地址](https://github.com/xuxueli/xxl-job/issues/1 ) 登记,登记仅仅为了产品推广。
@@ -383,7 +393,7 @@ XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是
383 393
 ### 1.6 环境
384 394
 - Maven3+
385 395
 - Jdk1.7+
386
-- Mysql5.6+
396
+- Mysql5.7+
387 397
 
388 398
 
389 399
 ## 二、快速入门
@@ -465,7 +475,6 @@ XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是
465 475
 
466 476
 调度中心集群部署时,几点要求和建议:
467 477
 - DB配置保持一致;
468
-- 登陆账号配置保持一致;
469 478
 - 集群机器时钟保持一致(单机集群忽视);
470 479
 - 建议:推荐通过nginx为调度中心集群做负载均衡,分配域名。调度中心访问、执行器回调配置、调用API服务等操作均通过该域名进行。
471 480
 
@@ -922,8 +931,8 @@ XXL-JOB的每个调度任务虽然在调度模块是并行调度执行的,但
922 931
 任务调度错过触发时间时的处理策略:
923 932
 - 可能原因:服务重启;调度线程被阻塞,线程被耗尽;上次调度持续阻塞,下次调度被错过;
924 933
 - 处理策略:
925
-    - 过期超5s:本忽略,当前时间开始计算下次触发时间
926
-    - 过期超过5s:过期5s内:立即触发一次,当前时间开始计算下次触发时间
934
+    - 过期超5s:本忽略,当前时间开始计算下次触发时间
935
+    - 过期5s内:立即触发一次,当前时间开始计算下次触发时间
927 936
 
928 937
 
929 938
 #### 5.4.7 日志回调服务
@@ -990,6 +999,11 @@ xxl-job-admin#com.xxl.job.admin.controller.JobApiController.callback
990 999
 
991 1000
 如若需要支撑更多的任务量,可以通过 "调大调度线程数" 、"降低调度中心与执行器ping延迟" 和 "提升机器配置" 几种方式优化。
992 1001
 
1002
+#### 5.4.12 均衡调度
1003
+
1004
+调度中心在集群部署时会自动进行任务平均分配,触发组件每次获取与线程池数量(调度中心支持自定义调度线程池大小)相关数量的任务,避免大量任务集中在单个调度中心集群节点;
1005
+
1006
+
993 1007
 ### 5.5 任务 "运行模式" 剖析
994 1008
 #### 5.5.1 "Bean模式" 任务
995 1009
 开发步骤:可参考 "章节三" ;
@@ -1113,7 +1127,7 @@ API服务请求参考代码:com.xxl.job.adminbiz.AdminBizTest.java
1113 1127
     7、任务触发;
1114 1128
     
1115 1129
 API服务位置:com.xxl.job.admin.controller.JobInfoController.java     
1116
-API服务请求参考代码:可参考任务界面操作的ajax请求。任何ajax接口均可配置成为API服务,只需在待启用的API服务上添加 “@PermessionLimit(limit = false)” 注解取消登陆态拦截即可;
1130
+API服务请求参考代码:可参考任务界面操作的ajax请求。任何ajax接口均可配置成为API服务,只需在待启用的API服务上添加 “@PermissionLimit(limit = false)” 注解取消登陆态拦截即可;
1117 1131
 
1118 1132
 ### 5.12 执行器API服务
1119 1133
 执行器提供了API服务,供调度中心选择使用,目前提供的API服务有:
@@ -1563,15 +1577,21 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段
1563 1577
 - 6、调度组件优化:针对永远不会触发的Cron禁止配置和启动;任务Cron最后一次触发后再也不会触发时,比如一次性任务,主动停止相关任务;
1564 1578
 - 7、任务列表交互优化,支持查看任务所属执行器的注册节点;
1565 1579
 - 8、DB重连优化,修复DB宕机重连后任务调度停止的问题,重连后自动加入调度集群触发任务调度;
1566
-- 9、任务触发组件加载顺序调整,避免小概率情况下组件随机加载顺序导致的I18N的NPE问题
1580
+- 9、任务触发组件加载顺序调整,避免小概率情况下组件随机加载顺序导致的I18N的NPE问题;
1567 1581
 - 10、项目依赖升级至较新稳定版本,如spring、spring-boot、mybatis、slf4j、groovy等等;
1568 1582
 - 11、JobThread自销毁优化,避免并发触发导致triggerQueue中任务丢失问题;
1569
-- 12、[ING,交互兼容问题待处理]Cron在线生成工具:任务新增、编辑框通过组件在线生成Cron表达式;
1583
+- 12、Cron在线生成工具:任务新增、编辑框通过组件在线生成Cron表达式;
1570 1584
 - 13、Cron下次执行时间查询:支持通过界面在线查看后续连续5次执行时间;
1571 1585
 - 14、任务重试时参数丢失的问题修复;
1572
-- 15、[ING]xxl-rpc服务端线程优化,降低线程内存开销;
1573
-- 16、[ING]调度日志优化:支持设置日志保留天数,过期日志天维度记录报表,并清理;调度报表汇总实时数据和报表;
1574
-- 17、[ING]父子任务参数传递;流程任务等,透传动态参数;
1586
+- 15、调度中心密码限制18位,修复修改密码超过18位无法登陆的问题;
1587
+- 16、任务告警组件分页参数无效问题修复;
1588
+- 17、DB脚本默认编码改为utf8mb4,修复字符乱码问题(建议Mysql版本5.7+);
1589
+- 18、调度中心任务平均分配,触发组件每次获取与线程池数量相关数量的任务,避免大量任务集中在单个调度中心集群节点;
1590
+- 19、调度中心移除SQL中的 "now()" 函数;集群部署时不再依赖DB时钟,仅需要保证调度中心应用节点时钟一致即可;
1591
+- 20、xxl-rpc服务端线程优化,降低线程内存开销;
1592
+- 21、调度中心回调API服务改为restful方式;
1593
+- 22、[ING]调度日志优化:支持设置日志保留天数,过期日志天维度记录报表,并清理;调度报表汇总实时数据和报表;
1594
+- 23、[ING]调度中心日志删除,改为分页获取ID,根据ID删除的方式;
1575 1595
 
1576 1596
 
1577 1597
 
@@ -1589,7 +1609,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段
1589 1609
 - 11、失败重试间隔;
1590 1610
 - 12、SimpleTrigger:除Cron外,支持设置固定时间间隔触发;
1591 1611
 - 13、调度日志列表加上执行时长列,并支持排序;
1592
-- 14、DAG流程任务:替换子任务,支持参数传递:配置并列的"a-b、b-c"路径列表,构成串行、并行、dag任务流程,"dagre-d3"绘图;任务依赖,流程图,子任务+会签任务,各节点日志;
1612
+- 14、DAG流程任务:替换子任务,支持参数传递:配置并列的"a-b、b-c"路径列表,构成串行、并行、dag任务流程,"dagre-d3"绘图;任务依赖,流程图,子任务+会签任务,各节点日志;支持根据成功、失败选择分支;
1593 1613
 - 15、日期过滤:支持多个时间段排除;
1594 1614
 - 16、告警邮件内容,支持自定义模板配置;
1595 1615
 - 17、暂停状态,支持Cron 为空;
@@ -1604,6 +1624,14 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段
1604 1624
 - 26、调度中心JDK版本调整为JDK8,从而升级至最新版本SpringBoot;
1605 1625
 - 27、执行器服务端口与注册端口分离,支持docker动态随机端口;
1606 1626
 - 28、执行器端口复用,复用容器端口提供通讯服务;
1627
+- 29、自定义失败重试时间间隔;
1628
+- 30、分片任务全部成功后触发子任务;
1629
+- 31、任务复制功能;点击复制是弹出新建任务弹框,并初始化被复制任务信息;
1630
+- 32、AccessToken按照执行器维度设置;控制调度、回调;
1631
+- 33、任务执行一次的时候指定IP;
1632
+- 34、通讯调整;双向HTTP,回调和其他API自定义AccessToken,Restful,执行器复用容器端口;
1633
+- 35、父子任务参数传递;流程任务等,透传动态参数;
1634
+- 36、任务操作API服务调整为和回调服务一致,降低接入成本;
1607 1635
 
1608 1636
 
1609 1637
 ## 七、其他

+ 12 - 12
doc/db/tables_xxl_job.sql Visa fil

@@ -2,7 +2,7 @@
2 2
 # XXL-JOB v2.1.1-SNAPSHOT
3 3
 # Copyright (c) 2015-present, xuxueli.
4 4
 
5
-CREATE database if NOT EXISTS `xxl_job` default character set utf8 collate utf8_general_ci;
5
+CREATE database if NOT EXISTS `xxl_job` default character set utf8mb4 collate utf8mb4_unicode_ci;
6 6
 use `xxl_job`;
7 7
 
8 8
 
@@ -30,7 +30,7 @@ CREATE TABLE `xxl_job_info` (
30 30
   `trigger_last_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '上次调度时间',
31 31
   `trigger_next_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '下次调度时间',
32 32
   PRIMARY KEY (`id`)
33
-) ENGINE=InnoDB DEFAULT CHARSET=utf8;
33
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
34 34
 
35 35
 CREATE TABLE `xxl_job_log` (
36 36
   `id` bigint(20) NOT NULL AUTO_INCREMENT,
@@ -51,7 +51,7 @@ CREATE TABLE `xxl_job_log` (
51 51
   PRIMARY KEY (`id`),
52 52
   KEY `I_trigger_time` (`trigger_time`),
53 53
   KEY `I_handle_code` (`handle_code`)
54
-) ENGINE=InnoDB DEFAULT CHARSET=utf8;
54
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
55 55
 
56 56
 CREATE TABLE `xxl_job_logglue` (
57 57
   `id` int(11) NOT NULL AUTO_INCREMENT,
@@ -59,20 +59,20 @@ CREATE TABLE `xxl_job_logglue` (
59 59
   `glue_type` varchar(50) DEFAULT NULL COMMENT 'GLUE类型',
60 60
   `glue_source` mediumtext COMMENT 'GLUE源代码',
61 61
   `glue_remark` varchar(128) NOT NULL COMMENT 'GLUE备注',
62
-  `add_time` timestamp NULL DEFAULT NULL,
63
-  `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
62
+  `add_time` datetime DEFAULT NULL,
63
+  `update_time` datetime DEFAULT NULL,
64 64
   PRIMARY KEY (`id`)
65
-) ENGINE=InnoDB DEFAULT CHARSET=utf8;
65
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
66 66
 
67 67
 CREATE TABLE `xxl_job_registry` (
68 68
   `id` int(11) NOT NULL AUTO_INCREMENT,
69
-  `registry_group` varchar(255) NOT NULL,
69
+  `registry_group` varchar(50) NOT NULL,
70 70
   `registry_key` varchar(255) NOT NULL,
71 71
   `registry_value` varchar(255) NOT NULL,
72
-  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
72
+  `update_time` datetime DEFAULT NULL,
73 73
   PRIMARY KEY (`id`),
74 74
   KEY `i_g_k_v` (`registry_group`,`registry_key`,`registry_value`)
75
-) ENGINE=InnoDB DEFAULT CHARSET=utf8;
75
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
76 76
 
77 77
 CREATE TABLE `xxl_job_group` (
78 78
   `id` int(11) NOT NULL AUTO_INCREMENT,
@@ -82,7 +82,7 @@ CREATE TABLE `xxl_job_group` (
82 82
   `address_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '执行器地址类型:0=自动注册、1=手动录入',
83 83
   `address_list` varchar(512) DEFAULT NULL COMMENT '执行器地址列表,多地址逗号分隔',
84 84
   PRIMARY KEY (`id`)
85
-) ENGINE=InnoDB DEFAULT CHARSET=utf8;
85
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
86 86
 
87 87
 CREATE TABLE `xxl_job_user` (
88 88
   `id` int(11) NOT NULL AUTO_INCREMENT,
@@ -92,12 +92,12 @@ CREATE TABLE `xxl_job_user` (
92 92
   `permission` varchar(255) DEFAULT NULL COMMENT '权限:执行器ID列表,多个逗号分割',
93 93
   PRIMARY KEY (`id`),
94 94
   UNIQUE KEY `i_username` (`username`) USING BTREE
95
-) ENGINE=InnoDB DEFAULT CHARSET=utf8;
95
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
96 96
 
97 97
 CREATE TABLE `xxl_job_lock` (
98 98
   `lock_name` varchar(50) NOT NULL COMMENT '锁名称',
99 99
   PRIMARY KEY (`lock_name`)
100
-) ENGINE=InnoDB DEFAULT CHARSET=utf8;
100
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
101 101
 
102 102
 
103 103
 INSERT INTO `xxl_job_group`(`id`, `app_name`, `title`, `order`, `address_type`, `address_list`) VALUES (1, 'xxl-job-executor-sample', '示例执行器', 1, 0, NULL);

+ 1 - 1
pom.xml Visa fil

@@ -24,7 +24,7 @@
24 24
 		<maven.compiler.target>1.7</maven.compiler.target>
25 25
 		<maven.test.skip>true</maven.test.skip>
26 26
 
27
-		<xxl-rpc.version>1.4.1</xxl-rpc.version>
27
+		<xxl-rpc.version>1.4.2</xxl-rpc.version>
28 28
 
29 29
 		<spring.version>4.3.25.RELEASE</spring.version>
30 30
 		<spring-boot.version>1.5.22.RELEASE</spring-boot.version>

+ 74 - 11
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java Visa fil

@@ -1,34 +1,97 @@
1 1
 package com.xxl.job.admin.controller;
2 2
 
3 3
 import com.xxl.job.admin.controller.annotation.PermissionLimit;
4
-import com.xxl.job.admin.core.conf.XxlJobScheduler;
4
+import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
5 5
 import com.xxl.job.core.biz.AdminBiz;
6
-import org.springframework.beans.factory.InitializingBean;
6
+import com.xxl.job.core.biz.model.HandleCallbackParam;
7
+import com.xxl.job.core.biz.model.RegistryParam;
8
+import com.xxl.job.core.biz.model.ReturnT;
9
+import com.xxl.job.core.util.XxlJobRemotingUtil;
7 10
 import org.springframework.stereotype.Controller;
11
+import org.springframework.web.bind.annotation.RequestBody;
8 12
 import org.springframework.web.bind.annotation.RequestMapping;
13
+import org.springframework.web.bind.annotation.ResponseBody;
9 14
 
10
-import javax.servlet.ServletException;
15
+import javax.annotation.Resource;
11 16
 import javax.servlet.http.HttpServletRequest;
12
-import javax.servlet.http.HttpServletResponse;
13
-import java.io.IOException;
17
+import java.util.List;
14 18
 
15 19
 /**
16 20
  * Created by xuxueli on 17/5/10.
17 21
  */
18 22
 @Controller
19
-public class JobApiController implements InitializingBean {
23
+@RequestMapping("/api")
24
+public class JobApiController {
20 25
 
26
+    @Resource
27
+    private AdminBiz adminBiz;
21 28
 
22
-    @Override
23
-    public void afterPropertiesSet() {
24 29
 
30
+    // ---------------------- admin biz ----------------------
31
+
32
+    /**
33
+     * callback
34
+     *
35
+     * @param callbackParamList
36
+     * @return
37
+     */
38
+    @RequestMapping("/callback")
39
+    @ResponseBody
40
+    @PermissionLimit(limit=false)
41
+    public ReturnT<String> callback(HttpServletRequest request, @RequestBody List<HandleCallbackParam> callbackParamList) {
42
+
43
+        if (XxlJobAdminConfig.getAdminConfig().getAccessToken()!=null
44
+                && XxlJobAdminConfig.getAdminConfig().getAccessToken().trim().length()>0
45
+                && !XxlJobAdminConfig.getAdminConfig().getAccessToken().equals(request.getHeader(XxlJobRemotingUtil.XXL_RPC_ACCESS_TOKEN))) {
46
+            return new ReturnT<String>(ReturnT.FAIL_CODE, "The access token is wrong.");
47
+        }
48
+
49
+        return adminBiz.callback(callbackParamList);
50
+    }
51
+
52
+
53
+
54
+    /**
55
+     * registry
56
+     *
57
+     * @param registryParam
58
+     * @return
59
+     */
60
+    @RequestMapping("/registry")
61
+    @ResponseBody
62
+    @PermissionLimit(limit=false)
63
+    public ReturnT<String> registry(HttpServletRequest request, @RequestBody RegistryParam registryParam) {
64
+
65
+        if (XxlJobAdminConfig.getAdminConfig().getAccessToken()!=null
66
+                && XxlJobAdminConfig.getAdminConfig().getAccessToken().trim().length()>0
67
+                && !XxlJobAdminConfig.getAdminConfig().getAccessToken().equals(request.getHeader(XxlJobRemotingUtil.XXL_RPC_ACCESS_TOKEN))) {
68
+            return new ReturnT<String>(ReturnT.FAIL_CODE, "The access token is wrong.");
69
+        }
70
+
71
+        return adminBiz.registry(registryParam);
25 72
     }
26 73
 
27
-    @RequestMapping(AdminBiz.MAPPING)
74
+    /**
75
+     * registry remove
76
+     *
77
+     * @param registryParam
78
+     * @return
79
+     */
80
+    @RequestMapping("/registryRemove")
81
+    @ResponseBody
28 82
     @PermissionLimit(limit=false)
29
-    public void api(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
30
-        XxlJobScheduler.invokeAdminService(request, response);
83
+    public ReturnT<String> registryRemove(HttpServletRequest request, @RequestBody RegistryParam registryParam) {
84
+
85
+        if (XxlJobAdminConfig.getAdminConfig().getAccessToken()!=null
86
+                && XxlJobAdminConfig.getAdminConfig().getAccessToken().trim().length()>0
87
+                && !XxlJobAdminConfig.getAdminConfig().getAccessToken().equals(request.getHeader(XxlJobRemotingUtil.XXL_RPC_ACCESS_TOKEN))) {
88
+            return new ReturnT<String>(ReturnT.FAIL_CODE, "The access token is wrong.");
89
+        }
90
+
91
+        return adminBiz.registryRemove(registryParam);
31 92
     }
32 93
 
33 94
 
95
+    // ---------------------- job biz ----------------------
96
+
34 97
 }

+ 5 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java Visa fil

@@ -72,6 +72,8 @@ public class JobCodeController {
72 72
 		exists_jobInfo.setGlueSource(glueSource);
73 73
 		exists_jobInfo.setGlueRemark(glueRemark);
74 74
 		exists_jobInfo.setGlueUpdatetime(new Date());
75
+
76
+		exists_jobInfo.setUpdateTime(new Date());
75 77
 		xxlJobInfoDao.update(exists_jobInfo);
76 78
 
77 79
 		// log old code
@@ -80,6 +82,9 @@ public class JobCodeController {
80 82
 		xxlJobLogGlue.setGlueType(exists_jobInfo.getGlueType());
81 83
 		xxlJobLogGlue.setGlueSource(glueSource);
82 84
 		xxlJobLogGlue.setGlueRemark(glueRemark);
85
+
86
+		xxlJobLogGlue.setAddTime(new Date());
87
+		xxlJobLogGlue.setUpdateTime(new Date());
83 88
 		xxlJobLogGlueDao.save(xxlJobLogGlue);
84 89
 
85 90
 		// remove code backup more than 30

+ 2 - 5
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java Visa fil

@@ -14,10 +14,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
14 14
 import org.springframework.web.bind.annotation.ResponseBody;
15 15
 
16 16
 import javax.annotation.Resource;
17
-import java.util.ArrayList;
18
-import java.util.Collections;
19
-import java.util.HashMap;
20
-import java.util.List;
17
+import java.util.*;
21 18
 
22 19
 /**
23 20
  * job group controller
@@ -119,7 +116,7 @@ public class JobGroupController {
119 116
 
120 117
 	private List<String> findRegistryByAppName(String appNameParam){
121 118
 		HashMap<String, List<String>> appAddressMap = new HashMap<String, List<String>>();
122
-		List<XxlJobRegistry> list = xxlJobRegistryDao.findAll(RegistryConfig.DEAD_TIMEOUT);
119
+		List<XxlJobRegistry> list = xxlJobRegistryDao.findAll(RegistryConfig.DEAD_TIMEOUT, new Date());
123 120
 		if (list != null) {
124 121
 			for (XxlJobRegistry item: list) {
125 122
 				if (RegistryConfig.RegistType.EXECUTOR.name().equals(item.getRegistryGroup())) {

+ 1 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java Visa fil

@@ -1,6 +1,6 @@
1 1
 package com.xxl.job.admin.controller;
2 2
 
3
-import com.xxl.job.admin.core.conf.XxlJobScheduler;
3
+import com.xxl.job.admin.core.scheduler.XxlJobScheduler;
4 4
 import com.xxl.job.admin.core.exception.XxlJobException;
5 5
 import com.xxl.job.admin.core.model.XxlJobGroup;
6 6
 import com.xxl.job.admin.core.model.XxlJobInfo;

+ 41 - 8
xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java Visa fil

@@ -1,10 +1,11 @@
1 1
 package com.xxl.job.admin.core.conf;
2 2
 
3
+import com.xxl.job.admin.core.scheduler.XxlJobScheduler;
3 4
 import com.xxl.job.admin.dao.XxlJobGroupDao;
4 5
 import com.xxl.job.admin.dao.XxlJobInfoDao;
5 6
 import com.xxl.job.admin.dao.XxlJobLogDao;
6 7
 import com.xxl.job.admin.dao.XxlJobRegistryDao;
7
-import com.xxl.job.core.biz.AdminBiz;
8
+import org.springframework.beans.factory.DisposableBean;
8 9
 import org.springframework.beans.factory.InitializingBean;
9 10
 import org.springframework.beans.factory.annotation.Value;
10 11
 import org.springframework.mail.javamail.JavaMailSender;
@@ -18,18 +19,36 @@ import javax.sql.DataSource;
18 19
  *
19 20
  * @author xuxueli 2017-04-28
20 21
  */
22
+
21 23
 @Component
22
-public class XxlJobAdminConfig implements InitializingBean{
24
+public class XxlJobAdminConfig implements InitializingBean, DisposableBean {
25
+
23 26
     private static XxlJobAdminConfig adminConfig = null;
24 27
     public static XxlJobAdminConfig getAdminConfig() {
25 28
         return adminConfig;
26 29
     }
27 30
 
31
+
32
+    // ---------------------- XxlJobScheduler ----------------------
33
+
34
+    private XxlJobScheduler xxlJobScheduler;
35
+
28 36
     @Override
29 37
     public void afterPropertiesSet() {
30 38
         adminConfig = this;
39
+
40
+        xxlJobScheduler = new XxlJobScheduler();
41
+        xxlJobScheduler.init();
31 42
     }
32 43
 
44
+    @Override
45
+    public void destroy() throws Exception {
46
+        xxlJobScheduler.destroy();
47
+    }
48
+
49
+
50
+    // ---------------------- XxlJobScheduler ----------------------
51
+
33 52
     // conf
34 53
     @Value("${xxl.job.i18n}")
35 54
     private String i18n;
@@ -40,6 +59,12 @@ public class XxlJobAdminConfig implements InitializingBean{
40 59
     @Value("${spring.mail.username}")
41 60
     private String emailUserName;
42 61
 
62
+    @Value("${xxl.job.triggerpool.fast.max}")
63
+    private int triggerPoolFastMax;
64
+
65
+    @Value("${xxl.job.triggerpool.slow.max}")
66
+    private int triggerPoolSlowMax;
67
+
43 68
     // dao, service
44 69
 
45 70
     @Resource
@@ -51,8 +76,6 @@ public class XxlJobAdminConfig implements InitializingBean{
51 76
     @Resource
52 77
     private XxlJobGroupDao xxlJobGroupDao;
53 78
     @Resource
54
-    private AdminBiz adminBiz;
55
-    @Resource
56 79
     private JavaMailSender mailSender;
57 80
     @Resource
58 81
     private DataSource dataSource;
@@ -70,6 +93,20 @@ public class XxlJobAdminConfig implements InitializingBean{
70 93
         return emailUserName;
71 94
     }
72 95
 
96
+    public int getTriggerPoolFastMax() {
97
+        if (triggerPoolFastMax < 200) {
98
+            return 200;
99
+        }
100
+        return triggerPoolFastMax;
101
+    }
102
+
103
+    public int getTriggerPoolSlowMax() {
104
+        if (triggerPoolSlowMax < 100) {
105
+            return 100;
106
+        }
107
+        return triggerPoolSlowMax;
108
+    }
109
+
73 110
     public XxlJobLogDao getXxlJobLogDao() {
74 111
         return xxlJobLogDao;
75 112
     }
@@ -86,10 +123,6 @@ public class XxlJobAdminConfig implements InitializingBean{
86 123
         return xxlJobGroupDao;
87 124
     }
88 125
 
89
-    public AdminBiz getAdminBiz() {
90
-        return adminBiz;
91
-    }
92
-
93 126
     public JavaMailSender getMailSender() {
94 127
         return mailSender;
95 128
     }

+ 0 - 150
xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobScheduler.java Visa fil

@@ -1,150 +0,0 @@
1
-package com.xxl.job.admin.core.conf;
2
-
3
-import com.xxl.job.admin.core.thread.JobFailMonitorHelper;
4
-import com.xxl.job.admin.core.thread.JobRegistryMonitorHelper;
5
-import com.xxl.job.admin.core.thread.JobScheduleHelper;
6
-import com.xxl.job.admin.core.thread.JobTriggerPoolHelper;
7
-import com.xxl.job.admin.core.util.I18nUtil;
8
-import com.xxl.job.core.biz.AdminBiz;
9
-import com.xxl.job.core.biz.ExecutorBiz;
10
-import com.xxl.job.core.enums.ExecutorBlockStrategyEnum;
11
-import com.xxl.rpc.remoting.invoker.XxlRpcInvokerFactory;
12
-import com.xxl.rpc.remoting.invoker.call.CallType;
13
-import com.xxl.rpc.remoting.invoker.reference.XxlRpcReferenceBean;
14
-import com.xxl.rpc.remoting.invoker.route.LoadBalance;
15
-import com.xxl.rpc.remoting.net.NetEnum;
16
-import com.xxl.rpc.remoting.net.impl.servlet.server.ServletServerHandler;
17
-import com.xxl.rpc.remoting.provider.XxlRpcProviderFactory;
18
-import com.xxl.rpc.serialize.Serializer;
19
-import org.slf4j.Logger;
20
-import org.slf4j.LoggerFactory;
21
-import org.springframework.beans.factory.DisposableBean;
22
-import org.springframework.beans.factory.InitializingBean;
23
-import org.springframework.context.annotation.DependsOn;
24
-import org.springframework.stereotype.Component;
25
-
26
-import javax.servlet.ServletException;
27
-import javax.servlet.http.HttpServletRequest;
28
-import javax.servlet.http.HttpServletResponse;
29
-import java.io.IOException;
30
-import java.util.concurrent.ConcurrentHashMap;
31
-import java.util.concurrent.ConcurrentMap;
32
-
33
-/**
34
- * @author xuxueli 2018-10-28 00:18:17
35
- */
36
-@Component
37
-@DependsOn("xxlJobAdminConfig")
38
-public class XxlJobScheduler implements InitializingBean, DisposableBean {
39
-    private static final Logger logger = LoggerFactory.getLogger(XxlJobScheduler.class);
40
-
41
-
42
-    @Override
43
-    public void afterPropertiesSet() {
44
-        // init i18n
45
-        initI18n();
46
-
47
-        // admin registry monitor run
48
-        JobRegistryMonitorHelper.getInstance().start();
49
-
50
-        // admin monitor run
51
-        JobFailMonitorHelper.getInstance().start();
52
-
53
-        // admin-server
54
-        initRpcProvider();
55
-
56
-        // start-schedule
57
-        JobScheduleHelper.getInstance().start();
58
-
59
-        logger.info(">>>>>>>>> init xxl-job admin success.");
60
-    }
61
-
62
-    @Override
63
-    public void destroy() throws Exception {
64
-
65
-        // stop-schedule
66
-        JobScheduleHelper.getInstance().toStop();
67
-
68
-        // admin trigger pool stop
69
-        JobTriggerPoolHelper.toStop();
70
-
71
-        // admin registry stop
72
-        JobRegistryMonitorHelper.getInstance().toStop();
73
-
74
-        // admin monitor stop
75
-        JobFailMonitorHelper.getInstance().toStop();
76
-
77
-        // admin-server
78
-        stopRpcProvider();
79
-    }
80
-
81
-    // ---------------------- I18n ----------------------
82
-
83
-    private void initI18n(){
84
-        for (ExecutorBlockStrategyEnum item:ExecutorBlockStrategyEnum.values()) {
85
-            item.setTitle(I18nUtil.getString("jobconf_block_".concat(item.name())));
86
-        }
87
-    }
88
-
89
-    // ---------------------- admin rpc provider (no server version) ----------------------
90
-    private static ServletServerHandler servletServerHandler;
91
-    private void initRpcProvider(){
92
-        // init
93
-        XxlRpcProviderFactory xxlRpcProviderFactory = new XxlRpcProviderFactory();
94
-        xxlRpcProviderFactory.initConfig(
95
-                NetEnum.NETTY_HTTP,
96
-                Serializer.SerializeEnum.HESSIAN.getSerializer(),
97
-                null,
98
-                0,
99
-                XxlJobAdminConfig.getAdminConfig().getAccessToken(),
100
-                null,
101
-                null);
102
-
103
-        // add services
104
-        xxlRpcProviderFactory.addService(AdminBiz.class.getName(), null, XxlJobAdminConfig.getAdminConfig().getAdminBiz());
105
-
106
-        // servlet handler
107
-        servletServerHandler = new ServletServerHandler(xxlRpcProviderFactory);
108
-    }
109
-    private void stopRpcProvider() throws Exception {
110
-        XxlRpcInvokerFactory.getInstance().stop();
111
-    }
112
-    public static void invokeAdminService(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
113
-        servletServerHandler.handle(null, request, response);
114
-    }
115
-
116
-
117
-    // ---------------------- executor-client ----------------------
118
-    private static ConcurrentMap<String, ExecutorBiz> executorBizRepository = new ConcurrentHashMap<String, ExecutorBiz>();
119
-    public static ExecutorBiz getExecutorBiz(String address) {
120
-        // valid
121
-        if (address==null || address.trim().length()==0) {
122
-            return null;
123
-        }
124
-
125
-        // load-cache
126
-        address = address.trim();
127
-        ExecutorBiz executorBiz = executorBizRepository.get(address);
128
-        if (executorBiz != null) {
129
-            return executorBiz;
130
-        }
131
-
132
-        // set-cache
133
-        executorBiz = (ExecutorBiz) new XxlRpcReferenceBean(
134
-                NetEnum.NETTY_HTTP,
135
-                Serializer.SerializeEnum.HESSIAN.getSerializer(),
136
-                CallType.SYNC,
137
-                LoadBalance.ROUND,
138
-                ExecutorBiz.class,
139
-                null,
140
-                3000,
141
-                address,
142
-                XxlJobAdminConfig.getAdminConfig().getAccessToken(),
143
-                null,
144
-                null).getObject();
145
-
146
-        executorBizRepository.put(address, executorBiz);
147
-        return executorBiz;
148
-    }
149
-
150
-}

+ 8 - 6
xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogGlue.java Visa fil

@@ -1,5 +1,7 @@
1 1
 package com.xxl.job.admin.core.model;
2 2
 
3
+import java.util.Date;
4
+
3 5
 /**
4 6
  * xxl-job log for glue, used to track job code process
5 7
  * @author xuxueli 2016-5-19 17:57:46
@@ -11,8 +13,8 @@ public class XxlJobLogGlue {
11 13
 	private String glueType;		// GLUE类型	#com.xxl.job.core.glue.GlueTypeEnum
12 14
 	private String glueSource;
13 15
 	private String glueRemark;
14
-	private String addTime;
15
-	private String updateTime;
16
+	private Date addTime;
17
+	private Date updateTime;
16 18
 
17 19
 	public int getId() {
18 20
 		return id;
@@ -54,19 +56,19 @@ public class XxlJobLogGlue {
54 56
 		this.glueRemark = glueRemark;
55 57
 	}
56 58
 
57
-	public String getAddTime() {
59
+	public Date getAddTime() {
58 60
 		return addTime;
59 61
 	}
60 62
 
61
-	public void setAddTime(String addTime) {
63
+	public void setAddTime(Date addTime) {
62 64
 		this.addTime = addTime;
63 65
 	}
64 66
 
65
-	public String getUpdateTime() {
67
+	public Date getUpdateTime() {
66 68
 		return updateTime;
67 69
 	}
68 70
 
69
-	public void setUpdateTime(String updateTime) {
71
+	public void setUpdateTime(Date updateTime) {
70 72
 		this.updateTime = updateTime;
71 73
 	}
72 74
 

+ 1 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteBusyover.java Visa fil

@@ -1,6 +1,6 @@
1 1
 package com.xxl.job.admin.core.route.strategy;
2 2
 
3
-import com.xxl.job.admin.core.conf.XxlJobScheduler;
3
+import com.xxl.job.admin.core.scheduler.XxlJobScheduler;
4 4
 import com.xxl.job.admin.core.route.ExecutorRouter;
5 5
 import com.xxl.job.admin.core.util.I18nUtil;
6 6
 import com.xxl.job.core.biz.ExecutorBiz;

+ 1 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFailover.java Visa fil

@@ -1,6 +1,6 @@
1 1
 package com.xxl.job.admin.core.route.strategy;
2 2
 
3
-import com.xxl.job.admin.core.conf.XxlJobScheduler;
3
+import com.xxl.job.admin.core.scheduler.XxlJobScheduler;
4 4
 import com.xxl.job.admin.core.route.ExecutorRouter;
5 5
 import com.xxl.job.admin.core.util.I18nUtil;
6 6
 import com.xxl.job.core.biz.ExecutorBiz;

+ 109 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/core/scheduler/XxlJobScheduler.java Visa fil

@@ -0,0 +1,109 @@
1
+package com.xxl.job.admin.core.scheduler;
2
+
3
+import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
4
+import com.xxl.job.admin.core.thread.JobFailMonitorHelper;
5
+import com.xxl.job.admin.core.thread.JobRegistryMonitorHelper;
6
+import com.xxl.job.admin.core.thread.JobScheduleHelper;
7
+import com.xxl.job.admin.core.thread.JobTriggerPoolHelper;
8
+import com.xxl.job.admin.core.util.I18nUtil;
9
+import com.xxl.job.core.biz.ExecutorBiz;
10
+import com.xxl.job.core.enums.ExecutorBlockStrategyEnum;
11
+import com.xxl.rpc.remoting.invoker.call.CallType;
12
+import com.xxl.rpc.remoting.invoker.reference.XxlRpcReferenceBean;
13
+import com.xxl.rpc.remoting.invoker.route.LoadBalance;
14
+import com.xxl.rpc.remoting.net.impl.netty_http.client.NettyHttpClient;
15
+import com.xxl.rpc.serialize.impl.HessianSerializer;
16
+import org.slf4j.Logger;
17
+import org.slf4j.LoggerFactory;
18
+
19
+import java.util.concurrent.ConcurrentHashMap;
20
+import java.util.concurrent.ConcurrentMap;
21
+
22
+/**
23
+ * @author xuxueli 2018-10-28 00:18:17
24
+ */
25
+
26
+public class XxlJobScheduler  {
27
+    private static final Logger logger = LoggerFactory.getLogger(XxlJobScheduler.class);
28
+
29
+
30
+    public void init() throws Exception {
31
+        // init i18n
32
+        initI18n();
33
+
34
+        // admin registry monitor run
35
+        JobRegistryMonitorHelper.getInstance().start();
36
+
37
+        // admin monitor run
38
+        JobFailMonitorHelper.getInstance().start();
39
+
40
+        // admin trigger pool start
41
+        JobTriggerPoolHelper.toStart();
42
+
43
+        // start-schedule
44
+        JobScheduleHelper.getInstance().start();
45
+
46
+        logger.info(">>>>>>>>> init xxl-job admin success.");
47
+    }
48
+
49
+    
50
+    public void destroy() throws Exception {
51
+
52
+        // stop-schedule
53
+        JobScheduleHelper.getInstance().toStop();
54
+
55
+        // admin trigger pool stop
56
+        JobTriggerPoolHelper.toStop();
57
+
58
+        // admin monitor stop
59
+        JobFailMonitorHelper.getInstance().toStop();
60
+
61
+        // admin registry stop
62
+        JobRegistryMonitorHelper.getInstance().toStop();
63
+
64
+    }
65
+
66
+    // ---------------------- I18n ----------------------
67
+
68
+    private void initI18n(){
69
+        for (ExecutorBlockStrategyEnum item:ExecutorBlockStrategyEnum.values()) {
70
+            item.setTitle(I18nUtil.getString("jobconf_block_".concat(item.name())));
71
+        }
72
+    }
73
+
74
+    // ---------------------- executor-client ----------------------
75
+    private static ConcurrentMap<String, ExecutorBiz> executorBizRepository = new ConcurrentHashMap<String, ExecutorBiz>();
76
+    public static ExecutorBiz getExecutorBiz(String address) throws Exception {
77
+        // valid
78
+        if (address==null || address.trim().length()==0) {
79
+            return null;
80
+        }
81
+
82
+        // load-cache
83
+        address = address.trim();
84
+        ExecutorBiz executorBiz = executorBizRepository.get(address);
85
+        if (executorBiz != null) {
86
+            return executorBiz;
87
+        }
88
+
89
+        // set-cache
90
+        XxlRpcReferenceBean referenceBean = new XxlRpcReferenceBean();
91
+        referenceBean.setClient(NettyHttpClient.class);
92
+        referenceBean.setSerializer(HessianSerializer.class);
93
+        referenceBean.setCallType(CallType.SYNC);
94
+        referenceBean.setLoadBalance(LoadBalance.ROUND);
95
+        referenceBean.setIface(ExecutorBiz.class);
96
+        referenceBean.setVersion(null);
97
+        referenceBean.setTimeout(3000);
98
+        referenceBean.setAddress(address);
99
+        referenceBean.setAccessToken(XxlJobAdminConfig.getAdminConfig().getAccessToken());
100
+        referenceBean.setInvokeCallback(null);
101
+        referenceBean.setInvokerFactory(null);
102
+
103
+        executorBiz = (ExecutorBiz) referenceBean.getObject();
104
+
105
+        executorBizRepository.put(address, executorBiz);
106
+        return executorBiz;
107
+    }
108
+
109
+}

+ 3 - 6
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryMonitorHelper.java Visa fil

@@ -7,10 +7,7 @@ import com.xxl.job.core.enums.RegistryConfig;
7 7
 import org.slf4j.Logger;
8 8
 import org.slf4j.LoggerFactory;
9 9
 
10
-import java.util.ArrayList;
11
-import java.util.Collections;
12
-import java.util.HashMap;
13
-import java.util.List;
10
+import java.util.*;
14 11
 import java.util.concurrent.TimeUnit;
15 12
 
16 13
 /**
@@ -38,14 +35,14 @@ public class JobRegistryMonitorHelper {
38 35
 						if (groupList!=null && !groupList.isEmpty()) {
39 36
 
40 37
 							// remove dead address (admin/executor)
41
-							List<Integer> ids = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findDead(RegistryConfig.DEAD_TIMEOUT);
38
+							List<Integer> ids = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findDead(RegistryConfig.DEAD_TIMEOUT, new Date());
42 39
 							if (ids!=null && ids.size()>0) {
43 40
 								XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().removeDead(ids);
44 41
 							}
45 42
 
46 43
 							// fresh online address (admin/executor)
47 44
 							HashMap<String, List<String>> appAddressMap = new HashMap<String, List<String>>();
48
-							List<XxlJobRegistry> list = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findAll(RegistryConfig.DEAD_TIMEOUT);
45
+							List<XxlJobRegistry> list = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findAll(RegistryConfig.DEAD_TIMEOUT, new Date());
49 46
 							if (list != null) {
50 47
 								for (XxlJobRegistry item: list) {
51 48
 									if (RegistryConfig.RegistType.EXECUTOR.name().equals(item.getRegistryGroup())) {

+ 6 - 8
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java Visa fil

@@ -50,6 +50,9 @@ public class JobScheduleHelper {
50 50
                 }
51 51
                 logger.info(">>>>>>>>> init xxl-job admin scheduler success.");
52 52
 
53
+                // pre-read count: treadpool-size * trigger-qps (each trigger cost 50ms, qps = 1000/50 = 20)
54
+                int preReadCount = (XxlJobAdminConfig.getAdminConfig().getTriggerPoolFastMax() + XxlJobAdminConfig.getAdminConfig().getTriggerPoolSlowMax()) * 20;
55
+
53 56
                 while (!scheduleThreadToStop) {
54 57
 
55 58
                     // Scan Job
@@ -73,7 +76,7 @@ public class JobScheduleHelper {
73 76
 
74 77
                         // 1、pre read
75 78
                         long nowTime = System.currentTimeMillis();
76
-                        List<XxlJobInfo> scheduleList = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().scheduleJobQuery(nowTime + PRE_READ_MS);
79
+                        List<XxlJobInfo> scheduleList = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().scheduleJobQuery(nowTime + PRE_READ_MS, preReadCount);
77 80
                         if (scheduleList!=null && scheduleList.size()>0) {
78 81
                             // 2、push time-ring
79 82
                             for (XxlJobInfo jobInfo: scheduleList) {
@@ -88,20 +91,15 @@ public class JobScheduleHelper {
88 91
                                 } else if (nowTime > jobInfo.getTriggerNextTime()) {
89 92
                                     // 2.2、trigger-expire < 5s:direct-trigger && make next-trigger-time
90 93
 
91
-                                    CronExpression cronExpression = new CronExpression(jobInfo.getJobCron());
92
-                                    long nextTime = cronExpression.getNextValidTimeAfter(new Date()).getTime();
93
-
94 94
                                     // 1、trigger
95 95
                                     JobTriggerPoolHelper.trigger(jobInfo.getId(), TriggerTypeEnum.CRON, -1, null, null);
96 96
                                     logger.debug(">>>>>>>>>>> xxl-job, schedule push trigger : jobId = " + jobInfo.getId() );
97 97
 
98 98
                                     // 2、fresh next
99
-                                    jobInfo.setTriggerLastTime(jobInfo.getTriggerNextTime());
100
-                                    jobInfo.setTriggerNextTime(nextTime);
101
-
99
+                                    refreshNextValidTime(jobInfo, new Date());
102 100
 
103 101
                                     // next-trigger-time in 5s, pre-read again
104
-                                    if (jobInfo.getTriggerNextTime() - nowTime < PRE_READ_MS) {
102
+                                    if (jobInfo.getTriggerStatus()==1 && nowTime + PRE_READ_MS > jobInfo.getTriggerNextTime()) {
105 103
 
106 104
                                         // 1、make ring second
107 105
                                         int ringSecond = (int)((jobInfo.getTriggerNextTime()/1000)%60);

+ 47 - 35
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java Visa fil

@@ -1,5 +1,6 @@
1 1
 package com.xxl.job.admin.core.thread;
2 2
 
3
+import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
3 4
 import com.xxl.job.admin.core.trigger.TriggerTypeEnum;
4 5
 import com.xxl.job.admin.core.trigger.XxlJobTrigger;
5 6
 import org.slf4j.Logger;
@@ -20,31 +21,44 @@ public class JobTriggerPoolHelper {
20 21
     // ---------------------- trigger pool ----------------------
21 22
 
22 23
     // fast/slow thread pool
23
-    private ThreadPoolExecutor fastTriggerPool = new ThreadPoolExecutor(
24
-            50,
25
-            200,
26
-            60L,
27
-            TimeUnit.SECONDS,
28
-            new LinkedBlockingQueue<Runnable>(1000),
29
-            new ThreadFactory() {
30
-                @Override
31
-                public Thread newThread(Runnable r) {
32
-                    return new Thread(r, "xxl-job, admin JobTriggerPoolHelper-fastTriggerPool-" + r.hashCode());
33
-                }
34
-            });
35
-
36
-    private ThreadPoolExecutor slowTriggerPool = new ThreadPoolExecutor(
37
-            10,
38
-            100,
39
-            60L,
40
-            TimeUnit.SECONDS,
41
-            new LinkedBlockingQueue<Runnable>(2000),
42
-            new ThreadFactory() {
43
-                @Override
44
-                public Thread newThread(Runnable r) {
45
-                    return new Thread(r, "xxl-job, admin JobTriggerPoolHelper-slowTriggerPool-" + r.hashCode());
46
-                }
47
-            });
24
+    private ThreadPoolExecutor fastTriggerPool = null;
25
+    private ThreadPoolExecutor slowTriggerPool = null;
26
+
27
+    public void start(){
28
+        fastTriggerPool = new ThreadPoolExecutor(
29
+                10,
30
+                XxlJobAdminConfig.getAdminConfig().getTriggerPoolFastMax(),
31
+                60L,
32
+                TimeUnit.SECONDS,
33
+                new LinkedBlockingQueue<Runnable>(1000),
34
+                new ThreadFactory() {
35
+                    @Override
36
+                    public Thread newThread(Runnable r) {
37
+                        return new Thread(r, "xxl-job, admin JobTriggerPoolHelper-fastTriggerPool-" + r.hashCode());
38
+                    }
39
+                });
40
+
41
+        slowTriggerPool = new ThreadPoolExecutor(
42
+                10,
43
+                XxlJobAdminConfig.getAdminConfig().getTriggerPoolSlowMax(),
44
+                60L,
45
+                TimeUnit.SECONDS,
46
+                new LinkedBlockingQueue<Runnable>(2000),
47
+                new ThreadFactory() {
48
+                    @Override
49
+                    public Thread newThread(Runnable r) {
50
+                        return new Thread(r, "xxl-job, admin JobTriggerPoolHelper-slowTriggerPool-" + r.hashCode());
51
+                    }
52
+                });
53
+    }
54
+
55
+
56
+    public void stop() {
57
+        //triggerPool.shutdown();
58
+        fastTriggerPool.shutdownNow();
59
+        slowTriggerPool.shutdownNow();
60
+        logger.info(">>>>>>>>> xxl-job trigger thread pool shutdown success.");
61
+    }
48 62
 
49 63
 
50 64
     // job timeout count
@@ -100,17 +114,19 @@ public class JobTriggerPoolHelper {
100 114
         });
101 115
     }
102 116
 
103
-    public void stop() {
104
-        //triggerPool.shutdown();
105
-        fastTriggerPool.shutdownNow();
106
-        slowTriggerPool.shutdownNow();
107
-        logger.info(">>>>>>>>> xxl-job trigger thread pool shutdown success.");
108
-    }
117
+
109 118
 
110 119
     // ---------------------- helper ----------------------
111 120
 
112 121
     private static JobTriggerPoolHelper helper = new JobTriggerPoolHelper();
113 122
 
123
+    public static void toStart() {
124
+        helper.start();
125
+    }
126
+    public static void toStop() {
127
+        helper.stop();
128
+    }
129
+
114 130
     /**
115 131
      * @param jobId
116 132
      * @param triggerType
@@ -126,8 +142,4 @@ public class JobTriggerPoolHelper {
126 142
         helper.addTrigger(jobId, triggerType, failRetryCount, executorShardingParam, executorParam);
127 143
     }
128 144
 
129
-    public static void toStop() {
130
-        helper.stop();
131
-    }
132
-
133 145
 }

+ 2 - 2
xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java Visa fil

@@ -1,7 +1,7 @@
1 1
 package com.xxl.job.admin.core.trigger;
2 2
 
3 3
 import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
4
-import com.xxl.job.admin.core.conf.XxlJobScheduler;
4
+import com.xxl.job.admin.core.scheduler.XxlJobScheduler;
5 5
 import com.xxl.job.admin.core.model.XxlJobGroup;
6 6
 import com.xxl.job.admin.core.model.XxlJobInfo;
7 7
 import com.xxl.job.admin.core.model.XxlJobLog;
@@ -116,7 +116,7 @@ public class XxlJobTrigger {
116 116
         triggerParam.setExecutorBlockStrategy(jobInfo.getExecutorBlockStrategy());
117 117
         triggerParam.setExecutorTimeout(jobInfo.getExecutorTimeout());
118 118
         triggerParam.setLogId(jobLog.getId());
119
-        triggerParam.setLogDateTim(jobLog.getTriggerTime().getTime());
119
+        triggerParam.setLogDateTime(jobLog.getTriggerTime().getTime());
120 120
         triggerParam.setGlueType(jobInfo.getGlueType());
121 121
         triggerParam.setGlueSource(jobInfo.getGlueSource());
122 122
         triggerParam.setGlueUpdatetime(jobInfo.getGlueUpdatetime().getTime());

+ 1 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobInfoDao.java Visa fil

@@ -41,7 +41,7 @@ public interface XxlJobInfoDao {
41 41
 
42 42
 	public int findAllCount();
43 43
 
44
-	public List<XxlJobInfo> scheduleJobQuery(@Param("maxNextTime") long maxNextTime);
44
+	public List<XxlJobInfo> scheduleJobQuery(@Param("maxNextTime") long maxNextTime, @Param("pagesize") int pagesize );
45 45
 
46 46
 	public int scheduleUpdate(XxlJobInfo xxlJobInfo);
47 47
 

+ 9 - 4
xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobRegistryDao.java Visa fil

@@ -4,6 +4,7 @@ import com.xxl.job.admin.core.model.XxlJobRegistry;
4 4
 import org.apache.ibatis.annotations.Mapper;
5 5
 import org.apache.ibatis.annotations.Param;
6 6
 
7
+import java.util.Date;
7 8
 import java.util.List;
8 9
 
9 10
 /**
@@ -12,19 +13,23 @@ import java.util.List;
12 13
 @Mapper
13 14
 public interface XxlJobRegistryDao {
14 15
 
15
-    public List<Integer> findDead(@Param("timeout") int timeout);
16
+    public List<Integer> findDead(@Param("timeout") int timeout,
17
+                                  @Param("nowTime") Date nowTime);
16 18
 
17 19
     public int removeDead(@Param("ids") List<Integer> ids);
18 20
 
19
-    public List<XxlJobRegistry> findAll(@Param("timeout") int timeout);
21
+    public List<XxlJobRegistry> findAll(@Param("timeout") int timeout,
22
+                                        @Param("nowTime") Date nowTime);
20 23
 
21 24
     public int registryUpdate(@Param("registryGroup") String registryGroup,
22 25
                               @Param("registryKey") String registryKey,
23
-                              @Param("registryValue") String registryValue);
26
+                              @Param("registryValue") String registryValue,
27
+                              @Param("updateTime") Date updateTime);
24 28
 
25 29
     public int registrySave(@Param("registryGroup") String registryGroup,
26 30
                             @Param("registryKey") String registryKey,
27
-                            @Param("registryValue") String registryValue);
31
+                            @Param("registryValue") String registryValue,
32
+                            @Param("updateTime") Date updateTime);
28 33
 
29 34
     public int registryDelete(@Param("registryGroup") String registryGroup,
30 35
                           @Param("registryKey") String registryKey,

+ 20 - 3
xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java Visa fil

@@ -17,6 +17,7 @@ import com.xxl.job.core.handler.IJobHandler;
17 17
 import org.slf4j.Logger;
18 18
 import org.slf4j.LoggerFactory;
19 19
 import org.springframework.stereotype.Service;
20
+import org.springframework.util.StringUtils;
20 21
 
21 22
 import javax.annotation.Resource;
22 23
 import java.text.MessageFormat;
@@ -126,9 +127,17 @@ public class AdminBizImpl implements AdminBiz {
126 127
 
127 128
     @Override
128 129
     public ReturnT<String> registry(RegistryParam registryParam) {
129
-        int ret = xxlJobRegistryDao.registryUpdate(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue());
130
+
131
+        // valid
132
+        if (!StringUtils.hasText(registryParam.getRegistGroup())
133
+                || !StringUtils.hasText(registryParam.getRegistryKey())
134
+                || !StringUtils.hasText(registryParam.getRegistryValue())) {
135
+            return new ReturnT<String>(ReturnT.FAIL_CODE, "Illegal Argument.");
136
+        }
137
+
138
+        int ret = xxlJobRegistryDao.registryUpdate(registryParam.getRegistGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date());
130 139
         if (ret < 1) {
131
-            xxlJobRegistryDao.registrySave(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue());
140
+            xxlJobRegistryDao.registrySave(registryParam.getRegistGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date());
132 141
 
133 142
             // fresh
134 143
             freshGroupRegistryInfo(registryParam);
@@ -138,7 +147,15 @@ public class AdminBizImpl implements AdminBiz {
138 147
 
139 148
     @Override
140 149
     public ReturnT<String> registryRemove(RegistryParam registryParam) {
141
-        int ret = xxlJobRegistryDao.registryDelete(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue());
150
+
151
+        // valid
152
+        if (!StringUtils.hasText(registryParam.getRegistGroup())
153
+                || !StringUtils.hasText(registryParam.getRegistryKey())
154
+                || !StringUtils.hasText(registryParam.getRegistryValue())) {
155
+            return new ReturnT<String>(ReturnT.FAIL_CODE, "Illegal Argument.");
156
+        }
157
+
158
+        int ret = xxlJobRegistryDao.registryDelete(registryParam.getRegistGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue());
142 159
         if (ret > 0) {
143 160
 
144 161
             // fresh

+ 7 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java Visa fil

@@ -117,6 +117,9 @@ public class XxlJobServiceImpl implements XxlJobService {
117 117
 		}
118 118
 
119 119
 		// add in db
120
+		jobInfo.setAddTime(new Date());
121
+		jobInfo.setUpdateTime(new Date());
122
+		jobInfo.setGlueUpdatetime(new Date());
120 123
 		xxlJobInfoDao.save(jobInfo);
121 124
 		if (jobInfo.getId() < 1) {
122 125
 			return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_add")+I18nUtil.getString("system_fail")) );
@@ -220,6 +223,8 @@ public class XxlJobServiceImpl implements XxlJobService {
220 223
 		exists_jobInfo.setExecutorFailRetryCount(jobInfo.getExecutorFailRetryCount());
221 224
 		exists_jobInfo.setChildJobId(jobInfo.getChildJobId());
222 225
 		exists_jobInfo.setTriggerNextTime(nextTriggerTime);
226
+
227
+		exists_jobInfo.setUpdateTime(new Date());
223 228
         xxlJobInfoDao.update(exists_jobInfo);
224 229
 
225 230
 
@@ -260,6 +265,7 @@ public class XxlJobServiceImpl implements XxlJobService {
260 265
 		xxlJobInfo.setTriggerLastTime(0);
261 266
 		xxlJobInfo.setTriggerNextTime(nextTriggerTime);
262 267
 
268
+		xxlJobInfo.setUpdateTime(new Date());
263 269
 		xxlJobInfoDao.update(xxlJobInfo);
264 270
 		return ReturnT.SUCCESS;
265 271
 	}
@@ -272,6 +278,7 @@ public class XxlJobServiceImpl implements XxlJobService {
272 278
 		xxlJobInfo.setTriggerLastTime(0);
273 279
 		xxlJobInfo.setTriggerNextTime(0);
274 280
 
281
+		xxlJobInfo.setUpdateTime(new Date());
275 282
 		xxlJobInfoDao.update(xxlJobInfo);
276 283
 		return ReturnT.SUCCESS;
277 284
 	}

+ 4 - 0
xxl-job-admin/src/main/resources/application.properties Visa fil

@@ -44,3 +44,7 @@ xxl.job.accessToken=
44 44
 
45 45
 ### xxl-job, i18n (default empty as chinese, "en" as english)
46 46
 xxl.job.i18n=
47
+
48
+## xxl-job, triggerpool max size
49
+xxl.job.triggerpool.fast.max=200
50
+xxl.job.triggerpool.slow.max=100

+ 7 - 5
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml Visa fil

@@ -133,8 +133,8 @@
133 133
 			#{jobGroup},
134 134
 			#{jobCron},
135 135
 			#{jobDesc},
136
-			NOW(),
137
-			NOW(),
136
+			#{addTime},
137
+			#{updateTime},
138 138
 			#{author},
139 139
 			#{alarmEmail},
140 140
 			#{executorRouteStrategy},
@@ -146,7 +146,7 @@
146 146
 			#{glueType},
147 147
 			#{glueSource},
148 148
 			#{glueRemark},
149
-			NOW(),
149
+			#{glueUpdatetime},
150 150
 			#{childJobId},
151 151
 			#{triggerStatus},
152 152
 			#{triggerLastTime},
@@ -170,7 +170,7 @@
170 170
 			job_group = #{jobGroup},
171 171
 			job_cron = #{jobCron},
172 172
 			job_desc = #{jobDesc},
173
-			update_time = NOW(),
173
+			update_time = #{updateTime},
174 174
 			author = #{author},
175 175
 			alarm_email = #{alarmEmail},
176 176
 			executor_route_strategy = #{executorRouteStrategy},
@@ -212,7 +212,9 @@
212 212
 		SELECT <include refid="Base_Column_List" />
213 213
 		FROM xxl_job_info AS t
214 214
 		WHERE t.trigger_status = 1
215
-			and t.trigger_next_time<![CDATA[ <= ]]> #{maxNextTime}
215
+			and t.trigger_next_time <![CDATA[ <= ]]> #{maxNextTime}
216
+		ORDER BY id ASC
217
+		LIMIT #{pagesize}
216 218
 	</select>
217 219
 
218 220
 	<update id="scheduleUpdate" parameterType="com.xxl.job.admin.core.model.XxlJobInfo"  >

+ 2 - 2
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogGlueMapper.xml Visa fil

@@ -36,8 +36,8 @@
36 36
 			#{glueType},
37 37
 			#{glueSource},
38 38
 			#{glueRemark},
39
-			now(),
40
-			now()
39
+			#{addTime},
40
+			#{updateTime}
41 41
 		);
42 42
 		<!--<selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id">
43 43
 			SELECT LAST_INSERT_ID() 

+ 1 - 0
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml Visa fil

@@ -227,6 +227,7 @@
227 227
 		)
228 228
 		AND `alarm_status` = 0
229 229
 		ORDER BY id ASC
230
+		LIMIT #{pagesize}
230 231
 	</select>
231 232
 
232 233
 	<update id="updateAlarmStatus" >

+ 6 - 6
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobRegistryMapper.xml Visa fil

@@ -19,10 +19,10 @@
19 19
 		t.update_time
20 20
 	</sql>
21 21
 
22
-	<select id="findDead" parameterType="java.lang.Integer" resultType="java.lang.Integer" >
22
+	<select id="findDead" parameterType="java.util.HashMap" resultType="java.lang.Integer" >
23 23
 		SELECT t.id
24 24
 		FROM xxl_job_registry AS t
25
-		WHERE t.update_time <![CDATA[ < ]]> DATE_ADD(NOW(),INTERVAL -#{timeout} SECOND)
25
+		WHERE t.update_time <![CDATA[ < ]]> DATE_ADD(#{nowTime},INTERVAL -#{timeout} SECOND)
26 26
 	</select>
27 27
 	
28 28
 	<delete id="removeDead" parameterType="java.lang.Integer" >
@@ -33,15 +33,15 @@
33 33
 		</foreach>
34 34
 	</delete>
35 35
 
36
-	<select id="findAll" parameterType="java.lang.Integer" resultMap="XxlJobRegistry">
36
+	<select id="findAll" parameterType="java.util.HashMap" resultMap="XxlJobRegistry">
37 37
 		SELECT <include refid="Base_Column_List" />
38 38
 		FROM xxl_job_registry AS t
39
-		WHERE t.update_time <![CDATA[ > ]]> DATE_ADD(NOW(),INTERVAL -#{timeout} SECOND)
39
+		WHERE t.update_time <![CDATA[ > ]]> DATE_ADD(#{nowTime},INTERVAL -#{timeout} SECOND)
40 40
 	</select>
41 41
 
42 42
     <update id="registryUpdate" >
43 43
         UPDATE xxl_job_registry
44
-        SET `update_time` = NOW()
44
+        SET `update_time` = #{updateTime}
45 45
         WHERE `registry_group` = #{registryGroup}
46 46
           AND `registry_key` = #{registryKey}
47 47
           AND `registry_value` = #{registryValue}
@@ -49,7 +49,7 @@
49 49
 
50 50
     <insert id="registrySave" >
51 51
         INSERT INTO xxl_job_registry( `registry_group` , `registry_key` , `registry_value`, `update_time`)
52
-        VALUES( #{registryGroup}  , #{registryKey} , #{registryValue}, NOW())
52
+        VALUES( #{registryGroup}  , #{registryKey} , #{registryValue}, #{updateTime})
53 53
     </insert>
54 54
 
55 55
 	<delete id="registryDelete" >

+ 1 - 1
xxl-job-admin/src/main/resources/templates/common/common.macro.ftl Visa fil

@@ -109,7 +109,7 @@
109 109
 					<form class="form-horizontal form" role="form" >
110 110
 						<div class="form-group">
111 111
 							<label for="lastname" class="col-sm-2 control-label">${I18n.change_pwd_field_newpwd}<font color="red">*</font></label>
112
-							<div class="col-sm-10"><input type="text" class="form-control" name="password" placeholder="${I18n.system_please_input} ${I18n.change_pwd_field_newpwd}" maxlength="100" ></div>
112
+							<div class="col-sm-10"><input type="text" class="form-control" name="password" placeholder="${I18n.system_please_input} ${I18n.change_pwd_field_newpwd}" maxlength="18" ></div>
113 113
 						</div>
114 114
 						<hr>
115 115
 						<div class="form-group">

+ 2 - 2
xxl-job-admin/src/main/resources/templates/login.ftl Visa fil

@@ -15,11 +15,11 @@
15 15
 			<div class="login-box-body">
16 16
 				<p class="login-box-msg">${I18n.admin_name}</p>
17 17
 				<div class="form-group has-feedback">
18
-	            	<input type="text" name="userName" class="form-control" placeholder="${I18n.login_username_placeholder}"  maxlength="20" >
18
+	            	<input type="text" name="userName" class="form-control" placeholder="${I18n.login_username_placeholder}"  maxlength="18" >
19 19
 	            	<span class="glyphicon glyphicon-envelope form-control-feedback"></span>
20 20
 				</div>
21 21
 	          	<div class="form-group has-feedback">
22
-	            	<input type="password" name="password" class="form-control" placeholder="${I18n.login_password_placeholder}"  maxlength="20" >
22
+	            	<input type="password" name="password" class="form-control" placeholder="${I18n.login_password_placeholder}"  maxlength="18" >
23 23
 	            	<span class="glyphicon glyphicon-lock form-control-feedback"></span>
24 24
 	          	</div>
25 25
 				<div class="row">

+ 5 - 2
xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobInfoDaoTest.java Visa fil

@@ -4,8 +4,6 @@ import com.xxl.job.admin.core.model.XxlJobInfo;
4 4
 import org.junit.Test;
5 5
 import org.junit.runner.RunWith;
6 6
 import org.springframework.boot.test.context.SpringBootTest;
7
-import org.springframework.test.context.ContextConfiguration;
8
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
9 7
 import org.springframework.test.context.junit4.SpringRunner;
10 8
 
11 9
 import javax.annotation.Resource;
@@ -47,6 +45,10 @@ public class XxlJobInfoDaoTest {
47 45
 		info.setGlueRemark("setGlueRemark");
48 46
 		info.setChildJobId("1");
49 47
 
48
+		info.setAddTime(new Date());
49
+		info.setUpdateTime(new Date());
50
+		info.setGlueUpdatetime(new Date());
51
+
50 52
 		int count = xxlJobInfoDao.save(info);
51 53
 
52 54
 		XxlJobInfo info2 = xxlJobInfoDao.loadById(info.getId());
@@ -64,6 +66,7 @@ public class XxlJobInfoDaoTest {
64 66
 		info2.setGlueUpdatetime(new Date());
65 67
 		info2.setChildJobId("1");
66 68
 
69
+		info2.setUpdateTime(new Date());
67 70
 		int item2 = xxlJobInfoDao.update(info2);
68 71
 
69 72
 		xxlJobInfoDao.delete(info2.getId());

+ 4 - 3
xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobLogGlueDaoTest.java Visa fil

@@ -1,15 +1,13 @@
1 1
 package com.xxl.job.admin.dao;
2 2
 
3 3
 import com.xxl.job.admin.core.model.XxlJobLogGlue;
4
-import com.xxl.job.admin.dao.XxlJobLogGlueDao;
5 4
 import org.junit.Test;
6 5
 import org.junit.runner.RunWith;
7 6
 import org.springframework.boot.test.context.SpringBootTest;
8
-import org.springframework.test.context.ContextConfiguration;
9
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
10 7
 import org.springframework.test.context.junit4.SpringRunner;
11 8
 
12 9
 import javax.annotation.Resource;
10
+import java.util.Date;
13 11
 import java.util.List;
14 12
 
15 13
 @RunWith(SpringRunner.class)
@@ -26,6 +24,9 @@ public class XxlJobLogGlueDaoTest {
26 24
         logGlue.setGlueType("1");
27 25
         logGlue.setGlueSource("1");
28 26
         logGlue.setGlueRemark("1");
27
+
28
+        logGlue.setAddTime(new Date());
29
+        logGlue.setUpdateTime(new Date());
29 30
         int ret = xxlJobLogGlueDao.save(logGlue);
30 31
 
31 32
         List<XxlJobLogGlue> list = xxlJobLogGlueDao.findByJobId(1);

+ 4 - 3
xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobRegistryDaoTest.java Visa fil

@@ -8,6 +8,7 @@ import org.springframework.test.context.junit4.SpringRunner;
8 8
 
9 9
 import javax.annotation.Resource;
10 10
 import java.util.Arrays;
11
+import java.util.Date;
11 12
 import java.util.List;
12 13
 
13 14
 @RunWith(SpringRunner.class)
@@ -19,12 +20,12 @@ public class XxlJobRegistryDaoTest {
19 20
 
20 21
     @Test
21 22
     public void test(){
22
-        int ret = xxlJobRegistryDao.registryUpdate("g1", "k1", "v1");
23
+        int ret = xxlJobRegistryDao.registryUpdate("g1", "k1", "v1", new Date());
23 24
         if (ret < 1) {
24
-            ret = xxlJobRegistryDao.registrySave("g1", "k1", "v1");
25
+            ret = xxlJobRegistryDao.registrySave("g1", "k1", "v1", new Date());
25 26
         }
26 27
 
27
-        List<XxlJobRegistry> list = xxlJobRegistryDao.findAll(1);
28
+        List<XxlJobRegistry> list = xxlJobRegistryDao.findAll(1, new Date());
28 29
 
29 30
         int ret2 = xxlJobRegistryDao.removeDead(Arrays.asList(1));
30 31
     }

+ 29 - 43
xxl-job-admin/src/test/java/com/xxl/job/adminbiz/AdminBizTest.java Visa fil

@@ -1,18 +1,17 @@
1 1
 package com.xxl.job.adminbiz;
2 2
 
3 3
 import com.xxl.job.core.biz.AdminBiz;
4
+import com.xxl.job.core.biz.client.AdminBizClient;
5
+import com.xxl.job.core.biz.model.HandleCallbackParam;
4 6
 import com.xxl.job.core.biz.model.RegistryParam;
5 7
 import com.xxl.job.core.biz.model.ReturnT;
6 8
 import com.xxl.job.core.enums.RegistryConfig;
7
-import com.xxl.rpc.remoting.invoker.XxlRpcInvokerFactory;
8
-import com.xxl.rpc.remoting.invoker.call.CallType;
9
-import com.xxl.rpc.remoting.invoker.reference.XxlRpcReferenceBean;
10
-import com.xxl.rpc.remoting.invoker.route.LoadBalance;
11
-import com.xxl.rpc.remoting.net.NetEnum;
12
-import com.xxl.rpc.serialize.Serializer;
13 9
 import org.junit.Assert;
14 10
 import org.junit.Test;
15 11
 
12
+import java.util.Arrays;
13
+import java.util.List;
14
+
16 15
 /**
17 16
  * admin api test
18 17
  *
@@ -21,37 +20,38 @@ import org.junit.Test;
21 20
 public class AdminBizTest {
22 21
 
23 22
     // admin-client
24
-    private static String addressUrl = "http://127.0.0.1:8080/xxl-job-admin".concat(AdminBiz.MAPPING);
23
+    private static String addressUrl = "http://127.0.0.1:8080/xxl-job-admin/";
25 24
     private static String accessToken = null;
26 25
 
26
+
27
+    @Test
28
+    public void callback() throws Exception {
29
+        AdminBiz adminBiz = new AdminBizClient(addressUrl, accessToken);
30
+
31
+        HandleCallbackParam param = new HandleCallbackParam();
32
+        param.setLogId(1);
33
+        param.setExecuteResult(ReturnT.SUCCESS);
34
+
35
+        List<HandleCallbackParam> callbackParamList = Arrays.asList(param);
36
+
37
+        ReturnT<String> returnT = adminBiz.callback(callbackParamList);
38
+
39
+        Assert.assertTrue(returnT.getCode() == ReturnT.SUCCESS_CODE);
40
+    }
41
+
27 42
     /**
28 43
      * registry executor
29 44
      *
30 45
      * @throws Exception
31 46
      */
32 47
     @Test
33
-    public void registryTest() throws Exception {
34
-        addressUrl = addressUrl.replace("http://", "");
35
-        AdminBiz adminBiz = (AdminBiz) new XxlRpcReferenceBean(
36
-                NetEnum.NETTY_HTTP,
37
-                Serializer.SerializeEnum.HESSIAN.getSerializer(),
38
-                CallType.SYNC,
39
-                LoadBalance.ROUND,
40
-                AdminBiz.class,
41
-                null,
42
-                3000,
43
-                addressUrl,
44
-                accessToken,
45
-                null,
46
-                null).getObject();
47
-
48
-        // test executor registry
48
+    public void registry() throws Exception {
49
+        AdminBiz adminBiz = new AdminBizClient(addressUrl, accessToken);
50
+
49 51
         RegistryParam registryParam = new RegistryParam(RegistryConfig.RegistType.EXECUTOR.name(), "xxl-job-executor-example", "127.0.0.1:9999");
50 52
         ReturnT<String> returnT = adminBiz.registry(registryParam);
51
-        Assert.assertTrue(returnT.getCode() == ReturnT.SUCCESS_CODE);
52 53
 
53
-        // stop invoker
54
-        XxlRpcInvokerFactory.getInstance().stop();
54
+        Assert.assertTrue(returnT.getCode() == ReturnT.SUCCESS_CODE);
55 55
     }
56 56
 
57 57
     /**
@@ -61,27 +61,13 @@ public class AdminBizTest {
61 61
      */
62 62
     @Test
63 63
     public void registryRemove() throws Exception {
64
-        addressUrl = addressUrl.replace("http://", "");
65
-        AdminBiz adminBiz = (AdminBiz) new XxlRpcReferenceBean(
66
-                NetEnum.NETTY_HTTP,
67
-                Serializer.SerializeEnum.HESSIAN.getSerializer(),
68
-                CallType.SYNC,
69
-                LoadBalance.ROUND,
70
-                AdminBiz.class,
71
-                null,
72
-                3000,
73
-                addressUrl,
74
-                accessToken,
75
-                null,
76
-                null).getObject();
77
-
78
-        // test executor registry remove
64
+        AdminBiz adminBiz = new AdminBizClient(addressUrl, accessToken);
65
+
79 66
         RegistryParam registryParam = new RegistryParam(RegistryConfig.RegistType.EXECUTOR.name(), "xxl-job-executor-example", "127.0.0.1:9999");
80 67
         ReturnT<String> returnT = adminBiz.registryRemove(registryParam);
68
+
81 69
         Assert.assertTrue(returnT.getCode() == ReturnT.SUCCESS_CODE);
82 70
 
83
-        // stop invoker
84
-        XxlRpcInvokerFactory.getInstance().stop();
85 71
     }
86 72
 
87 73
 }

+ 18 - 15
xxl-job-admin/src/test/java/com/xxl/job/executor/ExecutorBizTest.java Visa fil

@@ -9,8 +9,8 @@ import com.xxl.rpc.remoting.invoker.XxlRpcInvokerFactory;
9 9
 import com.xxl.rpc.remoting.invoker.call.CallType;
10 10
 import com.xxl.rpc.remoting.invoker.reference.XxlRpcReferenceBean;
11 11
 import com.xxl.rpc.remoting.invoker.route.LoadBalance;
12
-import com.xxl.rpc.remoting.net.NetEnum;
13
-import com.xxl.rpc.serialize.Serializer;
12
+import com.xxl.rpc.remoting.net.impl.netty_http.client.NettyHttpClient;
13
+import com.xxl.rpc.serialize.impl.HessianSerializer;
14 14
 
15 15
 /**
16 16
  * executor-api client, test
@@ -45,22 +45,25 @@ public class ExecutorBizTest {
45 45
         triggerParam.setGlueSource(null);
46 46
         triggerParam.setGlueUpdatetime(System.currentTimeMillis());
47 47
         triggerParam.setLogId(1);
48
-        triggerParam.setLogDateTim(System.currentTimeMillis());
48
+        triggerParam.setLogDateTime(System.currentTimeMillis());
49 49
 
50 50
         // do remote trigger
51 51
         String accessToken = null;
52
-        ExecutorBiz executorBiz = (ExecutorBiz) new XxlRpcReferenceBean(
53
-                NetEnum.NETTY_HTTP,
54
-                Serializer.SerializeEnum.HESSIAN.getSerializer(),
55
-                CallType.SYNC,
56
-                LoadBalance.ROUND,
57
-                ExecutorBiz.class,
58
-                null,
59
-                3000,
60
-                "127.0.0.1:9999",
61
-                null,
62
-                null,
63
-                null).getObject();
52
+
53
+        XxlRpcReferenceBean referenceBean = new XxlRpcReferenceBean();
54
+        referenceBean.setClient(NettyHttpClient.class);
55
+        referenceBean.setSerializer(HessianSerializer.class);
56
+        referenceBean.setCallType(CallType.SYNC);
57
+        referenceBean.setLoadBalance(LoadBalance.ROUND);
58
+        referenceBean.setIface(ExecutorBiz.class);
59
+        referenceBean.setVersion(null);
60
+        referenceBean.setTimeout(3000);
61
+        referenceBean.setAddress("127.0.0.1:9999");
62
+        referenceBean.setAccessToken(accessToken);
63
+        referenceBean.setInvokeCallback(null);
64
+        referenceBean.setInvokerFactory(null);
65
+
66
+        ExecutorBiz executorBiz = (ExecutorBiz) referenceBean.getObject();
64 67
 
65 68
         ReturnT<String> runResult = executorBiz.run(triggerParam);
66 69
 

+ 0 - 2
xxl-job-core/src/main/java/com/xxl/job/core/biz/AdminBiz.java Visa fil

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

+ 48 - 0
xxl-job-core/src/main/java/com/xxl/job/core/biz/client/AdminBizClient.java Visa fil

@@ -0,0 +1,48 @@
1
+package com.xxl.job.core.biz.client;
2
+
3
+import com.xxl.job.core.biz.AdminBiz;
4
+import com.xxl.job.core.biz.model.HandleCallbackParam;
5
+import com.xxl.job.core.biz.model.RegistryParam;
6
+import com.xxl.job.core.biz.model.ReturnT;
7
+import com.xxl.job.core.util.XxlJobRemotingUtil;
8
+
9
+import java.util.List;
10
+
11
+/**
12
+ * admin api test
13
+ *
14
+ * @author xuxueli 2017-07-28 22:14:52
15
+ */
16
+public class AdminBizClient implements AdminBiz {
17
+
18
+    public AdminBizClient() {
19
+    }
20
+    public AdminBizClient(String addressUrl, String accessToken) {
21
+        this.addressUrl = addressUrl;
22
+        this.accessToken = accessToken;
23
+
24
+        // valid
25
+        if (!this.addressUrl.endsWith("/")) {
26
+            this.addressUrl = this.addressUrl + "/";
27
+        }
28
+    }
29
+
30
+    private String addressUrl ;
31
+    private String accessToken;
32
+
33
+
34
+    @Override
35
+    public ReturnT<String> callback(List<HandleCallbackParam> callbackParamList) {
36
+        return XxlJobRemotingUtil.postBody(addressUrl+"api/callback", accessToken, callbackParamList, 3);
37
+    }
38
+
39
+    @Override
40
+    public ReturnT<String> registry(RegistryParam registryParam) {
41
+        return XxlJobRemotingUtil.postBody(addressUrl + "api/registry", accessToken, registryParam, 3);
42
+    }
43
+
44
+    @Override
45
+    public ReturnT<String> registryRemove(RegistryParam registryParam) {
46
+        return XxlJobRemotingUtil.postBody(addressUrl + "api/registryRemove", accessToken, registryParam, 3);
47
+    }
48
+}

+ 6 - 6
xxl-job-core/src/main/java/com/xxl/job/core/biz/model/TriggerParam.java Visa fil

@@ -16,7 +16,7 @@ public class TriggerParam implements Serializable{
16 16
     private int executorTimeout;
17 17
 
18 18
     private long logId;
19
-    private long logDateTim;
19
+    private long logDateTime;
20 20
 
21 21
     private String glueType;
22 22
     private String glueSource;
@@ -74,12 +74,12 @@ public class TriggerParam implements Serializable{
74 74
         this.logId = logId;
75 75
     }
76 76
 
77
-    public long getLogDateTim() {
78
-        return logDateTim;
77
+    public long getLogDateTime() {
78
+        return logDateTime;
79 79
     }
80 80
 
81
-    public void setLogDateTim(long logDateTim) {
82
-        this.logDateTim = logDateTim;
81
+    public void setLogDateTime(long logDateTime) {
82
+        this.logDateTime = logDateTime;
83 83
     }
84 84
 
85 85
     public String getGlueType() {
@@ -132,7 +132,7 @@ public class TriggerParam implements Serializable{
132 132
                 ", executorBlockStrategy='" + executorBlockStrategy + '\'' +
133 133
                 ", executorTimeout=" + executorTimeout +
134 134
                 ", logId=" + logId +
135
-                ", logDateTim=" + logDateTim +
135
+                ", logDateTime=" + logDateTime +
136 136
                 ", glueType='" + glueType + '\'' +
137 137
                 ", glueSource='" + glueSource + '\'' +
138 138
                 ", glueUpdatetime=" + glueUpdatetime +

+ 15 - 33
xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java Visa fil

@@ -2,6 +2,7 @@ package com.xxl.job.core.executor;
2 2
 
3 3
 import com.xxl.job.core.biz.AdminBiz;
4 4
 import com.xxl.job.core.biz.ExecutorBiz;
5
+import com.xxl.job.core.biz.client.AdminBizClient;
5 6
 import com.xxl.job.core.biz.impl.ExecutorBizImpl;
6 7
 import com.xxl.job.core.handler.IJobHandler;
7 8
 import com.xxl.job.core.log.XxlJobFileAppender;
@@ -10,13 +11,10 @@ import com.xxl.job.core.thread.JobLogFileCleanThread;
10 11
 import com.xxl.job.core.thread.JobThread;
11 12
 import com.xxl.job.core.thread.TriggerCallbackThread;
12 13
 import com.xxl.rpc.registry.ServiceRegistry;
13
-import com.xxl.rpc.remoting.invoker.XxlRpcInvokerFactory;
14
-import com.xxl.rpc.remoting.invoker.call.CallType;
15
-import com.xxl.rpc.remoting.invoker.reference.XxlRpcReferenceBean;
16
-import com.xxl.rpc.remoting.invoker.route.LoadBalance;
17
-import com.xxl.rpc.remoting.net.NetEnum;
14
+import com.xxl.rpc.remoting.net.impl.netty_http.server.NettyHttpServer;
18 15
 import com.xxl.rpc.remoting.provider.XxlRpcProviderFactory;
19 16
 import com.xxl.rpc.serialize.Serializer;
17
+import com.xxl.rpc.serialize.impl.HessianSerializer;
20 18
 import com.xxl.rpc.util.IpUtil;
21 19
 import com.xxl.rpc.util.NetUtil;
22 20
 import org.slf4j.Logger;
@@ -105,35 +103,18 @@ public class XxlJobExecutor  {
105 103
         // destory TriggerCallbackThread
106 104
         TriggerCallbackThread.getInstance().toStop();
107 105
 
108
-        // destory invoker
109
-        stopInvokerFactory();
110 106
     }
111 107
 
112 108
 
113 109
     // ---------------------- admin-client (rpc invoker) ----------------------
114 110
     private static List<AdminBiz> adminBizList;
115
-    private static Serializer serializer;
111
+    private static Serializer serializer = new HessianSerializer();
116 112
     private void initAdminBizList(String adminAddresses, String accessToken) throws Exception {
117
-        serializer = Serializer.SerializeEnum.HESSIAN.getSerializer();
118 113
         if (adminAddresses!=null && adminAddresses.trim().length()>0) {
119 114
             for (String address: adminAddresses.trim().split(",")) {
120 115
                 if (address!=null && address.trim().length()>0) {
121 116
 
122
-                    String addressUrl = address.concat(AdminBiz.MAPPING);
123
-
124
-                    AdminBiz adminBiz = (AdminBiz) new XxlRpcReferenceBean(
125
-                            NetEnum.NETTY_HTTP,
126
-                            serializer,
127
-                            CallType.SYNC,
128
-                            LoadBalance.ROUND,
129
-                            AdminBiz.class,
130
-                            null,
131
-                            3000,
132
-                            addressUrl,
133
-                            accessToken,
134
-                            null,
135
-                            null
136
-                    ).getObject();
117
+                    AdminBiz adminBiz = new AdminBizClient(address.trim(), accessToken);
137 118
 
138 119
                     if (adminBizList == null) {
139 120
                         adminBizList = new ArrayList<AdminBiz>();
@@ -143,14 +124,6 @@ public class XxlJobExecutor  {
143 124
             }
144 125
         }
145 126
     }
146
-    private void stopInvokerFactory(){
147
-        // stop invoker factory
148
-        try {
149
-            XxlRpcInvokerFactory.getInstance().stop();
150
-        } catch (Exception e) {
151
-            logger.error(e.getMessage(), e);
152
-        }
153
-    }
154 127
     public static List<AdminBiz> getAdminBizList(){
155 128
         return adminBizList;
156 129
     }
@@ -171,7 +144,16 @@ public class XxlJobExecutor  {
171 144
         serviceRegistryParam.put("address", address);
172 145
 
173 146
         xxlRpcProviderFactory = new XxlRpcProviderFactory();
174
-        xxlRpcProviderFactory.initConfig(NetEnum.NETTY_HTTP, Serializer.SerializeEnum.HESSIAN.getSerializer(), ip, port, accessToken, ExecutorServiceRegistry.class, serviceRegistryParam);
147
+
148
+        xxlRpcProviderFactory.setServer(NettyHttpServer.class);
149
+        xxlRpcProviderFactory.setSerializer(HessianSerializer.class);
150
+        xxlRpcProviderFactory.setCorePoolSize(20);
151
+        xxlRpcProviderFactory.setMaxPoolSize(200);
152
+        xxlRpcProviderFactory.setIp(ip);
153
+        xxlRpcProviderFactory.setPort(port);
154
+        xxlRpcProviderFactory.setAccessToken(accessToken);
155
+        xxlRpcProviderFactory.setServiceRegistry(ExecutorServiceRegistry.class);
156
+        xxlRpcProviderFactory.setServiceRegistryParam(serviceRegistryParam);
175 157
 
176 158
         // add services
177 159
         xxlRpcProviderFactory.addService(ExecutorBiz.class.getName(), null, new ExecutorBizImpl());

+ 4 - 4
xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java Visa fil

@@ -116,7 +116,7 @@ public class JobThread extends Thread{
116 116
 					triggerLogIdSet.remove(triggerParam.getLogId());
117 117
 
118 118
 					// log filename, like "logPath/yyyy-MM-dd/9999.log"
119
-					String logFileName = XxlJobFileAppender.makeLogFileName(new Date(triggerParam.getLogDateTim()), triggerParam.getLogId());
119
+					String logFileName = XxlJobFileAppender.makeLogFileName(new Date(triggerParam.getLogDateTime()), triggerParam.getLogId());
120 120
 					XxlJobFileAppender.contextHolder.set(logFileName);
121 121
 					ShardingUtil.setShardingVo(new ShardingUtil.ShardingVO(triggerParam.getBroadcastIndex(), triggerParam.getBroadcastTotal()));
122 122
 
@@ -186,11 +186,11 @@ public class JobThread extends Thread{
186 186
                     // callback handler info
187 187
                     if (!toStop) {
188 188
                         // commonm
189
-                        TriggerCallbackThread.pushCallBack(new HandleCallbackParam(triggerParam.getLogId(), triggerParam.getLogDateTim(), executeResult));
189
+                        TriggerCallbackThread.pushCallBack(new HandleCallbackParam(triggerParam.getLogId(), triggerParam.getLogDateTime(), executeResult));
190 190
                     } else {
191 191
                         // is killed
192 192
                         ReturnT<String> stopResult = new ReturnT<String>(ReturnT.FAIL_CODE, stopReason + " [job running,killed]");
193
-                        TriggerCallbackThread.pushCallBack(new HandleCallbackParam(triggerParam.getLogId(), triggerParam.getLogDateTim(), stopResult));
193
+                        TriggerCallbackThread.pushCallBack(new HandleCallbackParam(triggerParam.getLogId(), triggerParam.getLogDateTime(), stopResult));
194 194
                     }
195 195
                 }
196 196
             }
@@ -202,7 +202,7 @@ public class JobThread extends Thread{
202 202
 			if (triggerParam!=null) {
203 203
 				// is killed
204 204
 				ReturnT<String> stopResult = new ReturnT<String>(ReturnT.FAIL_CODE, stopReason + " [job not executed, in the job queue, killed.]");
205
-				TriggerCallbackThread.pushCallBack(new HandleCallbackParam(triggerParam.getLogId(), triggerParam.getLogDateTim(), stopResult));
205
+				TriggerCallbackThread.pushCallBack(new HandleCallbackParam(triggerParam.getLogId(), triggerParam.getLogDateTime(), stopResult));
206 206
 			}
207 207
 		}
208 208
 

+ 122 - 0
xxl-job-core/src/main/java/com/xxl/job/core/util/XxlJobRemotingUtil.java Visa fil

@@ -0,0 +1,122 @@
1
+package com.xxl.job.core.util;
2
+
3
+import com.xxl.job.core.biz.model.ReturnT;
4
+import com.xxl.registry.client.util.json.BasicJson;
5
+import org.slf4j.Logger;
6
+import org.slf4j.LoggerFactory;
7
+
8
+import java.io.BufferedReader;
9
+import java.io.DataOutputStream;
10
+import java.io.InputStreamReader;
11
+import java.net.HttpURLConnection;
12
+import java.net.URL;
13
+import java.util.Map;
14
+
15
+/**
16
+ * @author xuxueli 2018-11-25 00:55:31
17
+ */
18
+public class XxlJobRemotingUtil {
19
+    private static Logger logger = LoggerFactory.getLogger(XxlJobRemotingUtil.class);
20
+    public static String XXL_RPC_ACCESS_TOKEN = "XXL_RPC_ACCESS_TOKEN";
21
+
22
+    /**
23
+     * post
24
+     *
25
+     * @param url
26
+     * @param accessToken
27
+     * @param requestObj
28
+     * @return
29
+     */
30
+    public static ReturnT<String> postBody(String url, String accessToken, Object requestObj, int timeout) {
31
+        HttpURLConnection connection = null;
32
+        BufferedReader bufferedReader = null;
33
+        try {
34
+            // connection
35
+            URL realUrl = new URL(url);
36
+            connection = (HttpURLConnection) realUrl.openConnection();
37
+
38
+            // connection setting
39
+            connection.setRequestMethod("POST");
40
+            connection.setDoOutput(true);
41
+            connection.setDoInput(true);
42
+            connection.setUseCaches(false);
43
+            connection.setReadTimeout(timeout * 1000);
44
+            connection.setConnectTimeout(3 * 1000);
45
+            connection.setRequestProperty("connection", "Keep-Alive");
46
+            connection.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
47
+            connection.setRequestProperty("Accept-Charset", "application/json;charset=UTF-8");
48
+
49
+            if(accessToken!=null && accessToken.trim().length()>0){
50
+                connection.setRequestProperty(XXL_RPC_ACCESS_TOKEN, accessToken);
51
+            }
52
+
53
+            // do connection
54
+            connection.connect();
55
+
56
+            // write requestBody
57
+            String requestBody = BasicJson.toJson(requestObj);
58
+
59
+            DataOutputStream dataOutputStream = new DataOutputStream(connection.getOutputStream());
60
+            dataOutputStream.writeBytes(requestBody);
61
+            dataOutputStream.flush();
62
+            dataOutputStream.close();
63
+
64
+            /*byte[] requestBodyBytes = requestBody.getBytes("UTF-8");
65
+            connection.setRequestProperty("Content-Length", String.valueOf(requestBodyBytes.length));
66
+            OutputStream outwritestream = connection.getOutputStream();
67
+            outwritestream.write(requestBodyBytes);
68
+            outwritestream.flush();
69
+            outwritestream.close();*/
70
+
71
+            // valid StatusCode
72
+            int statusCode = connection.getResponseCode();
73
+            if (statusCode != 200) {
74
+                return new ReturnT<String>(ReturnT.FAIL_CODE, "xxl-rpc remoting fail, StatusCode("+ statusCode +") invalid. for url : " + url);
75
+            }
76
+
77
+            // result
78
+            bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
79
+            StringBuilder result = new StringBuilder();
80
+            String line;
81
+            while ((line = bufferedReader.readLine()) != null) {
82
+                result.append(line);
83
+            }
84
+            String resultJson = result.toString();
85
+
86
+            // parse returnT
87
+            try {
88
+                Map<String, Object> resultMap = BasicJson.parseMap(resultJson);
89
+
90
+                ReturnT<String> returnT = new ReturnT<String>();
91
+                if (resultMap==null) {
92
+                    returnT.setCode(ReturnT.FAIL_CODE);
93
+                    returnT.setMsg("AdminBizClient Remoting call fail.");
94
+                } else {
95
+                    returnT.setCode(Integer.valueOf(String.valueOf(resultMap.get("code"))));
96
+                    returnT.setMsg(String.valueOf(resultMap.get("msg")));
97
+                    returnT.setContent(String.valueOf(resultMap.get("content")));
98
+                }
99
+                return returnT;
100
+            } catch (Exception e) {
101
+                e.printStackTrace();
102
+                return new ReturnT<String>(ReturnT.FAIL_CODE, "xxl-rpc remoting response content invalid("+ resultJson +"), for url : " + url);
103
+            }
104
+
105
+        } catch (Exception e) {
106
+            logger.error(e.getMessage(), e);
107
+            return new ReturnT<String>(ReturnT.FAIL_CODE, "xxl-rpc remoting error("+ e.getMessage() +"), for url : " + url);
108
+        } finally {
109
+            try {
110
+                if (bufferedReader != null) {
111
+                    bufferedReader.close();
112
+                }
113
+                if (connection != null) {
114
+                    connection.disconnect();
115
+                }
116
+            } catch (Exception e2) {
117
+                logger.error(e2.getMessage(), e2);
118
+            }
119
+        }
120
+    }
121
+
122
+}

+ 17 - 15
xxl-job-core/src/test/java/com/xxl/job/core/biz/impl/ExecutorBizImplTest.java Visa fil

@@ -10,8 +10,8 @@ import com.xxl.job.core.glue.GlueTypeEnum;
10 10
 import com.xxl.rpc.remoting.invoker.call.CallType;
11 11
 import com.xxl.rpc.remoting.invoker.reference.XxlRpcReferenceBean;
12 12
 import com.xxl.rpc.remoting.invoker.route.LoadBalance;
13
-import com.xxl.rpc.remoting.net.NetEnum;
14
-import com.xxl.rpc.serialize.Serializer;
13
+import com.xxl.rpc.remoting.net.impl.netty_http.client.NettyHttpClient;
14
+import com.xxl.rpc.serialize.impl.HessianSerializer;
15 15
 import org.junit.After;
16 16
 import org.junit.Assert;
17 17
 import org.junit.Before;
@@ -44,18 +44,20 @@ public class ExecutorBizImplTest {
44 44
         TimeUnit.SECONDS.sleep(3);
45 45
 
46 46
         // init executor biz proxy
47
-        executorBiz = (ExecutorBiz) new XxlRpcReferenceBean(
48
-                NetEnum.NETTY_HTTP,
49
-                Serializer.SerializeEnum.HESSIAN.getSerializer(),
50
-                CallType.SYNC,
51
-                LoadBalance.ROUND,
52
-                ExecutorBiz.class,
53
-                null,
54
-                3000,
55
-                "127.0.0.1:9999",
56
-                null,
57
-                null,
58
-                null).getObject();
47
+        XxlRpcReferenceBean referenceBean = new XxlRpcReferenceBean();
48
+        referenceBean.setClient(NettyHttpClient.class);
49
+        referenceBean.setSerializer(HessianSerializer.class);
50
+        referenceBean.setCallType(CallType.SYNC);
51
+        referenceBean.setLoadBalance(LoadBalance.ROUND);
52
+        referenceBean.setIface(ExecutorBiz.class);
53
+        referenceBean.setVersion(null);
54
+        referenceBean.setTimeout(3000);
55
+        referenceBean.setAddress("127.0.0.1:9999");
56
+        referenceBean.setAccessToken(null);
57
+        referenceBean.setInvokeCallback(null);
58
+        referenceBean.setInvokerFactory(null);
59
+
60
+        executorBiz = (ExecutorBiz) referenceBean.getObject();
59 61
     }
60 62
 
61 63
     @After
@@ -131,7 +133,7 @@ public class ExecutorBizImplTest {
131 133
         triggerParam.setGlueSource(null);
132 134
         triggerParam.setGlueUpdatetime(System.currentTimeMillis());
133 135
         triggerParam.setLogId(1);
134
-        triggerParam.setLogDateTim(System.currentTimeMillis());
136
+        triggerParam.setLogDateTime(System.currentTimeMillis());
135 137
 
136 138
         // Act
137 139
         final ReturnT<String> retval = executorBiz.run(triggerParam);