Procházet zdrojové kódy

- 1、自研调度组件,移除quartz依赖:一方面是为了精简系统降低冗余依赖,另一方面是为了提供系统的可控度与稳定性;

xuxueli před 6 roky
rodič
revize
e01d2bc9b5
35 změnil soubory, kde provedl 2770 přidání a 1130 odebrání
  1. 1 1
      README.md
  2. 33 61
      doc/XXL-JOB官方文档.md
  3. 0 168
      doc/db/tables_mysql(备份,请忽略).sql
  4. 18 155
      doc/db/tables_xxl_job.sql
  5. 0 1
      pom.xml
  6. 0 7
      xxl-job-admin/pom.xml
  7. 2 2
      xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java
  8. 3 3
      xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java
  9. 7 0
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java
  10. 0 43
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobDynamicSchedulerConfig.java
  11. 147 0
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobScheduler.java
  12. 1668 0
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/cron/CronExpression.java
  13. 0 33
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/RemoteHttpJobBean.java
  14. 26 10
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java
  15. 32 0
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/old/RemoteHttpJobBean.java
  16. 413 0
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/old/XxlJobDynamicScheduler.java
  17. 58 0
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/old/XxlJobThreadPool.java
  18. 0 58
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/quartz/XxlJobThreadPool.java
  19. 2 2
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteBusyover.java
  20. 2 2
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFailover.java
  21. 0 413
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/schedule/XxlJobDynamicScheduler.java
  22. 218 0
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java
  23. 2 2
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java
  24. 6 1
      xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobInfoDao.java
  25. 6 6
      xxl-job-admin/src/main/java/com/xxl/job/admin/service/XxlJobService.java
  26. 38 67
      xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java
  27. 6 6
      xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobGroupMapper.xml
  28. 44 12
      xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml
  29. 5 5
      xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogGlueMapper.xml
  30. 13 13
      xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml
  31. 5 5
      xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobRegistryMapper.xml
  32. 6 6
      xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobUserMapper.xml
  33. 0 29
      xxl-job-admin/src/main/resources/quartz.properties
  34. 8 18
      xxl-job-admin/src/main/resources/static/js/jobinfo.index.1.js
  35. 1 1
      xxl-job-admin/src/main/resources/templates/jobinfo/jobinfo.index.ftl

+ 1 - 1
README.md Zobrazit soubor

@@ -52,7 +52,7 @@ XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是
52 52
 ## Features
53 53
 - 1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手;
54 54
 - 2、动态:支持动态修改任务状态、启动/停止任务,以及终止运行中任务,即时生效;
55
-- 3、调度中心HA(中心式):调度采用中心式设计,“调度中心”基于集群Quartz实现并支持集群部署,可保证调度中心HA;
55
+- 3、调度中心HA(中心式):调度采用中心式设计,“调度中心”自研调度组件并支持集群部署,可保证调度中心HA;
56 56
 - 4、执行器HA(分布式):任务分布式执行,任务"执行器"支持集群部署,可保证任务执行HA;
57 57
 - 5、注册中心: 执行器会周期性自动注册任务, 调度中心将会自动发现注册的任务并触发执行。同时,也支持手动录入执行器地址;
58 58
 - 6、弹性扩容缩容:一旦有新执行器机器上线或者下线,下次调度时将会重新分配任务;

+ 33 - 61
doc/XXL-JOB官方文档.md Zobrazit soubor

@@ -20,7 +20,7 @@ XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是
20 20
 ### 1.3 特性
21 21
 - 1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手;
22 22
 - 2、动态:支持动态修改任务状态、启动/停止任务,以及终止运行中任务,即时生效;
23
-- 3、调度中心HA(中心式):调度采用中心式设计,“调度中心”基于集群Quartz实现并支持集群部署,可保证调度中心HA;
23
+- 3、调度中心HA(中心式):调度采用中心式设计,“调度中心”自研调度组件并支持集群部署,可保证调度中心HA;
24 24
 - 4、执行器HA(分布式):任务分布式执行,任务"执行器"支持集群部署,可保证任务执行HA;
25 25
 - 5、注册中心: 执行器会周期性自动注册任务, 调度中心将会自动发现注册的任务并触发执行。同时,也支持手动录入执行器地址;
26 26
 - 6、弹性扩容缩容:一旦有新执行器机器上线或者下线,下次调度时将会重新分配任务;
@@ -776,18 +776,16 @@ try{
776 776
     - /xxl-job-executor-samples :执行器,Sample示例项目(大家可以在该项目上进行开发,也可以将现有项目改造生成执行器项目)
777 777
 
778 778
 ### 5.2 “调度数据库”配置
779
-XXL-JOB调度模块基于Quartz集群实现,其“调度数据库”是在Quartz的11张集群mysql表基础上扩展而成。
779
+XXL-JOB调度模块基于自研调度组件并支持集群部署,调度数据库表说明如下:
780 780
 
781
-XXL-JOB首先定制了Quartz原生表结构前缀(XXL_JOB_QRTZ_)。
781
+    - XXL_JOB_LOCK:任务调度锁表;
782
+    - XXL_JOB_GROUP:执行器信息表,维护任务执行器信息;
783
+    - XXL_JOB_INFO:调度扩展信息表: 用于保存XXL-JOB调度任务的扩展信息,如任务分组、任务名、机器地址、执行器、执行入参和报警邮件等等;
784
+    - XXL_JOB_LOG:调度日志表: 用于保存XXL-JOB任务调度的历史信息,如调度结果、执行结果、调度入参、调度机器和执行器等等;
785
+    - XXL_JOB_LOGGLUE:任务GLUE日志:用于保存GLUE更新历史,用于支持GLUE的版本回溯功能;
786
+    - XXL_JOB_REGISTRY:执行器注册表,维护在线的执行器和调度中心机器地址信息;
787
+    - XXL_JOB_USER:系统用户表;
782 788
 
783
-然后,在此基础上新增了几张张扩展表,如下:
784
-    - XXL_JOB_QRTZ_TRIGGER_GROUP:执行器信息表,维护任务执行器信息;
785
-    - XXL_JOB_QRTZ_TRIGGER_REGISTRY:执行器注册表,维护在线的执行器和调度中心机器地址信息;
786
-    - XXL_JOB_QRTZ_TRIGGER_INFO:调度扩展信息表: 用于保存XXL-JOB调度任务的扩展信息,如任务分组、任务名、机器地址、执行器、执行入参和报警邮件等等;
787
-    - XXL_JOB_QRTZ_TRIGGER_LOG:调度日志表: 用于保存XXL-JOB任务调度的历史信息,如调度结果、执行结果、调度入参、调度机器和执行器等等;
788
-    - XXL_JOB_QRTZ_TRIGGER_LOGGLUE:任务GLUE日志:用于保存GLUE更新历史,用于支持GLUE的版本回溯功能;
789
-
790
-因此,XXL-JOB调度数据库共计用于16张数据库表。
791 789
 
792 790
 ### 5.3 架构设计
793 791
 #### 5.3.1 设计思想
@@ -820,58 +818,30 @@ Quartz作为开源作业调度中的佼佼者,是作业调度的首选。但
820 818
 
821 819
 XXL-JOB弥补了quartz的上述不足之处。
822 820
 
823
-#### 5.4.2 RemoteHttpJobBean
824
-常规Quartz的开发,任务逻辑一般维护在QuartzJobBean中,耦合很严重。XXL-JOB中“调度模块”和“任务模块”完全解耦,调度模块中的所有调度任务使用同一个QuartzJobBean,即RemoteHttpJobBean。不同的调度任务将各自参数维护在各自扩展表数据中,当触发RemoteHttpJobBean执行时,将会解析不同的任务参数发起远程调用,调用各自的远程执行器服务。
821
+#### 5.4.2 自研调度模块
822
+XXL-JOB最终选择自研调度组件(早期调度组件基于Quartz);一方面是为了精简系统降低冗余依赖,另一方面是为了提供系统的可控度与稳定性;
825 823
 
826
-这种调用模型类似RPC调用,RemoteHttpJobBean提供调用代理的功能,而执行器提供远程服务的功能。
824
+XXL-JOB中“调度模块”和“任务模块”完全解耦,调度模块进行任务调度时,将会解析不同的任务参数发起远程调用,调用各自的远程执行器服务。这种调用模型类似RPC调用,调度中心提供调用代理的功能,而执行器提供远程服务的功能。
827 825
 
828 826
 #### 5.4.3 调度中心HA(集群)
829
-基于Quartz的集群方案,数据库选用Mysql;集群分布式并发环境中使用QUARTZ定时任务调度,会在各个节点会上报任务,存到数据库中,执行时会从数据库中取出触发器来执行,如果触发器的名称和执行时间相同,则只有一个节点去执行此任务。
830
-
831
-```
832
-# for cluster
833
-org.quartz.jobStore.tablePrefix = XXL_JOB_QRTZ_
834
-org.quartz.scheduler.instanceId: AUTO
835
-org.quartz.jobStore.class: org.quartz.impl.jdbcjobstore.JobStoreTX
836
-org.quartz.jobStore.isClustered: true
837
-org.quartz.jobStore.clusterCheckinInterval: 1000
838
-```
827
+基于数据库的集群方案,数据库选用Mysql;集群分布式并发环境中进行定时任务调度时,会在各个节点会上报任务,存到数据库中,执行时会从数据库中取出触发器来执行,如果触发器的名称和执行时间相同,则只有一个节点去执行此任务。
839 828
 
840 829
 #### 5.4.4 调度线程池
841 830
 调度采用线程池方式实现,避免单线程因阻塞而引起任务调度延迟。
842 831
 
843
-```
844
-org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
845
-org.quartz.threadPool.threadCount: 50
846
-org.quartz.threadPool.threadPriority: 5
847
-org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true
848
-```
849 832
 
850
-#### 5.4.5 @DisallowConcurrentExecution
851
-XXL-JOB调度模块的“调度中心”默认不使用该注解,即默认开启并行机制,因为RemoteHttpJobBean为公共QuartzJobBean,这样在多线程调度的情况下,调度模块被阻塞的几率很低,大大提高了调度系统的承载量。
833
+#### 5.4.5 并行调度
834
+XXL-JOB调度模块默认采用并行机制,在多线程调度的情况下,调度模块被阻塞的几率很低,大大提高了调度系统的承载量。
852 835
 
853 836
 XXL-JOB的每个调度任务虽然在调度模块是并行调度执行的,但是任务调度传递到任务模块的“执行器”确实串行执行的,同时支持任务终止。
854 837
 
855
-#### 5.4.6 misfire
856
-错过了触发时间,处理规则。
857
-可能原因:服务重启;调度线程被QuartzJobBean阻塞,线程被耗尽;某个任务启用了@DisallowConcurrentExecution,上次调度持续阻塞,下次调度被错过;
838
+#### 5.4.6 过期处理策略
839
+任务调度错过了触发时间:
840
+- 可能原因:服务重启;调度线程被阻塞,线程被耗尽;上次调度持续阻塞,下次调度被错过;
841
+- 处理策略:
842
+    - 过期5s内:立即触发一次,并计算下次触发时间;
843
+    - 过期超过5s:忽略过期触发,计算下次触发时间;
858 844
 
859
-quartz.properties中关于misfire的阀值配置如下,单位毫秒:
860
-```
861
-org.quartz.jobStore.misfireThreshold: 60000
862
-```
863
-
864
-Misfire规则:
865
-    withMisfireHandlingInstructionDoNothing:不触发立即执行,等待下次调度;
866
-    withMisfireHandlingInstructionIgnoreMisfires:以错过的第一个频率时间立刻开始执行;
867
-    withMisfireHandlingInstructionFireAndProceed:以当前时间为触发频率立刻触发一次执行;
868
-
869
-XXL-JOB默认misfire规则为:withMisfireHandlingInstructionDoNothing
870
-
871
-```
872
-CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(jobInfo.getJobCron()).withMisfireHandlingInstructionDoNothing();
873
-CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build();
874
-```
875 845
 
876 846
 #### 5.4.7 日志回调服务
877 847
 调度模块的“调度中心”作为Web服务部署时,一方面承担调度中心功能,另一方面也为执行器提供API服务。
@@ -926,7 +896,7 @@ xxl-job-admin#com.xxl.job.admin.controller.JobApiController.callback
926 896
 
927 897
 #### 5.4.11  全异步化 & 轻量级
928 898
 
929
-- 全异步化设计:XXL-JOB系统中业务逻辑在远程执行器执行,触发流程全异步化设计。相比直接在quartz的QuartzJobBean中执行业务逻辑,极大的降低了调度线程占用时间;
899
+- 全异步化设计:XXL-JOB系统中业务逻辑在远程执行器执行,触发流程全异步化设计。相比直接在调度中心内部执行业务逻辑,极大的降低了调度线程占用时间;
930 900
     - 异步调度:调度中心每次任务触发时仅发送一次调度请求,该调度请求首先推送“异步调度队列”,然后异步推送给远程执行器
931 901
     - 异步执行:执行器会将请求存入“异步执行队列”并且立即响应调度中心,异步运行。
932 902
 - 轻量级设计:XXL-JOB调度中心中每个JOB逻辑非常 “轻”,在全异步化的基础上,单个JOB一次运行平均耗时基本在 "10ms" 之内(基本为一次请求的网络开销);因此,可以保证使用有限的线程支撑大量的JOB并发运行;
@@ -988,7 +958,7 @@ XXL-JOB会为每次调度请求生成一个单独的日志文件,需要通过
988 958
 自v1.5版本之后, 任务取消了"任务执行机器"属性, 改为通过任务注册和自动发现的方式, 动态获取远程执行器地址并执行。
989 959
 
990 960
     AppName: 每个执行器机器集群的唯一标示, 任务注册以 "执行器" 为最小粒度进行注册; 每个任务通过其绑定的执行器可感知对应的执行器机器列表;
991
-    注册表: 见"XXL_JOB_QRTZ_TRIGGER_REGISTRY"表, "执行器" 在进行任务注册时将会周期性维护一条注册记录,即机器地址和AppName的绑定关系; "调度中心" 从而可以动态感知每个AppName在线的机器列表;
961
+    注册表: 见"XXL_JOB_REGISTRY"表, "执行器" 在进行任务注册时将会周期性维护一条注册记录,即机器地址和AppName的绑定关系; "调度中心" 从而可以动态感知每个AppName在线的机器列表;
992 962
     执行器注册: 任务注册Beat周期默认30s; 执行器以一倍Beat进行执行器注册, 调度中心以一倍Beat进行动态任务发现; 注册信息的失效时间被三倍Beat; 
993 963
     执行器注册摘除:执行器销毁时,将会主动上报调度中心并摘除对应的执行器机器信息,提高心跳注册的实时性;
994 964
     
@@ -1479,15 +1449,17 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段
1479 1449
 
1480 1450
 
1481 1451
 ### 6.25 版本 v2.1.0 Release Notes[规划中]
1482
-- 1、[规划中] 移除quartz:精简底层实现,优化已知问题
1452
+- 1、自研调度组件,移除quartz依赖:一方面是为了精简系统降低冗余依赖,另一方面是为了提供系统的可控度与稳定性
1483 1453
     - 触发:单节点周期性触发,运行事件如delayqueue;
1484
-    - 调度:集群竞争,负载方式协同处理,竞争-加入时间轮-释放-竞争;
1485
-- 2、用户管理:支持在线管理系统用户,存在管理员、普通用户两种角色;
1486
-- 3、权限管理:执行器维度进行权限控制,管理员拥有全量权限,普通用户需要分配执行器权限后才允许相关操作;
1487
-- 4、调度日志优化:支持设置日志保留天数,过期日志天维度记录报表,并清理;调度报表汇总实时数据和报表;
1488
-- 5、调度线程池参数调优;
1489
-- 6、升级xxl-rpc至较新版本,并清理冗余POM;
1490
-- 7、注册表索引优化,缓解锁表问题;
1454
+    - 调度:集群竞争,负载方式协同处理,锁竞争-更新触发信息-推送时间轮-锁释放-锁竞争;
1455
+- 2、底层表结构重构:移除11张quartz相关表,并对现有表结构优化梳理;
1456
+- 3、底层线程模型重构:移除Quartz线程池,降低系统线程与内存开销;
1457
+- 4、用户管理:支持在线管理系统用户,存在管理员、普通用户两种角色;
1458
+- 5、权限管理:执行器维度进行权限控制,管理员拥有全量权限,普通用户需要分配执行器权限后才允许相关操作;
1459
+- 6、调度日志优化:支持设置日志保留天数,过期日志天维度记录报表,并清理;调度报表汇总实时数据和报表;
1460
+- 7、调度线程池参数调优;
1461
+- 8、升级xxl-rpc至较新版本,并清理冗余POM;
1462
+- 9、注册表索引优化,缓解锁表问题;
1491 1463
 
1492 1464
 
1493 1465
 ### TODO LIST

+ 0 - 168
doc/db/tables_mysql(备份,请忽略).sql Zobrazit soubor

@@ -1,168 +0,0 @@
1
-#
2
-# Quartz seems to work best with the driver mm.mysql-2.0.7-bin.jar
3
-#
4
-# PLEASE consider using mysql with innodb tables to avoid locking issues
5
-#
6
-# In your Quartz properties file, you'll need to set
7
-# org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
8
-#
9
-
10
-DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS;
11
-DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS;
12
-DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE;
13
-DROP TABLE IF EXISTS QRTZ_LOCKS;
14
-DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS;
15
-DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS;
16
-DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS;
17
-DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS;
18
-DROP TABLE IF EXISTS QRTZ_TRIGGERS;
19
-DROP TABLE IF EXISTS QRTZ_JOB_DETAILS;
20
-DROP TABLE IF EXISTS QRTZ_CALENDARS;
21
-
22
-
23
-CREATE TABLE QRTZ_JOB_DETAILS
24
-  (
25
-    SCHED_NAME VARCHAR(120) NOT NULL,
26
-    JOB_NAME  VARCHAR(200) NOT NULL,
27
-    JOB_GROUP VARCHAR(200) NOT NULL,
28
-    DESCRIPTION VARCHAR(250) NULL,
29
-    JOB_CLASS_NAME   VARCHAR(250) NOT NULL,
30
-    IS_DURABLE VARCHAR(1) NOT NULL,
31
-    IS_NONCONCURRENT VARCHAR(1) NOT NULL,
32
-    IS_UPDATE_DATA VARCHAR(1) NOT NULL,
33
-    REQUESTS_RECOVERY VARCHAR(1) NOT NULL,
34
-    JOB_DATA BLOB NULL,
35
-    PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
36
-);
37
-
38
-CREATE TABLE QRTZ_TRIGGERS
39
-  (
40
-    SCHED_NAME VARCHAR(120) NOT NULL,
41
-    TRIGGER_NAME VARCHAR(200) NOT NULL,
42
-    TRIGGER_GROUP VARCHAR(200) NOT NULL,
43
-    JOB_NAME  VARCHAR(200) NOT NULL,
44
-    JOB_GROUP VARCHAR(200) NOT NULL,
45
-    DESCRIPTION VARCHAR(250) NULL,
46
-    NEXT_FIRE_TIME BIGINT(13) NULL,
47
-    PREV_FIRE_TIME BIGINT(13) NULL,
48
-    PRIORITY INTEGER NULL,
49
-    TRIGGER_STATE VARCHAR(16) NOT NULL,
50
-    TRIGGER_TYPE VARCHAR(8) NOT NULL,
51
-    START_TIME BIGINT(13) NOT NULL,
52
-    END_TIME BIGINT(13) NULL,
53
-    CALENDAR_NAME VARCHAR(200) NULL,
54
-    MISFIRE_INSTR SMALLINT(2) NULL,
55
-    JOB_DATA BLOB NULL,
56
-    PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
57
-    FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
58
-        REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP)
59
-);
60
-
61
-CREATE TABLE QRTZ_SIMPLE_TRIGGERS
62
-  (
63
-    SCHED_NAME VARCHAR(120) NOT NULL,
64
-    TRIGGER_NAME VARCHAR(200) NOT NULL,
65
-    TRIGGER_GROUP VARCHAR(200) NOT NULL,
66
-    REPEAT_COUNT BIGINT(7) NOT NULL,
67
-    REPEAT_INTERVAL BIGINT(12) NOT NULL,
68
-    TIMES_TRIGGERED BIGINT(10) NOT NULL,
69
-    PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
70
-    FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
71
-        REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
72
-);
73
-
74
-CREATE TABLE QRTZ_CRON_TRIGGERS
75
-  (
76
-    SCHED_NAME VARCHAR(120) NOT NULL,
77
-    TRIGGER_NAME VARCHAR(200) NOT NULL,
78
-    TRIGGER_GROUP VARCHAR(200) NOT NULL,
79
-    CRON_EXPRESSION VARCHAR(200) NOT NULL,
80
-    TIME_ZONE_ID VARCHAR(80),
81
-    PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
82
-    FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
83
-        REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
84
-);
85
-
86
-CREATE TABLE QRTZ_SIMPROP_TRIGGERS
87
-  (
88
-    SCHED_NAME VARCHAR(120) NOT NULL,
89
-    TRIGGER_NAME VARCHAR(200) NOT NULL,
90
-    TRIGGER_GROUP VARCHAR(200) NOT NULL,
91
-    STR_PROP_1 VARCHAR(512) NULL,
92
-    STR_PROP_2 VARCHAR(512) NULL,
93
-    STR_PROP_3 VARCHAR(512) NULL,
94
-    INT_PROP_1 INT NULL,
95
-    INT_PROP_2 INT NULL,
96
-    LONG_PROP_1 BIGINT NULL,
97
-    LONG_PROP_2 BIGINT NULL,
98
-    DEC_PROP_1 NUMERIC(13,4) NULL,
99
-    DEC_PROP_2 NUMERIC(13,4) NULL,
100
-    BOOL_PROP_1 VARCHAR(1) NULL,
101
-    BOOL_PROP_2 VARCHAR(1) NULL,
102
-    PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
103
-    FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
104
-    REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
105
-);
106
-
107
-CREATE TABLE QRTZ_BLOB_TRIGGERS
108
-  (
109
-    SCHED_NAME VARCHAR(120) NOT NULL,
110
-    TRIGGER_NAME VARCHAR(200) NOT NULL,
111
-    TRIGGER_GROUP VARCHAR(200) NOT NULL,
112
-    BLOB_DATA BLOB NULL,
113
-    PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
114
-    FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
115
-        REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
116
-);
117
-
118
-CREATE TABLE QRTZ_CALENDARS
119
-  (
120
-    SCHED_NAME VARCHAR(120) NOT NULL,
121
-    CALENDAR_NAME  VARCHAR(200) NOT NULL,
122
-    CALENDAR BLOB NOT NULL,
123
-    PRIMARY KEY (SCHED_NAME,CALENDAR_NAME)
124
-);
125
-
126
-CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS
127
-  (
128
-    SCHED_NAME VARCHAR(120) NOT NULL,
129
-    TRIGGER_GROUP  VARCHAR(200) NOT NULL,
130
-    PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP)
131
-);
132
-
133
-CREATE TABLE QRTZ_FIRED_TRIGGERS
134
-  (
135
-    SCHED_NAME VARCHAR(120) NOT NULL,
136
-    ENTRY_ID VARCHAR(95) NOT NULL,
137
-    TRIGGER_NAME VARCHAR(200) NOT NULL,
138
-    TRIGGER_GROUP VARCHAR(200) NOT NULL,
139
-    INSTANCE_NAME VARCHAR(200) NOT NULL,
140
-    FIRED_TIME BIGINT(13) NOT NULL,
141
-    SCHED_TIME BIGINT(13) NOT NULL,
142
-    PRIORITY INTEGER NOT NULL,
143
-    STATE VARCHAR(16) NOT NULL,
144
-    JOB_NAME VARCHAR(200) NULL,
145
-    JOB_GROUP VARCHAR(200) NULL,
146
-    IS_NONCONCURRENT VARCHAR(1) NULL,
147
-    REQUESTS_RECOVERY VARCHAR(1) NULL,
148
-    PRIMARY KEY (SCHED_NAME,ENTRY_ID)
149
-);
150
-
151
-CREATE TABLE QRTZ_SCHEDULER_STATE
152
-  (
153
-    SCHED_NAME VARCHAR(120) NOT NULL,
154
-    INSTANCE_NAME VARCHAR(200) NOT NULL,
155
-    LAST_CHECKIN_TIME BIGINT(13) NOT NULL,
156
-    CHECKIN_INTERVAL BIGINT(13) NOT NULL,
157
-    PRIMARY KEY (SCHED_NAME,INSTANCE_NAME)
158
-);
159
-
160
-CREATE TABLE QRTZ_LOCKS
161
-  (
162
-    SCHED_NAME VARCHAR(120) NOT NULL,
163
-    LOCK_NAME  VARCHAR(40) NOT NULL,
164
-    PRIMARY KEY (SCHED_NAME,LOCK_NAME)
165
-);
166
-
167
-
168
-commit;

+ 18 - 155
doc/db/tables_xxl_job.sql Zobrazit soubor

@@ -3,153 +3,7 @@ use `xxl-job`;
3 3
 
4 4
 
5 5
 
6
-CREATE TABLE XXL_JOB_QRTZ_JOB_DETAILS
7
-  (
8
-    SCHED_NAME VARCHAR(120) NOT NULL,
9
-    JOB_NAME  VARCHAR(200) NOT NULL,
10
-    JOB_GROUP VARCHAR(200) NOT NULL,
11
-    DESCRIPTION VARCHAR(250) NULL,
12
-    JOB_CLASS_NAME   VARCHAR(250) NOT NULL,
13
-    IS_DURABLE VARCHAR(1) NOT NULL,
14
-    IS_NONCONCURRENT VARCHAR(1) NOT NULL,
15
-    IS_UPDATE_DATA VARCHAR(1) NOT NULL,
16
-    REQUESTS_RECOVERY VARCHAR(1) NOT NULL,
17
-    JOB_DATA BLOB NULL,
18
-    PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
19
-);
20
-
21
-CREATE TABLE XXL_JOB_QRTZ_TRIGGERS
22
-  (
23
-    SCHED_NAME VARCHAR(120) NOT NULL,
24
-    TRIGGER_NAME VARCHAR(200) NOT NULL,
25
-    TRIGGER_GROUP VARCHAR(200) NOT NULL,
26
-    JOB_NAME  VARCHAR(200) NOT NULL,
27
-    JOB_GROUP VARCHAR(200) NOT NULL,
28
-    DESCRIPTION VARCHAR(250) NULL,
29
-    NEXT_FIRE_TIME BIGINT(13) NULL,
30
-    PREV_FIRE_TIME BIGINT(13) NULL,
31
-    PRIORITY INTEGER NULL,
32
-    TRIGGER_STATE VARCHAR(16) NOT NULL,
33
-    TRIGGER_TYPE VARCHAR(8) NOT NULL,
34
-    START_TIME BIGINT(13) NOT NULL,
35
-    END_TIME BIGINT(13) NULL,
36
-    CALENDAR_NAME VARCHAR(200) NULL,
37
-    MISFIRE_INSTR SMALLINT(2) NULL,
38
-    JOB_DATA BLOB NULL,
39
-    PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
40
-    FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
41
-        REFERENCES XXL_JOB_QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP)
42
-);
43
-
44
-CREATE TABLE XXL_JOB_QRTZ_SIMPLE_TRIGGERS
45
-  (
46
-    SCHED_NAME VARCHAR(120) NOT NULL,
47
-    TRIGGER_NAME VARCHAR(200) NOT NULL,
48
-    TRIGGER_GROUP VARCHAR(200) NOT NULL,
49
-    REPEAT_COUNT BIGINT(7) NOT NULL,
50
-    REPEAT_INTERVAL BIGINT(12) NOT NULL,
51
-    TIMES_TRIGGERED BIGINT(10) NOT NULL,
52
-    PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
53
-    FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
54
-        REFERENCES XXL_JOB_QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
55
-);
56
-
57
-CREATE TABLE XXL_JOB_QRTZ_CRON_TRIGGERS
58
-  (
59
-    SCHED_NAME VARCHAR(120) NOT NULL,
60
-    TRIGGER_NAME VARCHAR(200) NOT NULL,
61
-    TRIGGER_GROUP VARCHAR(200) NOT NULL,
62
-    CRON_EXPRESSION VARCHAR(200) NOT NULL,
63
-    TIME_ZONE_ID VARCHAR(80),
64
-    PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
65
-    FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
66
-        REFERENCES XXL_JOB_QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
67
-);
68
-
69
-CREATE TABLE XXL_JOB_QRTZ_SIMPROP_TRIGGERS
70
-  (          
71
-    SCHED_NAME VARCHAR(120) NOT NULL,
72
-    TRIGGER_NAME VARCHAR(200) NOT NULL,
73
-    TRIGGER_GROUP VARCHAR(200) NOT NULL,
74
-    STR_PROP_1 VARCHAR(512) NULL,
75
-    STR_PROP_2 VARCHAR(512) NULL,
76
-    STR_PROP_3 VARCHAR(512) NULL,
77
-    INT_PROP_1 INT NULL,
78
-    INT_PROP_2 INT NULL,
79
-    LONG_PROP_1 BIGINT NULL,
80
-    LONG_PROP_2 BIGINT NULL,
81
-    DEC_PROP_1 NUMERIC(13,4) NULL,
82
-    DEC_PROP_2 NUMERIC(13,4) NULL,
83
-    BOOL_PROP_1 VARCHAR(1) NULL,
84
-    BOOL_PROP_2 VARCHAR(1) NULL,
85
-    PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
86
-    FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) 
87
-    REFERENCES XXL_JOB_QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
88
-);
89
-
90
-CREATE TABLE XXL_JOB_QRTZ_BLOB_TRIGGERS
91
-  (
92
-    SCHED_NAME VARCHAR(120) NOT NULL,
93
-    TRIGGER_NAME VARCHAR(200) NOT NULL,
94
-    TRIGGER_GROUP VARCHAR(200) NOT NULL,
95
-    BLOB_DATA BLOB NULL,
96
-    PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
97
-    FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
98
-        REFERENCES XXL_JOB_QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
99
-);
100
-
101
-CREATE TABLE XXL_JOB_QRTZ_CALENDARS
102
-  (
103
-    SCHED_NAME VARCHAR(120) NOT NULL,
104
-    CALENDAR_NAME  VARCHAR(200) NOT NULL,
105
-    CALENDAR BLOB NOT NULL,
106
-    PRIMARY KEY (SCHED_NAME,CALENDAR_NAME)
107
-);
108
-
109
-CREATE TABLE XXL_JOB_QRTZ_PAUSED_TRIGGER_GRPS
110
-  (
111
-    SCHED_NAME VARCHAR(120) NOT NULL,
112
-    TRIGGER_GROUP  VARCHAR(200) NOT NULL, 
113
-    PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP)
114
-);
115
-
116
-CREATE TABLE XXL_JOB_QRTZ_FIRED_TRIGGERS
117
-  (
118
-    SCHED_NAME VARCHAR(120) NOT NULL,
119
-    ENTRY_ID VARCHAR(95) NOT NULL,
120
-    TRIGGER_NAME VARCHAR(200) NOT NULL,
121
-    TRIGGER_GROUP VARCHAR(200) NOT NULL,
122
-    INSTANCE_NAME VARCHAR(200) NOT NULL,
123
-    FIRED_TIME BIGINT(13) NOT NULL,
124
-    SCHED_TIME BIGINT(13) NOT NULL,
125
-    PRIORITY INTEGER NOT NULL,
126
-    STATE VARCHAR(16) NOT NULL,
127
-    JOB_NAME VARCHAR(200) NULL,
128
-    JOB_GROUP VARCHAR(200) NULL,
129
-    IS_NONCONCURRENT VARCHAR(1) NULL,
130
-    REQUESTS_RECOVERY VARCHAR(1) NULL,
131
-    PRIMARY KEY (SCHED_NAME,ENTRY_ID)
132
-);
133
-
134
-CREATE TABLE XXL_JOB_QRTZ_SCHEDULER_STATE
135
-  (
136
-    SCHED_NAME VARCHAR(120) NOT NULL,
137
-    INSTANCE_NAME VARCHAR(200) NOT NULL,
138
-    LAST_CHECKIN_TIME BIGINT(13) NOT NULL,
139
-    CHECKIN_INTERVAL BIGINT(13) NOT NULL,
140
-    PRIMARY KEY (SCHED_NAME,INSTANCE_NAME)
141
-);
142
-
143
-CREATE TABLE XXL_JOB_QRTZ_LOCKS
144
-  (
145
-    SCHED_NAME VARCHAR(120) NOT NULL,
146
-    LOCK_NAME  VARCHAR(40) NOT NULL, 
147
-    PRIMARY KEY (SCHED_NAME,LOCK_NAME)
148
-);
149
-
150
-
151
-
152
-CREATE TABLE `XXL_JOB_QRTZ_TRIGGER_INFO` (
6
+CREATE TABLE `XXL_JOB_INFO` (
153 7
   `id` int(11) NOT NULL AUTO_INCREMENT,
154 8
   `job_group` int(11) NOT NULL COMMENT '执行器主键ID',
155 9
   `job_cron` varchar(128) NOT NULL COMMENT '任务执行CRON',
@@ -169,10 +23,13 @@ CREATE TABLE `XXL_JOB_QRTZ_TRIGGER_INFO` (
169 23
   `glue_remark` varchar(128) DEFAULT NULL COMMENT 'GLUE备注',
170 24
   `glue_updatetime` datetime DEFAULT NULL COMMENT 'GLUE更新时间',
171 25
   `child_jobid` varchar(255) DEFAULT NULL COMMENT '子任务ID,多个逗号分隔',
26
+  `trigger_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '调度状态:0-停止,1-运行',
27
+  `trigger_last_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '上次调度时间',
28
+  `trigger_next_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '下次调度时间',
172 29
   PRIMARY KEY (`id`)
173 30
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
174 31
 
175
-CREATE TABLE `XXL_JOB_QRTZ_TRIGGER_LOG` (
32
+CREATE TABLE `XXL_JOB_LOG` (
176 33
   `id` int(11) NOT NULL AUTO_INCREMENT,
177 34
   `job_group` int(11) NOT NULL COMMENT '执行器主键ID',
178 35
   `job_id` int(11) NOT NULL COMMENT '任务,主键ID',
@@ -193,7 +50,7 @@ CREATE TABLE `XXL_JOB_QRTZ_TRIGGER_LOG` (
193 50
   KEY `I_handle_code` (`handle_code`)
194 51
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
195 52
 
196
-CREATE TABLE `XXL_JOB_QRTZ_TRIGGER_LOGGLUE` (
53
+CREATE TABLE `XXL_JOB_LOGGLUE` (
197 54
   `id` int(11) NOT NULL AUTO_INCREMENT,
198 55
   `job_id` int(11) NOT NULL COMMENT '任务,主键ID',
199 56
   `glue_type` varchar(50) DEFAULT NULL COMMENT 'GLUE类型',
@@ -204,7 +61,7 @@ CREATE TABLE `XXL_JOB_QRTZ_TRIGGER_LOGGLUE` (
204 61
   PRIMARY KEY (`id`)
205 62
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
206 63
 
207
-CREATE TABLE `XXL_JOB_QRTZ_TRIGGER_REGISTRY` (
64
+CREATE TABLE `XXL_JOB_REGISTRY` (
208 65
   `id` int(11) NOT NULL AUTO_INCREMENT,
209 66
   `registry_group` varchar(255) NOT NULL,
210 67
   `registry_key` varchar(255) NOT NULL,
@@ -214,7 +71,7 @@ CREATE TABLE `XXL_JOB_QRTZ_TRIGGER_REGISTRY` (
214 71
   KEY `i_g_k_v` (`registry_group`,`registry_key`,`registry_value`)
215 72
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
216 73
 
217
-CREATE TABLE `XXL_JOB_QRTZ_TRIGGER_GROUP` (
74
+CREATE TABLE `XXL_JOB_GROUP` (
218 75
   `id` int(11) NOT NULL AUTO_INCREMENT,
219 76
   `app_name` varchar(64) NOT NULL COMMENT '执行器AppName',
220 77
   `title` varchar(12) NOT NULL COMMENT '执行器名称',
@@ -224,7 +81,7 @@ CREATE TABLE `XXL_JOB_QRTZ_TRIGGER_GROUP` (
224 81
   PRIMARY KEY (`id`)
225 82
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
226 83
 
227
-CREATE TABLE `XXL_JOB_QRTZ_USER` (
84
+CREATE TABLE `XXL_JOB_USER` (
228 85
   `id` int(11) NOT NULL AUTO_INCREMENT,
229 86
   `username` varchar(50) NOT NULL COMMENT '账号',
230 87
   `password` varchar(50) NOT NULL COMMENT '密码',
@@ -234,10 +91,16 @@ CREATE TABLE `XXL_JOB_QRTZ_USER` (
234 91
   UNIQUE KEY `i_username` (`username`) USING BTREE
235 92
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
236 93
 
94
+CREATE TABLE `XXL_JOB_LOCK` (
95
+  `lock_name` varchar(50) NOT NULL COMMENT '锁名称',
96
+  PRIMARY KEY (`lock_name`)
97
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
98
+
237 99
 
238
-INSERT INTO `XXL_JOB_QRTZ_TRIGGER_GROUP`(`id`, `app_name`, `title`, `order`, `address_type`, `address_list`) VALUES (1, 'xxl-job-executor-sample', '示例执行器', 1, 0, NULL);
239
-INSERT INTO `XXL_JOB_QRTZ_TRIGGER_INFO`(`id`, `job_group`, `job_cron`, `job_desc`, `add_time`, `update_time`, `author`, `alarm_email`, `executor_route_strategy`, `executor_handler`, `executor_param`, `executor_block_strategy`, `executor_timeout`, `executor_fail_retry_count`, `glue_type`, `glue_source`, `glue_remark`, `glue_updatetime`, `child_jobid`) VALUES (1, 1, '0 0 0 * * ? *', '测试任务1', '2018-11-03 22:21:31', '2018-11-03 22:21:31', 'XXL', '', 'FIRST', 'demoJobHandler', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', '', 'GLUE代码初始化', '2018-11-03 22:21:31', '');
240
-INSERT INTO `XXL_JOB_QRTZ_USER`(`id`, `username`, `password`, `role`, `permission`) VALUES (1, 'admin', 'e10adc3949ba59abbe56e057f20f883e', 1, NULL);
100
+INSERT INTO `XXL_JOB_GROUP`(`id`, `app_name`, `title`, `order`, `address_type`, `address_list`) VALUES (1, 'xxl-job-executor-sample', '示例执行器', 1, 0, NULL);
101
+INSERT INTO `XXL_JOB_INFO`(`id`, `job_group`, `job_cron`, `job_desc`, `add_time`, `update_time`, `author`, `alarm_email`, `executor_route_strategy`, `executor_handler`, `executor_param`, `executor_block_strategy`, `executor_timeout`, `executor_fail_retry_count`, `glue_type`, `glue_source`, `glue_remark`, `glue_updatetime`, `child_jobid`) VALUES (1, 1, '0 0 0 * * ? *', '测试任务1', '2018-11-03 22:21:31', '2018-11-03 22:21:31', 'XXL', '', 'FIRST', 'demoJobHandler', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', '', 'GLUE代码初始化', '2018-11-03 22:21:31', '');
102
+INSERT INTO `XXL_JOB_USER`(`id`, `username`, `password`, `role`, `permission`) VALUES (1, 'admin', 'e10adc3949ba59abbe56e057f20f883e', 1, NULL);
103
+INSERT INTO `XXL_JOB_LOCK` ( `lock_name`) VALUES ( 'schedule_lock');
241 104
 
242 105
 commit;
243 106
 

+ 0 - 1
pom.xml Zobrazit soubor

@@ -37,7 +37,6 @@
37 37
 		<commons-exec.version>1.3</commons-exec.version>
38 38
 
39 39
 		<groovy.version>2.5.6</groovy.version>
40
-		<quartz.version>2.3.1</quartz.version>
41 40
 
42 41
 		<maven-source-plugin.version>3.0.1</maven-source-plugin.version>
43 42
 		<maven-javadoc-plugin.version>3.1.0</maven-javadoc-plugin.version>

+ 0 - 7
xxl-job-admin/pom.xml Zobrazit soubor

@@ -60,13 +60,6 @@
60 60
 			<version>${mysql-connector-java.version}</version>
61 61
 		</dependency>
62 62
 
63
-		<!-- quartz :quartz-2.2.3/c3p0-0.9.1.1/slf4j-api-1.6.6 -->
64
-		<dependency>
65
-			<groupId>org.quartz-scheduler</groupId>
66
-			<artifactId>quartz</artifactId>
67
-			<version>${quartz.version}</version>
68
-		</dependency>
69
-
70 63
 		<!-- xxl-job-core -->
71 64
 		<dependency>
72 65
 			<groupId>com.xuxueli</groupId>

+ 2 - 2
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java Zobrazit soubor

@@ -1,7 +1,7 @@
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.schedule.XxlJobDynamicScheduler;
4
+import com.xxl.job.admin.core.conf.XxlJobScheduler;
5 5
 import com.xxl.job.core.biz.AdminBiz;
6 6
 import org.springframework.beans.factory.InitializingBean;
7 7
 import org.springframework.stereotype.Controller;
@@ -27,7 +27,7 @@ public class JobApiController implements InitializingBean {
27 27
     @RequestMapping(AdminBiz.MAPPING)
28 28
     @PermissionLimit(limit=false)
29 29
     public void api(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
30
-        XxlJobDynamicScheduler.invokeAdminService(request, response);
30
+        XxlJobScheduler.invokeAdminService(request, response);
31 31
     }
32 32
 
33 33
 

+ 3 - 3
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java Zobrazit soubor

@@ -1,10 +1,10 @@
1 1
 package com.xxl.job.admin.controller;
2 2
 
3
+import com.xxl.job.admin.core.conf.XxlJobScheduler;
3 4
 import com.xxl.job.admin.core.exception.XxlJobException;
4 5
 import com.xxl.job.admin.core.model.XxlJobGroup;
5 6
 import com.xxl.job.admin.core.model.XxlJobInfo;
6 7
 import com.xxl.job.admin.core.model.XxlJobLog;
7
-import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
8 8
 import com.xxl.job.admin.core.util.I18nUtil;
9 9
 import com.xxl.job.admin.dao.XxlJobGroupDao;
10 10
 import com.xxl.job.admin.dao.XxlJobInfoDao;
@@ -136,7 +136,7 @@ public class JobLogController {
136 136
 	@ResponseBody
137 137
 	public ReturnT<LogResult> logDetailCat(String executorAddress, long triggerTime, int logId, int fromLineNum){
138 138
 		try {
139
-			ExecutorBiz executorBiz = XxlJobDynamicScheduler.getExecutorBiz(executorAddress);
139
+			ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(executorAddress);
140 140
 			ReturnT<LogResult> logResult = executorBiz.log(triggerTime, logId, fromLineNum);
141 141
 
142 142
 			// is end
@@ -170,7 +170,7 @@ public class JobLogController {
170 170
 		// request of kill
171 171
 		ReturnT<String> runResult = null;
172 172
 		try {
173
-			ExecutorBiz executorBiz = XxlJobDynamicScheduler.getExecutorBiz(log.getExecutorAddress());
173
+			ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(log.getExecutorAddress());
174 174
 			runResult = executorBiz.kill(jobInfo.getId());
175 175
 		} catch (Exception e) {
176 176
 			logger.error(e.getMessage(), e);

+ 7 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java Zobrazit soubor

@@ -11,6 +11,7 @@ import org.springframework.context.annotation.Configuration;
11 11
 import org.springframework.mail.javamail.JavaMailSender;
12 12
 
13 13
 import javax.annotation.Resource;
14
+import javax.sql.DataSource;
14 15
 
15 16
 /**
16 17
  * xxl-job config
@@ -53,6 +54,8 @@ public class XxlJobAdminConfig implements InitializingBean{
53 54
     private AdminBiz adminBiz;
54 55
     @Resource
55 56
     private JavaMailSender mailSender;
57
+    @Resource
58
+    private DataSource dataSource;
56 59
 
57 60
 
58 61
     public String getI18n() {
@@ -91,4 +94,8 @@ public class XxlJobAdminConfig implements InitializingBean{
91 94
         return mailSender;
92 95
     }
93 96
 
97
+    public DataSource getDataSource() {
98
+        return dataSource;
99
+    }
100
+
94 101
 }

+ 0 - 43
xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobDynamicSchedulerConfig.java Zobrazit soubor

@@ -1,43 +0,0 @@
1
-package com.xxl.job.admin.core.conf;
2
-
3
-import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
4
-import org.quartz.Scheduler;
5
-import org.springframework.context.annotation.Bean;
6
-import org.springframework.context.annotation.Configuration;
7
-import org.springframework.core.io.ClassPathResource;
8
-import org.springframework.scheduling.quartz.SchedulerFactoryBean;
9
-
10
-import javax.sql.DataSource;
11
-
12
-/**
13
- * @author xuxueli 2018-10-28 00:18:17
14
- */
15
-@Configuration
16
-public class XxlJobDynamicSchedulerConfig {
17
-
18
-    @Bean
19
-    public SchedulerFactoryBean getSchedulerFactoryBean(DataSource dataSource){
20
-
21
-        SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean();
22
-        schedulerFactory.setDataSource(dataSource);
23
-        schedulerFactory.setAutoStartup(true);                  // 自动启动
24
-        schedulerFactory.setStartupDelay(20);                   // 延时启动,应用启动成功后在启动
25
-        schedulerFactory.setOverwriteExistingJobs(true);        // 覆盖DB中JOB:true、以数据库中已经存在的为准:false
26
-        schedulerFactory.setApplicationContextSchedulerContextKey("applicationContext");
27
-        schedulerFactory.setConfigLocation(new ClassPathResource("quartz.properties"));
28
-
29
-        return schedulerFactory;
30
-    }
31
-
32
-    @Bean(initMethod = "start", destroyMethod = "destroy")
33
-    public XxlJobDynamicScheduler getXxlJobDynamicScheduler(SchedulerFactoryBean schedulerFactory){
34
-
35
-        Scheduler scheduler = schedulerFactory.getScheduler();
36
-
37
-        XxlJobDynamicScheduler xxlJobDynamicScheduler = new XxlJobDynamicScheduler();
38
-        xxlJobDynamicScheduler.setScheduler(scheduler);
39
-
40
-        return xxlJobDynamicScheduler;
41
-    }
42
-
43
-}

+ 147 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobScheduler.java Zobrazit soubor

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

Diff nebyl zobrazen, protože je příliš veliký
+ 1668 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/core/cron/CronExpression.java


+ 0 - 33
xxl-job-admin/src/main/java/com/xxl/job/admin/core/jobbean/RemoteHttpJobBean.java Zobrazit soubor

@@ -1,33 +0,0 @@
1
-package com.xxl.job.admin.core.jobbean;
2
-
3
-import com.xxl.job.admin.core.thread.JobTriggerPoolHelper;
4
-import com.xxl.job.admin.core.trigger.TriggerTypeEnum;
5
-import org.quartz.JobExecutionContext;
6
-import org.quartz.JobExecutionException;
7
-import org.quartz.JobKey;
8
-import org.slf4j.Logger;
9
-import org.slf4j.LoggerFactory;
10
-import org.springframework.scheduling.quartz.QuartzJobBean;
11
-
12
-/**
13
- * http job bean
14
- * “@DisallowConcurrentExecution” diable concurrent, thread size can not be only one, better given more
15
- * @author xuxueli 2015-12-17 18:20:34
16
- */
17
-//@DisallowConcurrentExecution
18
-public class RemoteHttpJobBean extends QuartzJobBean {
19
-	private static Logger logger = LoggerFactory.getLogger(RemoteHttpJobBean.class);
20
-
21
-	@Override
22
-	protected void executeInternal(JobExecutionContext context)
23
-			throws JobExecutionException {
24
-
25
-		// load jobId
26
-		JobKey jobKey = context.getTrigger().getJobKey();
27
-		Integer jobId = Integer.valueOf(jobKey.getName());
28
-
29
-		// trigger
30
-		JobTriggerPoolHelper.trigger(jobId, TriggerTypeEnum.CRON, -1, null, null);
31
-	}
32
-
33
-}

+ 26 - 10
xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java Zobrazit soubor

@@ -9,10 +9,10 @@ import java.util.Date;
9 9
  */
10 10
 public class XxlJobInfo {
11 11
 	
12
-	private int id;				// 主键ID	    (JobKey.name)
12
+	private int id;				// 主键ID
13 13
 	
14
-	private int jobGroup;		// 执行器主键ID	(JobKey.group)
15
-	private String jobCron;		// 任务执行CRON表达式 【base on quartz】
14
+	private int jobGroup;		// 执行器主键ID
15
+	private String jobCron;		// 任务执行CRON表达式
16 16
 	private String jobDesc;
17 17
 	
18 18
 	private Date addTime;
@@ -34,9 +34,10 @@ public class XxlJobInfo {
34 34
 	private Date glueUpdatetime;	// GLUE更新时间
35 35
 
36 36
 	private String childJobId;		// 子任务ID,多个逗号分隔
37
-	
38
-	// copy from quartz
39
-	private String jobStatus;		// 任务状态 【base on quartz】
37
+
38
+	private int triggerStatus;		// 调度状态:0-停止,1-运行
39
+	private long triggerLastTime;	// 上次调度时间
40
+	private long triggerNextTime;	// 下次调度时间
40 41
 
41 42
 
42 43
 	public int getId() {
@@ -191,12 +192,27 @@ public class XxlJobInfo {
191 192
 		this.childJobId = childJobId;
192 193
 	}
193 194
 
194
-	public String getJobStatus() {
195
-		return jobStatus;
195
+	public int getTriggerStatus() {
196
+		return triggerStatus;
196 197
 	}
197 198
 
198
-	public void setJobStatus(String jobStatus) {
199
-		this.jobStatus = jobStatus;
199
+	public void setTriggerStatus(int triggerStatus) {
200
+		this.triggerStatus = triggerStatus;
200 201
 	}
201 202
 
203
+	public long getTriggerLastTime() {
204
+		return triggerLastTime;
205
+	}
206
+
207
+	public void setTriggerLastTime(long triggerLastTime) {
208
+		this.triggerLastTime = triggerLastTime;
209
+	}
210
+
211
+	public long getTriggerNextTime() {
212
+		return triggerNextTime;
213
+	}
214
+
215
+	public void setTriggerNextTime(long triggerNextTime) {
216
+		this.triggerNextTime = triggerNextTime;
217
+	}
202 218
 }

+ 32 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/core/old/RemoteHttpJobBean.java Zobrazit soubor

@@ -0,0 +1,32 @@
1
+//package com.xxl.job.admin.core.jobbean;
2
+//
3
+//import com.xxl.job.admin.core.thread.JobTriggerPoolHelper;
4
+//import com.xxl.job.admin.core.trigger.TriggerTypeEnum;
5
+//import org.quartz.JobExecutionContext;
6
+//import org.quartz.JobExecutionException;
7
+//import org.quartz.JobKey;
8
+//import org.slf4j.Logger;
9
+//import org.slf4j.LoggerFactory;
10
+//import org.springframework.scheduling.quartz.QuartzJobBean;
11
+//
12
+///**
13
+// * http job bean
14
+// * “@DisallowConcurrentExecution” diable concurrent, thread size can not be only one, better given more
15
+// * @author xuxueli 2015-12-17 18:20:34
16
+// */
17
+////@DisallowConcurrentExecution
18
+//public class RemoteHttpJobBean extends QuartzJobBean {
19
+//	private static Logger logger = LoggerFactory.getLogger(RemoteHttpJobBean.class);
20
+//
21
+//	@Override
22
+//	protected void executeInternal(JobExecutionContext context)
23
+//			throws JobExecutionException {
24
+//
25
+//		// load jobId
26
+//		JobKey jobKey = context.getTrigger().getJobKey();
27
+//		Integer jobId = Integer.valueOf(jobKey.getName());
28
+//
29
+//
30
+//	}
31
+//
32
+//}

+ 413 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/core/old/XxlJobDynamicScheduler.java Zobrazit soubor

@@ -0,0 +1,413 @@
1
+//package com.xxl.job.admin.core.schedule;
2
+//
3
+//import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
4
+//import com.xxl.job.admin.core.jobbean.RemoteHttpJobBean;
5
+//import com.xxl.job.admin.core.model.XxlJobInfo;
6
+//import com.xxl.job.admin.core.thread.JobFailMonitorHelper;
7
+//import com.xxl.job.admin.core.thread.JobRegistryMonitorHelper;
8
+//import com.xxl.job.admin.core.thread.JobTriggerPoolHelper;
9
+//import com.xxl.job.admin.core.util.I18nUtil;
10
+//import com.xxl.job.core.biz.AdminBiz;
11
+//import com.xxl.job.core.biz.ExecutorBiz;
12
+//import com.xxl.job.core.enums.ExecutorBlockStrategyEnum;
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;
18
+//import com.xxl.rpc.remoting.net.impl.servlet.server.ServletServerHandler;
19
+//import com.xxl.rpc.remoting.provider.XxlRpcProviderFactory;
20
+//import com.xxl.rpc.serialize.Serializer;
21
+//import org.quartz.*;
22
+//import org.quartz.Trigger.TriggerState;
23
+//import org.quartz.impl.triggers.CronTriggerImpl;
24
+//import org.slf4j.Logger;
25
+//import org.slf4j.LoggerFactory;
26
+//import org.springframework.util.Assert;
27
+//
28
+//import javax.servlet.ServletException;
29
+//import javax.servlet.http.HttpServletRequest;
30
+//import javax.servlet.http.HttpServletResponse;
31
+//import java.io.IOException;
32
+//import java.util.Date;
33
+//import java.util.concurrent.ConcurrentHashMap;
34
+//
35
+///**
36
+// * base quartz scheduler util
37
+// * @author xuxueli 2015-12-19 16:13:53
38
+// */
39
+//public final class XxlJobDynamicScheduler {
40
+//    private static final Logger logger = LoggerFactory.getLogger(XxlJobDynamicScheduler_old.class);
41
+//
42
+//    // ---------------------- param ----------------------
43
+//
44
+//    // scheduler
45
+//    private static Scheduler scheduler;
46
+//    public void setScheduler(Scheduler scheduler) {
47
+//		XxlJobDynamicScheduler_old.scheduler = scheduler;
48
+//	}
49
+//
50
+//
51
+//    // ---------------------- init + destroy ----------------------
52
+//    public void start() throws Exception {
53
+//        // valid
54
+//        Assert.notNull(scheduler, "quartz scheduler is null");
55
+//
56
+//        // init i18n
57
+//        initI18n();
58
+//
59
+//        // admin registry monitor run
60
+//        JobRegistryMonitorHelper.getInstance().start();
61
+//
62
+//        // admin monitor run
63
+//        JobFailMonitorHelper.getInstance().start();
64
+//
65
+//        // admin-server
66
+//        initRpcProvider();
67
+//
68
+//        logger.info(">>>>>>>>> init xxl-job admin success.");
69
+//    }
70
+//
71
+//
72
+//    public void destroy() throws Exception {
73
+//        // admin trigger pool stop
74
+//        JobTriggerPoolHelper.toStop();
75
+//
76
+//        // admin registry stop
77
+//        JobRegistryMonitorHelper.getInstance().toStop();
78
+//
79
+//        // admin monitor stop
80
+//        JobFailMonitorHelper.getInstance().toStop();
81
+//
82
+//        // admin-server
83
+//        stopRpcProvider();
84
+//    }
85
+//
86
+//
87
+//    // ---------------------- I18n ----------------------
88
+//
89
+//    private void initI18n(){
90
+//        for (ExecutorBlockStrategyEnum item:ExecutorBlockStrategyEnum.values()) {
91
+//            item.setTitle(I18nUtil.getString("jobconf_block_".concat(item.name())));
92
+//        }
93
+//    }
94
+//
95
+//
96
+//    // ---------------------- admin rpc provider (no server version) ----------------------
97
+//    private static ServletServerHandler servletServerHandler;
98
+//    private void initRpcProvider(){
99
+//        // init
100
+//        XxlRpcProviderFactory xxlRpcProviderFactory = new XxlRpcProviderFactory();
101
+//        xxlRpcProviderFactory.initConfig(
102
+//                NetEnum.NETTY_HTTP,
103
+//                Serializer.SerializeEnum.HESSIAN.getSerializer(),
104
+//                null,
105
+//                0,
106
+//                XxlJobAdminConfig.getAdminConfig().getAccessToken(),
107
+//                null,
108
+//                null);
109
+//
110
+//        // add services
111
+//        xxlRpcProviderFactory.addService(AdminBiz.class.getName(), null, XxlJobAdminConfig.getAdminConfig().getAdminBiz());
112
+//
113
+//        // servlet handler
114
+//        servletServerHandler = new ServletServerHandler(xxlRpcProviderFactory);
115
+//    }
116
+//    private void stopRpcProvider() throws Exception {
117
+//        XxlRpcInvokerFactory.getInstance().stop();
118
+//    }
119
+//    public static void invokeAdminService(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
120
+//        servletServerHandler.handle(null, request, response);
121
+//    }
122
+//
123
+//
124
+//    // ---------------------- executor-client ----------------------
125
+//    private static ConcurrentHashMap<String, ExecutorBiz> executorBizRepository = new ConcurrentHashMap<String, ExecutorBiz>();
126
+//    public static ExecutorBiz getExecutorBiz(String address) throws Exception {
127
+//        // valid
128
+//        if (address==null || address.trim().length()==0) {
129
+//            return null;
130
+//        }
131
+//
132
+//        // load-cache
133
+//        address = address.trim();
134
+//        ExecutorBiz executorBiz = executorBizRepository.get(address);
135
+//        if (executorBiz != null) {
136
+//            return executorBiz;
137
+//        }
138
+//
139
+//        // set-cache
140
+//        executorBiz = (ExecutorBiz) new XxlRpcReferenceBean(
141
+//                NetEnum.NETTY_HTTP,
142
+//                Serializer.SerializeEnum.HESSIAN.getSerializer(),
143
+//                CallType.SYNC,
144
+//                LoadBalance.ROUND,
145
+//                ExecutorBiz.class,
146
+//                null,
147
+//                5000,
148
+//                address,
149
+//                XxlJobAdminConfig.getAdminConfig().getAccessToken(),
150
+//                null,
151
+//                null).getObject();
152
+//
153
+//        executorBizRepository.put(address, executorBiz);
154
+//        return executorBiz;
155
+//    }
156
+//
157
+//
158
+//    // ---------------------- schedule util ----------------------
159
+//
160
+//    /**
161
+//     * fill job info
162
+//     *
163
+//     * @param jobInfo
164
+//     */
165
+//	public static void fillJobInfo(XxlJobInfo jobInfo) {
166
+//
167
+//        String name = String.valueOf(jobInfo.getId());
168
+//
169
+//        // trigger key
170
+//        TriggerKey triggerKey = TriggerKey.triggerKey(name);
171
+//        try {
172
+//
173
+//            // trigger cron
174
+//			Trigger trigger = scheduler.getTrigger(triggerKey);
175
+//			if (trigger!=null && trigger instanceof CronTriggerImpl) {
176
+//				String cronExpression = ((CronTriggerImpl) trigger).getCronExpression();
177
+//				jobInfo.setJobCron(cronExpression);
178
+//			}
179
+//
180
+//            // trigger state
181
+//            TriggerState triggerState = scheduler.getTriggerState(triggerKey);
182
+//			if (triggerState!=null) {
183
+//				jobInfo.setJobStatus(triggerState.name());
184
+//			}
185
+//
186
+//            //JobKey jobKey = new JobKey(jobInfo.getJobName(), String.valueOf(jobInfo.getJobGroup()));
187
+//            //JobDetail jobDetail = scheduler.getJobDetail(jobKey);
188
+//            //String jobClass = jobDetail.getJobClass().getName();
189
+//
190
+//		} catch (SchedulerException e) {
191
+//			logger.error(e.getMessage(), e);
192
+//		}
193
+//	}
194
+//
195
+//
196
+//    /**
197
+//     * add trigger + job
198
+//     *
199
+//     * @param jobName
200
+//     * @param cronExpression
201
+//     * @return
202
+//     * @throws SchedulerException
203
+//     */
204
+//	public static boolean addJob(String jobName, String cronExpression) throws SchedulerException {
205
+//    	// 1、job key
206
+//        TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
207
+//        JobKey jobKey = new JobKey(jobName);
208
+//
209
+//        // 2、valid
210
+//        if (scheduler.checkExists(triggerKey)) {
211
+//            return true;    // PASS
212
+//        }
213
+//
214
+//        // 3、corn trigger
215
+//        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression).withMisfireHandlingInstructionDoNothing();   // withMisfireHandlingInstructionDoNothing 忽略掉调度终止过程中忽略的调度
216
+//        CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build();
217
+//
218
+//        // 4、job detail
219
+//		Class<? extends Job> jobClass_ = RemoteHttpJobBean.class;   // Class.forName(jobInfo.getJobClass());
220
+//		JobDetail jobDetail = JobBuilder.newJob(jobClass_).withIdentity(jobKey).build();
221
+//
222
+//        /*if (jobInfo.getJobData()!=null) {
223
+//        	JobDataMap jobDataMap = jobDetail.getJobDataMap();
224
+//        	jobDataMap.putAll(JacksonUtil.readValue(jobInfo.getJobData(), Map.class));
225
+//        	// JobExecutionContext context.getMergedJobDataMap().get("mailGuid");
226
+//		}*/
227
+//
228
+//        // 5、schedule job
229
+//        Date date = scheduler.scheduleJob(jobDetail, cronTrigger);
230
+//
231
+//        logger.info(">>>>>>>>>>> addJob success(quartz), jobDetail:{}, cronTrigger:{}, date:{}", jobDetail, cronTrigger, date);
232
+//        return true;
233
+//    }
234
+//
235
+//
236
+//    /**
237
+//     * remove trigger + job
238
+//     *
239
+//     * @param jobName
240
+//     * @return
241
+//     * @throws SchedulerException
242
+//     */
243
+//    public static boolean removeJob(String jobName) throws SchedulerException {
244
+//
245
+//        JobKey jobKey = new JobKey(jobName);
246
+//        scheduler.deleteJob(jobKey);
247
+//
248
+//        /*TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
249
+//        if (scheduler.checkExists(triggerKey)) {
250
+//            scheduler.unscheduleJob(triggerKey);    // trigger + job
251
+//        }*/
252
+//
253
+//        logger.info(">>>>>>>>>>> removeJob success(quartz), jobKey:{}", jobKey);
254
+//        return true;
255
+//    }
256
+//
257
+//
258
+//    /**
259
+//     * updateJobCron
260
+//     *
261
+//     * @param jobName
262
+//     * @param cronExpression
263
+//     * @return
264
+//     * @throws SchedulerException
265
+//     */
266
+//	public static boolean updateJobCron(String jobName, String cronExpression) throws SchedulerException {
267
+//
268
+//        // 1、job key
269
+//        TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
270
+//
271
+//        // 2、valid
272
+//        if (!scheduler.checkExists(triggerKey)) {
273
+//            return true;    // PASS
274
+//        }
275
+//
276
+//        CronTrigger oldTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);
277
+//
278
+//        // 3、avoid repeat cron
279
+//        String oldCron = oldTrigger.getCronExpression();
280
+//        if (oldCron.equals(cronExpression)){
281
+//            return true;    // PASS
282
+//        }
283
+//
284
+//        // 4、new cron trigger
285
+//        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression).withMisfireHandlingInstructionDoNothing();
286
+//        oldTrigger = oldTrigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build();
287
+//
288
+//        // 5、rescheduleJob
289
+//        scheduler.rescheduleJob(triggerKey, oldTrigger);
290
+//
291
+//        /*
292
+//        JobKey jobKey = new JobKey(jobName);
293
+//
294
+//        // old job detail
295
+//        JobDetail jobDetail = scheduler.getJobDetail(jobKey);
296
+//
297
+//        // new trigger
298
+//        HashSet<Trigger> triggerSet = new HashSet<Trigger>();
299
+//        triggerSet.add(cronTrigger);
300
+//        // cover trigger of job detail
301
+//        scheduler.scheduleJob(jobDetail, triggerSet, true);*/
302
+//
303
+//        logger.info(">>>>>>>>>>> resumeJob success, JobName:{}", jobName);
304
+//        return true;
305
+//    }
306
+//
307
+//
308
+//    /**
309
+//     * pause
310
+//     *
311
+//     * @param jobName
312
+//     * @return
313
+//     * @throws SchedulerException
314
+//     */
315
+//    /*public static boolean pauseJob(String jobName) throws SchedulerException {
316
+//
317
+//    	TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
318
+//
319
+//        boolean result = false;
320
+//        if (scheduler.checkExists(triggerKey)) {
321
+//            scheduler.pauseTrigger(triggerKey);
322
+//            result =  true;
323
+//        }
324
+//
325
+//        logger.info(">>>>>>>>>>> pauseJob {}, triggerKey:{}", (result?"success":"fail"),triggerKey);
326
+//        return result;
327
+//    }*/
328
+//
329
+//
330
+//    /**
331
+//     * resume
332
+//     *
333
+//     * @param jobName
334
+//     * @return
335
+//     * @throws SchedulerException
336
+//     */
337
+//    /*public static boolean resumeJob(String jobName) throws SchedulerException {
338
+//
339
+//        TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
340
+//
341
+//        boolean result = false;
342
+//        if (scheduler.checkExists(triggerKey)) {
343
+//            scheduler.resumeTrigger(triggerKey);
344
+//            result = true;
345
+//        }
346
+//
347
+//        logger.info(">>>>>>>>>>> resumeJob {}, triggerKey:{}", (result?"success":"fail"), triggerKey);
348
+//        return result;
349
+//    }*/
350
+//
351
+//
352
+//    /**
353
+//     * run
354
+//     *
355
+//     * @param jobName
356
+//     * @return
357
+//     * @throws SchedulerException
358
+//     */
359
+//    /*public static boolean triggerJob(String jobName) throws SchedulerException {
360
+//    	// TriggerKey : name + group
361
+//    	JobKey jobKey = new JobKey(jobName);
362
+//        TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
363
+//
364
+//        boolean result = false;
365
+//        if (scheduler.checkExists(triggerKey)) {
366
+//            scheduler.triggerJob(jobKey);
367
+//            result = true;
368
+//            logger.info(">>>>>>>>>>> runJob success, jobKey:{}", jobKey);
369
+//        } else {
370
+//        	logger.info(">>>>>>>>>>> runJob fail, jobKey:{}", jobKey);
371
+//        }
372
+//        return result;
373
+//    }*/
374
+//
375
+//
376
+//    /**
377
+//     * finaAllJobList
378
+//     *
379
+//     * @return
380
+//     *//*
381
+//    @Deprecated
382
+//    public static List<Map<String, Object>> finaAllJobList(){
383
+//        List<Map<String, Object>> jobList = new ArrayList<Map<String,Object>>();
384
+//
385
+//        try {
386
+//            if (scheduler.getJobGroupNames()==null || scheduler.getJobGroupNames().size()==0) {
387
+//                return null;
388
+//            }
389
+//            String groupName = scheduler.getJobGroupNames().get(0);
390
+//            Set<JobKey> jobKeys = scheduler.getJobKeys(GroupMatcher.jobGroupEquals(groupName));
391
+//            if (jobKeys!=null && jobKeys.size()>0) {
392
+//                for (JobKey jobKey : jobKeys) {
393
+//                    TriggerKey triggerKey = TriggerKey.triggerKey(jobKey.getName(), Scheduler.DEFAULT_GROUP);
394
+//                    Trigger trigger = scheduler.getTrigger(triggerKey);
395
+//                    JobDetail jobDetail = scheduler.getJobDetail(jobKey);
396
+//                    TriggerState triggerState = scheduler.getTriggerState(triggerKey);
397
+//                    Map<String, Object> jobMap = new HashMap<String, Object>();
398
+//                    jobMap.put("TriggerKey", triggerKey);
399
+//                    jobMap.put("Trigger", trigger);
400
+//                    jobMap.put("JobDetail", jobDetail);
401
+//                    jobMap.put("TriggerState", triggerState);
402
+//                    jobList.add(jobMap);
403
+//                }
404
+//            }
405
+//
406
+//        } catch (SchedulerException e) {
407
+//            logger.error(e.getMessage(), e);
408
+//            return null;
409
+//        }
410
+//        return jobList;
411
+//    }*/
412
+//
413
+//}

+ 58 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/core/old/XxlJobThreadPool.java Zobrazit soubor

@@ -0,0 +1,58 @@
1
+//package com.xxl.job.admin.core.quartz;
2
+//
3
+//import org.quartz.SchedulerConfigException;
4
+//import org.quartz.spi.ThreadPool;
5
+//
6
+///**
7
+// * single thread pool, for async trigger
8
+// *
9
+// * @author xuxueli 2019-03-06
10
+// */
11
+//public class XxlJobThreadPool implements ThreadPool {
12
+//
13
+//    @Override
14
+//    public boolean runInThread(Runnable runnable) {
15
+//
16
+//        // async run
17
+//        runnable.run();
18
+//        return true;
19
+//
20
+//        //return false;
21
+//    }
22
+//
23
+//    @Override
24
+//    public int blockForAvailableThreads() {
25
+//        return 1;
26
+//    }
27
+//
28
+//    @Override
29
+//    public void initialize() throws SchedulerConfigException {
30
+//
31
+//    }
32
+//
33
+//    @Override
34
+//    public void shutdown(boolean waitForJobsToComplete) {
35
+//
36
+//    }
37
+//
38
+//    @Override
39
+//    public int getPoolSize() {
40
+//        return 1;
41
+//    }
42
+//
43
+//    @Override
44
+//    public void setInstanceId(String schedInstId) {
45
+//
46
+//    }
47
+//
48
+//    @Override
49
+//    public void setInstanceName(String schedName) {
50
+//
51
+//    }
52
+//
53
+//    // support
54
+//    public void setThreadCount(int count) {
55
+//        //
56
+//    }
57
+//
58
+//}

+ 0 - 58
xxl-job-admin/src/main/java/com/xxl/job/admin/core/quartz/XxlJobThreadPool.java Zobrazit soubor

@@ -1,58 +0,0 @@
1
-package com.xxl.job.admin.core.quartz;
2
-
3
-import org.quartz.SchedulerConfigException;
4
-import org.quartz.spi.ThreadPool;
5
-
6
-/**
7
- * single thread pool, for async trigger
8
- *
9
- * @author xuxueli 2019-03-06
10
- */
11
-public class XxlJobThreadPool implements ThreadPool {
12
-
13
-    @Override
14
-    public boolean runInThread(Runnable runnable) {
15
-
16
-        // async run
17
-        runnable.run();
18
-        return true;
19
-
20
-        //return false;
21
-    }
22
-
23
-    @Override
24
-    public int blockForAvailableThreads() {
25
-        return 1;
26
-    }
27
-
28
-    @Override
29
-    public void initialize() throws SchedulerConfigException {
30
-
31
-    }
32
-
33
-    @Override
34
-    public void shutdown(boolean waitForJobsToComplete) {
35
-
36
-    }
37
-
38
-    @Override
39
-    public int getPoolSize() {
40
-        return 1;
41
-    }
42
-
43
-    @Override
44
-    public void setInstanceId(String schedInstId) {
45
-
46
-    }
47
-
48
-    @Override
49
-    public void setInstanceName(String schedName) {
50
-
51
-    }
52
-
53
-    // support
54
-    public void setThreadCount(int count) {
55
-        //
56
-    }
57
-
58
-}

+ 2 - 2
xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteBusyover.java Zobrazit soubor

@@ -1,7 +1,7 @@
1 1
 package com.xxl.job.admin.core.route.strategy;
2 2
 
3
+import com.xxl.job.admin.core.conf.XxlJobScheduler;
3 4
 import com.xxl.job.admin.core.route.ExecutorRouter;
4
-import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
5 5
 import com.xxl.job.admin.core.util.I18nUtil;
6 6
 import com.xxl.job.core.biz.ExecutorBiz;
7 7
 import com.xxl.job.core.biz.model.ReturnT;
@@ -21,7 +21,7 @@ public class ExecutorRouteBusyover extends ExecutorRouter {
21 21
             // beat
22 22
             ReturnT<String> idleBeatResult = null;
23 23
             try {
24
-                ExecutorBiz executorBiz = XxlJobDynamicScheduler.getExecutorBiz(address);
24
+                ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(address);
25 25
                 idleBeatResult = executorBiz.idleBeat(triggerParam.getJobId());
26 26
             } catch (Exception e) {
27 27
                 logger.error(e.getMessage(), e);

+ 2 - 2
xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFailover.java Zobrazit soubor

@@ -1,7 +1,7 @@
1 1
 package com.xxl.job.admin.core.route.strategy;
2 2
 
3
+import com.xxl.job.admin.core.conf.XxlJobScheduler;
3 4
 import com.xxl.job.admin.core.route.ExecutorRouter;
4
-import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
5 5
 import com.xxl.job.admin.core.util.I18nUtil;
6 6
 import com.xxl.job.core.biz.ExecutorBiz;
7 7
 import com.xxl.job.core.biz.model.ReturnT;
@@ -22,7 +22,7 @@ public class ExecutorRouteFailover extends ExecutorRouter {
22 22
             // beat
23 23
             ReturnT<String> beatResult = null;
24 24
             try {
25
-                ExecutorBiz executorBiz = XxlJobDynamicScheduler.getExecutorBiz(address);
25
+                ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(address);
26 26
                 beatResult = executorBiz.beat();
27 27
             } catch (Exception e) {
28 28
                 logger.error(e.getMessage(), e);

+ 0 - 413
xxl-job-admin/src/main/java/com/xxl/job/admin/core/schedule/XxlJobDynamicScheduler.java Zobrazit soubor

@@ -1,413 +0,0 @@
1
-package com.xxl.job.admin.core.schedule;
2
-
3
-import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
4
-import com.xxl.job.admin.core.jobbean.RemoteHttpJobBean;
5
-import com.xxl.job.admin.core.model.XxlJobInfo;
6
-import com.xxl.job.admin.core.thread.JobFailMonitorHelper;
7
-import com.xxl.job.admin.core.thread.JobRegistryMonitorHelper;
8
-import com.xxl.job.admin.core.thread.JobTriggerPoolHelper;
9
-import com.xxl.job.admin.core.util.I18nUtil;
10
-import com.xxl.job.core.biz.AdminBiz;
11
-import com.xxl.job.core.biz.ExecutorBiz;
12
-import com.xxl.job.core.enums.ExecutorBlockStrategyEnum;
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;
18
-import com.xxl.rpc.remoting.net.impl.servlet.server.ServletServerHandler;
19
-import com.xxl.rpc.remoting.provider.XxlRpcProviderFactory;
20
-import com.xxl.rpc.serialize.Serializer;
21
-import org.quartz.*;
22
-import org.quartz.Trigger.TriggerState;
23
-import org.quartz.impl.triggers.CronTriggerImpl;
24
-import org.slf4j.Logger;
25
-import org.slf4j.LoggerFactory;
26
-import org.springframework.util.Assert;
27
-
28
-import javax.servlet.ServletException;
29
-import javax.servlet.http.HttpServletRequest;
30
-import javax.servlet.http.HttpServletResponse;
31
-import java.io.IOException;
32
-import java.util.Date;
33
-import java.util.concurrent.ConcurrentHashMap;
34
-
35
-/**
36
- * base quartz scheduler util
37
- * @author xuxueli 2015-12-19 16:13:53
38
- */
39
-public final class XxlJobDynamicScheduler {
40
-    private static final Logger logger = LoggerFactory.getLogger(XxlJobDynamicScheduler.class);
41
-
42
-    // ---------------------- param ----------------------
43
-
44
-    // scheduler
45
-    private static Scheduler scheduler;
46
-    public void setScheduler(Scheduler scheduler) {
47
-		XxlJobDynamicScheduler.scheduler = scheduler;
48
-	}
49
-
50
-
51
-    // ---------------------- init + destroy ----------------------
52
-    public void start() throws Exception {
53
-        // valid
54
-        Assert.notNull(scheduler, "quartz scheduler is null");
55
-
56
-        // init i18n
57
-        initI18n();
58
-
59
-        // admin registry monitor run
60
-        JobRegistryMonitorHelper.getInstance().start();
61
-
62
-        // admin monitor run
63
-        JobFailMonitorHelper.getInstance().start();
64
-
65
-        // admin-server
66
-        initRpcProvider();
67
-
68
-        logger.info(">>>>>>>>> init xxl-job admin success.");
69
-    }
70
-
71
-
72
-    public void destroy() throws Exception {
73
-        // admin trigger pool stop
74
-        JobTriggerPoolHelper.toStop();
75
-
76
-        // admin registry stop
77
-        JobRegistryMonitorHelper.getInstance().toStop();
78
-
79
-        // admin monitor stop
80
-        JobFailMonitorHelper.getInstance().toStop();
81
-
82
-        // admin-server
83
-        stopRpcProvider();
84
-    }
85
-
86
-
87
-    // ---------------------- I18n ----------------------
88
-
89
-    private void initI18n(){
90
-        for (ExecutorBlockStrategyEnum item:ExecutorBlockStrategyEnum.values()) {
91
-            item.setTitle(I18nUtil.getString("jobconf_block_".concat(item.name())));
92
-        }
93
-    }
94
-
95
-
96
-    // ---------------------- admin rpc provider (no server version) ----------------------
97
-    private static ServletServerHandler servletServerHandler;
98
-    private void initRpcProvider(){
99
-        // init
100
-        XxlRpcProviderFactory xxlRpcProviderFactory = new XxlRpcProviderFactory();
101
-        xxlRpcProviderFactory.initConfig(
102
-                NetEnum.NETTY_HTTP,
103
-                Serializer.SerializeEnum.HESSIAN.getSerializer(),
104
-                null,
105
-                0,
106
-                XxlJobAdminConfig.getAdminConfig().getAccessToken(),
107
-                null,
108
-                null);
109
-
110
-        // add services
111
-        xxlRpcProviderFactory.addService(AdminBiz.class.getName(), null, XxlJobAdminConfig.getAdminConfig().getAdminBiz());
112
-
113
-        // servlet handler
114
-        servletServerHandler = new ServletServerHandler(xxlRpcProviderFactory);
115
-    }
116
-    private void stopRpcProvider() throws Exception {
117
-        XxlRpcInvokerFactory.getInstance().stop();
118
-    }
119
-    public static void invokeAdminService(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
120
-        servletServerHandler.handle(null, request, response);
121
-    }
122
-
123
-
124
-    // ---------------------- executor-client ----------------------
125
-    private static ConcurrentHashMap<String, ExecutorBiz> executorBizRepository = new ConcurrentHashMap<String, ExecutorBiz>();
126
-    public static ExecutorBiz getExecutorBiz(String address) throws Exception {
127
-        // valid
128
-        if (address==null || address.trim().length()==0) {
129
-            return null;
130
-        }
131
-
132
-        // load-cache
133
-        address = address.trim();
134
-        ExecutorBiz executorBiz = executorBizRepository.get(address);
135
-        if (executorBiz != null) {
136
-            return executorBiz;
137
-        }
138
-
139
-        // set-cache
140
-        executorBiz = (ExecutorBiz) new XxlRpcReferenceBean(
141
-                NetEnum.NETTY_HTTP,
142
-                Serializer.SerializeEnum.HESSIAN.getSerializer(),
143
-                CallType.SYNC,
144
-                LoadBalance.ROUND,
145
-                ExecutorBiz.class,
146
-                null,
147
-                5000,
148
-                address,
149
-                XxlJobAdminConfig.getAdminConfig().getAccessToken(),
150
-                null,
151
-                null).getObject();
152
-
153
-        executorBizRepository.put(address, executorBiz);
154
-        return executorBiz;
155
-    }
156
-
157
-
158
-    // ---------------------- schedule util ----------------------
159
-
160
-    /**
161
-     * fill job info
162
-     *
163
-     * @param jobInfo
164
-     */
165
-	public static void fillJobInfo(XxlJobInfo jobInfo) {
166
-
167
-        String name = String.valueOf(jobInfo.getId());
168
-
169
-        // trigger key
170
-        TriggerKey triggerKey = TriggerKey.triggerKey(name);
171
-        try {
172
-
173
-            // trigger cron
174
-			Trigger trigger = scheduler.getTrigger(triggerKey);
175
-			if (trigger!=null && trigger instanceof CronTriggerImpl) {
176
-				String cronExpression = ((CronTriggerImpl) trigger).getCronExpression();
177
-				jobInfo.setJobCron(cronExpression);
178
-			}
179
-
180
-            // trigger state
181
-            TriggerState triggerState = scheduler.getTriggerState(triggerKey);
182
-			if (triggerState!=null) {
183
-				jobInfo.setJobStatus(triggerState.name());
184
-			}
185
-
186
-            //JobKey jobKey = new JobKey(jobInfo.getJobName(), String.valueOf(jobInfo.getJobGroup()));
187
-            //JobDetail jobDetail = scheduler.getJobDetail(jobKey);
188
-            //String jobClass = jobDetail.getJobClass().getName();
189
-			
190
-		} catch (SchedulerException e) {
191
-			logger.error(e.getMessage(), e);
192
-		}
193
-	}
194
-
195
-
196
-    /**
197
-     * add trigger + job
198
-     *
199
-     * @param jobName
200
-     * @param cronExpression
201
-     * @return
202
-     * @throws SchedulerException
203
-     */
204
-	public static boolean addJob(String jobName, String cronExpression) throws SchedulerException {
205
-    	// 1、job key
206
-        TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
207
-        JobKey jobKey = new JobKey(jobName);
208
-
209
-        // 2、valid
210
-        if (scheduler.checkExists(triggerKey)) {
211
-            return true;    // PASS
212
-        }
213
-
214
-        // 3、corn trigger
215
-        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression).withMisfireHandlingInstructionDoNothing();   // withMisfireHandlingInstructionDoNothing 忽略掉调度终止过程中忽略的调度
216
-        CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build();
217
-
218
-        // 4、job detail
219
-		Class<? extends Job> jobClass_ = RemoteHttpJobBean.class;   // Class.forName(jobInfo.getJobClass());
220
-		JobDetail jobDetail = JobBuilder.newJob(jobClass_).withIdentity(jobKey).build();
221
-
222
-        /*if (jobInfo.getJobData()!=null) {
223
-        	JobDataMap jobDataMap = jobDetail.getJobDataMap();
224
-        	jobDataMap.putAll(JacksonUtil.readValue(jobInfo.getJobData(), Map.class));	
225
-        	// JobExecutionContext context.getMergedJobDataMap().get("mailGuid");
226
-		}*/
227
-        
228
-        // 5、schedule job
229
-        Date date = scheduler.scheduleJob(jobDetail, cronTrigger);
230
-
231
-        logger.info(">>>>>>>>>>> addJob success(quartz), jobDetail:{}, cronTrigger:{}, date:{}", jobDetail, cronTrigger, date);
232
-        return true;
233
-    }
234
-
235
-
236
-    /**
237
-     * remove trigger + job
238
-     *
239
-     * @param jobName
240
-     * @return
241
-     * @throws SchedulerException
242
-     */
243
-    public static boolean removeJob(String jobName) throws SchedulerException {
244
-
245
-        JobKey jobKey = new JobKey(jobName);
246
-        scheduler.deleteJob(jobKey);
247
-
248
-        /*TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
249
-        if (scheduler.checkExists(triggerKey)) {
250
-            scheduler.unscheduleJob(triggerKey);    // trigger + job
251
-        }*/
252
-
253
-        logger.info(">>>>>>>>>>> removeJob success(quartz), jobKey:{}", jobKey);
254
-        return true;
255
-    }
256
-
257
-
258
-    /**
259
-     * updateJobCron
260
-     *
261
-     * @param jobName
262
-     * @param cronExpression
263
-     * @return
264
-     * @throws SchedulerException
265
-     */
266
-	public static boolean updateJobCron(String jobName, String cronExpression) throws SchedulerException {
267
-
268
-        // 1、job key
269
-        TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
270
-
271
-        // 2、valid
272
-        if (!scheduler.checkExists(triggerKey)) {
273
-            return true;    // PASS
274
-        }
275
-
276
-        CronTrigger oldTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);
277
-
278
-        // 3、avoid repeat cron
279
-        String oldCron = oldTrigger.getCronExpression();
280
-        if (oldCron.equals(cronExpression)){
281
-            return true;    // PASS
282
-        }
283
-
284
-        // 4、new cron trigger
285
-        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression).withMisfireHandlingInstructionDoNothing();
286
-        oldTrigger = oldTrigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build();
287
-
288
-        // 5、rescheduleJob
289
-        scheduler.rescheduleJob(triggerKey, oldTrigger);
290
-
291
-        /*
292
-        JobKey jobKey = new JobKey(jobName);
293
-
294
-        // old job detail
295
-        JobDetail jobDetail = scheduler.getJobDetail(jobKey);
296
-
297
-        // new trigger
298
-        HashSet<Trigger> triggerSet = new HashSet<Trigger>();
299
-        triggerSet.add(cronTrigger);
300
-        // cover trigger of job detail
301
-        scheduler.scheduleJob(jobDetail, triggerSet, true);*/
302
-
303
-        logger.info(">>>>>>>>>>> resumeJob success, JobName:{}", jobName);
304
-        return true;
305
-    }
306
-
307
-
308
-    /**
309
-     * pause
310
-     *
311
-     * @param jobName
312
-     * @return
313
-     * @throws SchedulerException
314
-     */
315
-    /*public static boolean pauseJob(String jobName) throws SchedulerException {
316
-
317
-    	TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
318
-
319
-        boolean result = false;
320
-        if (scheduler.checkExists(triggerKey)) {
321
-            scheduler.pauseTrigger(triggerKey);
322
-            result =  true;
323
-        }
324
-
325
-        logger.info(">>>>>>>>>>> pauseJob {}, triggerKey:{}", (result?"success":"fail"),triggerKey);
326
-        return result;
327
-    }*/
328
-
329
-
330
-    /**
331
-     * resume
332
-     *
333
-     * @param jobName
334
-     * @return
335
-     * @throws SchedulerException
336
-     */
337
-    /*public static boolean resumeJob(String jobName) throws SchedulerException {
338
-
339
-        TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
340
-        
341
-        boolean result = false;
342
-        if (scheduler.checkExists(triggerKey)) {
343
-            scheduler.resumeTrigger(triggerKey);
344
-            result = true;
345
-        }
346
-
347
-        logger.info(">>>>>>>>>>> resumeJob {}, triggerKey:{}", (result?"success":"fail"), triggerKey);
348
-        return result;
349
-    }*/
350
-
351
-
352
-    /**
353
-     * run
354
-     *
355
-     * @param jobName
356
-     * @return
357
-     * @throws SchedulerException
358
-     */
359
-    /*public static boolean triggerJob(String jobName) throws SchedulerException {
360
-    	// TriggerKey : name + group
361
-    	JobKey jobKey = new JobKey(jobName);
362
-        TriggerKey triggerKey = TriggerKey.triggerKey(jobName);
363
-
364
-        boolean result = false;
365
-        if (scheduler.checkExists(triggerKey)) {
366
-            scheduler.triggerJob(jobKey);
367
-            result = true;
368
-            logger.info(">>>>>>>>>>> runJob success, jobKey:{}", jobKey);
369
-        } else {
370
-        	logger.info(">>>>>>>>>>> runJob fail, jobKey:{}", jobKey);
371
-        }
372
-        return result;
373
-    }*/
374
-
375
-
376
-    /**
377
-     * finaAllJobList
378
-     *
379
-     * @return
380
-     *//*
381
-    @Deprecated
382
-    public static List<Map<String, Object>> finaAllJobList(){
383
-        List<Map<String, Object>> jobList = new ArrayList<Map<String,Object>>();
384
-
385
-        try {
386
-            if (scheduler.getJobGroupNames()==null || scheduler.getJobGroupNames().size()==0) {
387
-                return null;
388
-            }
389
-            String groupName = scheduler.getJobGroupNames().get(0);
390
-            Set<JobKey> jobKeys = scheduler.getJobKeys(GroupMatcher.jobGroupEquals(groupName));
391
-            if (jobKeys!=null && jobKeys.size()>0) {
392
-                for (JobKey jobKey : jobKeys) {
393
-                    TriggerKey triggerKey = TriggerKey.triggerKey(jobKey.getName(), Scheduler.DEFAULT_GROUP);
394
-                    Trigger trigger = scheduler.getTrigger(triggerKey);
395
-                    JobDetail jobDetail = scheduler.getJobDetail(jobKey);
396
-                    TriggerState triggerState = scheduler.getTriggerState(triggerKey);
397
-                    Map<String, Object> jobMap = new HashMap<String, Object>();
398
-                    jobMap.put("TriggerKey", triggerKey);
399
-                    jobMap.put("Trigger", trigger);
400
-                    jobMap.put("JobDetail", jobDetail);
401
-                    jobMap.put("TriggerState", triggerState);
402
-                    jobList.add(jobMap);
403
-                }
404
-            }
405
-
406
-        } catch (SchedulerException e) {
407
-            logger.error(e.getMessage(), e);
408
-            return null;
409
-        }
410
-        return jobList;
411
-    }*/
412
-
413
-}

+ 218 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java Zobrazit soubor

@@ -0,0 +1,218 @@
1
+package com.xxl.job.admin.core.thread;
2
+
3
+import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
4
+import com.xxl.job.admin.core.model.XxlJobInfo;
5
+import com.xxl.job.admin.core.cron.CronExpression;
6
+import com.xxl.job.admin.core.trigger.TriggerTypeEnum;
7
+import org.slf4j.Logger;
8
+import org.slf4j.LoggerFactory;
9
+
10
+import java.sql.Connection;
11
+import java.sql.PreparedStatement;
12
+import java.sql.SQLException;
13
+import java.util.*;
14
+import java.util.concurrent.ConcurrentHashMap;
15
+import java.util.concurrent.TimeUnit;
16
+
17
+/**
18
+ * @author xuxueli 2019-05-21
19
+ */
20
+public class JobScheduleHelper {
21
+    private static Logger logger = LoggerFactory.getLogger(JobScheduleHelper.class);
22
+
23
+    private static JobScheduleHelper instance = new JobScheduleHelper();
24
+    public static JobScheduleHelper getInstance(){
25
+        return instance;
26
+    }
27
+
28
+    private Thread scheduleThread;
29
+    private Thread ringThread;
30
+    private volatile boolean toStop = false;
31
+    private volatile static Map<Integer, List<Integer>> ringData = new ConcurrentHashMap<>();
32
+
33
+    public void start(){
34
+
35
+        // schedule thread
36
+        scheduleThread = new Thread(new Runnable() {
37
+            @Override
38
+            public void run() {
39
+                while (!toStop) {
40
+                    // 随机休眠1s内
41
+                    try {
42
+                        TimeUnit.MILLISECONDS.sleep(500+new Random().nextInt(500));
43
+                    } catch (InterruptedException e) {
44
+                        logger.error(e.getMessage(), e);
45
+                    }
46
+
47
+                    // 匹配任务
48
+                    Connection conn = null;
49
+                    PreparedStatement preparedStatement = null;
50
+                    try {
51
+                        if (conn==null || conn.isClosed()) {
52
+                            conn = XxlJobAdminConfig.getAdminConfig().getDataSource().getConnection();
53
+                        }
54
+                        conn.setAutoCommit(false);
55
+
56
+                        preparedStatement = conn.prepareStatement(  "select * from XXL_JOB_LOCK where lock_name = 'schedule_lock' for update" );
57
+                        preparedStatement.execute();
58
+
59
+                        // tx start
60
+
61
+                        // 1、查询JOB:"下次调度30s内"  ( ...... -5 ... now ...... +30 ...... )
62
+                        long maxNextTime = System.currentTimeMillis() + 30000;
63
+                        long nowTime = System.currentTimeMillis();
64
+                        List<XxlJobInfo> scheduleList = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().scheduleJobQuery(maxNextTime);
65
+                        if (scheduleList!=null && scheduleList.size()>0) {
66
+                            // 2、推送时间轮
67
+                            for (XxlJobInfo jobInfo: scheduleList) {
68
+
69
+                                // 过期策略:过期=更新下次触发时间为当前、过期是否5s内=立即出发,否则忽略;
70
+                                if (jobInfo.getTriggerNextTime() < nowTime) {
71
+                                    jobInfo.setTriggerNextTime(nowTime);
72
+                                    if (jobInfo.getTriggerNextTime() < nowTime-10000) {
73
+                                        continue;
74
+                                    }
75
+                                }
76
+
77
+                                // push async ring
78
+                                int second = (int)((jobInfo.getTriggerNextTime()/1000)%60);
79
+                                List<Integer> ringItemData = ringData.get(second);
80
+                                if (ringItemData == null) {
81
+                                    ringItemData = new ArrayList<Integer>();
82
+                                    ringData.put(second, ringItemData);
83
+                                }
84
+                                ringItemData.add(jobInfo.getId());
85
+
86
+                                logger.info(">>>>>>>>>>> xxl-job, push time-ring : " + second + " = " + Arrays.asList(ringItemData) );
87
+                            }
88
+
89
+                            // 3、更新trigger信息
90
+                            for (XxlJobInfo jobInfo: scheduleList) {
91
+                                // update
92
+                                jobInfo.setTriggerLastTime(jobInfo.getTriggerNextTime());
93
+                                jobInfo.setTriggerNextTime(
94
+                                        new CronExpression(jobInfo.getJobCron())
95
+                                                .getNextValidTimeAfter(new Date(jobInfo.getTriggerNextTime()))
96
+                                                .getTime()
97
+                                );
98
+                                XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().scheduleUpdate(jobInfo);
99
+                            }
100
+
101
+                        }
102
+
103
+                        // tx stop
104
+
105
+                        conn.commit();
106
+                    } catch (Exception e) {
107
+                        if (!toStop) {
108
+                            logger.error(">>>>>>>>>>> xxl-job, JobScheduleHelper#scheduleThread error:{}", e);
109
+                        }
110
+                    } finally {
111
+                        if (conn != null) {
112
+                            try {
113
+                                conn.close();
114
+                            } catch (SQLException e) {
115
+                            }
116
+                        }
117
+                        if (null != preparedStatement) {
118
+                            try {
119
+                                preparedStatement.close();
120
+                            } catch (SQLException ignore) {
121
+                            }
122
+                        }
123
+                    }
124
+                }
125
+                logger.info(">>>>>>>>>>> xxl-job, JobScheduleHelper#scheduleThread stop");
126
+            }
127
+        });
128
+        scheduleThread.setDaemon(true);
129
+        scheduleThread.setName("xxl-job, admin JobScheduleHelper#scheduleThread");
130
+        scheduleThread.start();
131
+
132
+
133
+        // ring thread
134
+        ringThread = new Thread(new Runnable() {
135
+            @Override
136
+            public void run() {
137
+                int lastSecond = -1;
138
+                while (!toStop) {
139
+                    try {
140
+                        // second data
141
+                        List<Integer> ringItemData = new ArrayList<>();
142
+                        int nowSecond = (int)((System.currentTimeMillis()/1000)%60);   // 避免处理耗时太长,跨过刻度;
143
+                        if (lastSecond == -1) {
144
+                            if (ringData.containsKey(nowSecond)) {
145
+                                List<Integer> tmpData = ringData.remove(nowSecond);
146
+                                if (tmpData != null) {
147
+                                    ringItemData.addAll(tmpData);
148
+                                }
149
+                            }
150
+                            lastSecond = nowSecond;
151
+                        } else {
152
+                            for (int i = 1; i <=60; i++) {
153
+                                int secondItem = (lastSecond+i)%60;
154
+
155
+                                List<Integer> tmpData = ringData.remove(secondItem);
156
+                                if (tmpData != null) {
157
+                                    ringItemData.addAll(tmpData);
158
+                                }
159
+
160
+                                if (secondItem == nowSecond) {
161
+                                    break;
162
+                                }
163
+                            }
164
+                            lastSecond = nowSecond;
165
+                        }
166
+
167
+                        logger.info(">>>>>>>>>>> xxl-job, time-ring beat : " + nowSecond + " = " + Arrays.asList(ringItemData) );
168
+                        if (ringItemData!=null && ringItemData.size()>0) {
169
+                            // do trigger
170
+                            for (int jobId: ringItemData) {
171
+                                // do trigger
172
+                                JobTriggerPoolHelper.trigger(jobId, TriggerTypeEnum.CRON, -1, null, null);
173
+                            }
174
+
175
+                            // clear
176
+                            ringItemData.clear();
177
+                        }
178
+                    } catch (Exception e) {
179
+                        if (!toStop) {
180
+                            logger.error(">>>>>>>>>>> xxl-job, JobScheduleHelper#ringThread error:{}", e);
181
+                        }
182
+                    }
183
+
184
+                    try {
185
+                        TimeUnit.SECONDS.sleep(1);
186
+                    } catch (InterruptedException e) {
187
+                        logger.error(e.getMessage(), e);
188
+                    }
189
+                }
190
+                logger.info(">>>>>>>>>>> xxl-job, JobScheduleHelper#ringThread stop");
191
+            }
192
+        });
193
+        ringThread.setDaemon(true);
194
+        ringThread.setName("xxl-job, admin JobScheduleHelper#ringThread");
195
+        ringThread.start();
196
+    }
197
+
198
+    public void toStop(){
199
+        toStop = true;
200
+
201
+        // interrupt and wait
202
+        scheduleThread.interrupt();
203
+        try {
204
+            scheduleThread.join();
205
+        } catch (InterruptedException e) {
206
+            logger.error(e.getMessage(), e);
207
+        }
208
+
209
+        // interrupt and wait
210
+        ringThread.interrupt();
211
+        try {
212
+            ringThread.join();
213
+        } catch (InterruptedException e) {
214
+            logger.error(e.getMessage(), e);
215
+        }
216
+    }
217
+
218
+}

+ 2 - 2
xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java Zobrazit soubor

@@ -1,11 +1,11 @@
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 5
 import com.xxl.job.admin.core.model.XxlJobGroup;
5 6
 import com.xxl.job.admin.core.model.XxlJobInfo;
6 7
 import com.xxl.job.admin.core.model.XxlJobLog;
7 8
 import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;
8
-import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
9 9
 import com.xxl.job.admin.core.util.I18nUtil;
10 10
 import com.xxl.job.core.biz.ExecutorBiz;
11 11
 import com.xxl.job.core.biz.model.ReturnT;
@@ -192,7 +192,7 @@ public class XxlJobTrigger {
192 192
     public static ReturnT<String> runExecutor(TriggerParam triggerParam, String address){
193 193
         ReturnT<String> runResult = null;
194 194
         try {
195
-            ExecutorBiz executorBiz = XxlJobDynamicScheduler.getExecutorBiz(address);
195
+            ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(address);
196 196
             runResult = executorBiz.run(triggerParam);
197 197
         } catch (Exception e) {
198 198
             logger.error(">>>>>>>>>>> xxl-job trigger error, please check if the executor[{}] is running.", address, e);

+ 6 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobInfoDao.java Zobrazit soubor

@@ -29,7 +29,7 @@ public interface XxlJobInfoDao {
29 29
 
30 30
 	public XxlJobInfo loadById(@Param("id") int id);
31 31
 	
32
-	public int update(XxlJobInfo item);
32
+	public int update(XxlJobInfo xxlJobInfo);
33 33
 	
34 34
 	public int delete(@Param("id") int id);
35 35
 
@@ -37,4 +37,9 @@ public interface XxlJobInfoDao {
37 37
 
38 38
 	public int findAllCount();
39 39
 
40
+	public List<XxlJobInfo> scheduleJobQuery(@Param("maxNextTime") long maxNextTime);
41
+
42
+	public int scheduleUpdate(XxlJobInfo xxlJobInfo);
43
+
44
+
40 45
 }

+ 6 - 6
xxl-job-admin/src/main/java/com/xxl/job/admin/service/XxlJobService.java Zobrazit soubor

@@ -28,7 +28,7 @@ public interface XxlJobService {
28 28
 	public Map<String, Object> pageList(int start, int length, int jobGroup, String jobDesc, String executorHandler, String filterTime);
29 29
 
30 30
 	/**
31
-	 * add job, default quartz stop
31
+	 * add job
32 32
 	 *
33 33
 	 * @param jobInfo
34 34
 	 * @return
@@ -36,7 +36,7 @@ public interface XxlJobService {
36 36
 	public ReturnT<String> add(XxlJobInfo jobInfo);
37 37
 
38 38
 	/**
39
-	 * update job, update quartz-cron if started
39
+	 * update job
40 40
 	 *
41 41
 	 * @param jobInfo
42 42
 	 * @return
@@ -44,15 +44,15 @@ public interface XxlJobService {
44 44
 	public ReturnT<String> update(XxlJobInfo jobInfo);
45 45
 
46 46
 	/**
47
-	 * remove job, unbind quartz
48
-	 *
47
+	 * remove job
48
+	 * 	 *
49 49
 	 * @param id
50 50
 	 * @return
51 51
 	 */
52 52
 	public ReturnT<String> remove(int id);
53 53
 
54 54
 	/**
55
-	 * start job, bind quartz
55
+	 * start job
56 56
 	 *
57 57
 	 * @param id
58 58
 	 * @return
@@ -60,7 +60,7 @@ public interface XxlJobService {
60 60
 	public ReturnT<String> start(int id);
61 61
 
62 62
 	/**
63
-	 * stop job, unbind quartz
63
+	 * stop job
64 64
 	 *
65 65
 	 * @param id
66 66
 	 * @return

+ 38 - 67
xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java Zobrazit soubor

@@ -2,8 +2,8 @@ package com.xxl.job.admin.service.impl;
2 2
 
3 3
 import com.xxl.job.admin.core.model.XxlJobGroup;
4 4
 import com.xxl.job.admin.core.model.XxlJobInfo;
5
+import com.xxl.job.admin.core.cron.CronExpression;
5 6
 import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;
6
-import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
7 7
 import com.xxl.job.admin.core.util.I18nUtil;
8 8
 import com.xxl.job.admin.dao.XxlJobGroupDao;
9 9
 import com.xxl.job.admin.dao.XxlJobInfoDao;
@@ -14,14 +14,13 @@ import com.xxl.job.core.biz.model.ReturnT;
14 14
 import com.xxl.job.core.enums.ExecutorBlockStrategyEnum;
15 15
 import com.xxl.job.core.glue.GlueTypeEnum;
16 16
 import com.xxl.job.core.util.DateUtil;
17
-import org.quartz.CronExpression;
18
-import org.quartz.SchedulerException;
19 17
 import org.slf4j.Logger;
20 18
 import org.slf4j.LoggerFactory;
21 19
 import org.springframework.stereotype.Service;
22 20
 
23 21
 import javax.annotation.Resource;
24 22
 import java.text.MessageFormat;
23
+import java.text.ParseException;
25 24
 import java.util.*;
26 25
 
27 26
 /**
@@ -48,13 +47,6 @@ public class XxlJobServiceImpl implements XxlJobService {
48 47
 		List<XxlJobInfo> list = xxlJobInfoDao.pageList(start, length, jobGroup, jobDesc, executorHandler);
49 48
 		int list_count = xxlJobInfoDao.pageListCount(start, length, jobGroup, jobDesc, executorHandler);
50 49
 		
51
-		// fill job info
52
-		if (list!=null && list.size()>0) {
53
-			for (XxlJobInfo jobInfo : list) {
54
-				XxlJobDynamicScheduler.fillJobInfo(jobInfo);
55
-			}
56
-		}
57
-		
58 50
 		// package result
59 51
 		Map<String, Object> maps = new HashMap<String, Object>();
60 52
 	    maps.put("recordsTotal", list_count);		// 总记录数
@@ -197,6 +189,15 @@ public class XxlJobServiceImpl implements XxlJobService {
197 189
 			return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_id")+I18nUtil.getString("system_not_found")) );
198 190
 		}
199 191
 
192
+		// next trigger time
193
+		long nextTriggerTime = 0;
194
+		try {
195
+			nextTriggerTime = new CronExpression(jobInfo.getJobCron()).getNextValidTimeAfter(new Date()).getTime();
196
+		} catch (ParseException e) {
197
+			logger.error(e.getMessage(), e);
198
+			return new ReturnT<String>(ReturnT.FAIL_CODE, I18nUtil.getString("jobinfo_field_cron_unvalid")+" | "+ e.getMessage());
199
+		}
200
+
200 201
 		exists_jobInfo.setJobGroup(jobInfo.getJobGroup());
201 202
 		exists_jobInfo.setJobCron(jobInfo.getJobCron());
202 203
 		exists_jobInfo.setJobDesc(jobInfo.getJobDesc());
@@ -209,18 +210,10 @@ public class XxlJobServiceImpl implements XxlJobService {
209 210
 		exists_jobInfo.setExecutorTimeout(jobInfo.getExecutorTimeout());
210 211
 		exists_jobInfo.setExecutorFailRetryCount(jobInfo.getExecutorFailRetryCount());
211 212
 		exists_jobInfo.setChildJobId(jobInfo.getChildJobId());
213
+		exists_jobInfo.setTriggerNextTime(nextTriggerTime);
212 214
         xxlJobInfoDao.update(exists_jobInfo);
213 215
 
214 216
 
215
-		// update quartz-cron if started
216
-        try {
217
-			String qz_name = String.valueOf(exists_jobInfo.getId());
218
-            XxlJobDynamicScheduler.updateJobCron(qz_name, exists_jobInfo.getJobCron());
219
-        } catch (SchedulerException e) {
220
-            logger.error(e.getMessage(), e);
221
-			return ReturnT.FAIL;
222
-        }
223
-
224 217
 		return ReturnT.SUCCESS;
225 218
 	}
226 219
 
@@ -230,76 +223,54 @@ public class XxlJobServiceImpl implements XxlJobService {
230 223
 		if (xxlJobInfo == null) {
231 224
 			return ReturnT.SUCCESS;
232 225
 		}
233
-		String name = String.valueOf(xxlJobInfo.getId());
234
-
235
-		try {
236
-			// unbind quartz
237
-			XxlJobDynamicScheduler.removeJob(name);
238
-
239
-			xxlJobInfoDao.delete(id);
240
-			xxlJobLogDao.delete(id);
241
-			xxlJobLogGlueDao.deleteByJobId(id);
242
-			return ReturnT.SUCCESS;
243
-		} catch (SchedulerException e) {
244
-			logger.error(e.getMessage(), e);
245
-			return ReturnT.FAIL;
246
-		}
247 226
 
227
+		xxlJobInfoDao.delete(id);
228
+		xxlJobLogDao.delete(id);
229
+		xxlJobLogGlueDao.deleteByJobId(id);
230
+		return ReturnT.SUCCESS;
248 231
 	}
249 232
 
250 233
 	@Override
251 234
 	public ReturnT<String> start(int id) {
252 235
 		XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id);
253
-		String name = String.valueOf(xxlJobInfo.getId());
254
-		String cronExpression = xxlJobInfo.getJobCron();
255 236
 
237
+		// next trigger time
238
+		long nextTriggerTime = 0;
256 239
 		try {
257
-			boolean ret = XxlJobDynamicScheduler.addJob(name, cronExpression);
258
-			return ret?ReturnT.SUCCESS:ReturnT.FAIL;
259
-		} catch (SchedulerException e) {
240
+			nextTriggerTime = new CronExpression(xxlJobInfo.getJobCron()).getNextValidTimeAfter(new Date()).getTime();
241
+		} catch (ParseException e) {
260 242
 			logger.error(e.getMessage(), e);
261
-			return ReturnT.FAIL;
243
+			return new ReturnT<String>(ReturnT.FAIL_CODE, I18nUtil.getString("jobinfo_field_cron_unvalid")+" | "+ e.getMessage());
262 244
 		}
245
+
246
+		xxlJobInfo.setTriggerStatus(1);
247
+		xxlJobInfo.setTriggerLastTime(0);
248
+		xxlJobInfo.setTriggerNextTime(nextTriggerTime);
249
+
250
+		xxlJobInfoDao.update(xxlJobInfo);
251
+		return ReturnT.SUCCESS;
263 252
 	}
264 253
 
265 254
 	@Override
266 255
 	public ReturnT<String> stop(int id) {
267 256
         XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id);
268
-        String name = String.valueOf(xxlJobInfo.getId());
269 257
 
258
+		// next trigger time
259
+		long nextTriggerTime = 0;
270 260
 		try {
271
-			// bind quartz
272
-            boolean ret = XxlJobDynamicScheduler.removeJob(name);
273
-            return ret?ReturnT.SUCCESS:ReturnT.FAIL;
274
-		} catch (SchedulerException e) {
261
+			nextTriggerTime = new CronExpression(xxlJobInfo.getJobCron()).getNextValidTimeAfter(new Date()).getTime();
262
+		} catch (ParseException e) {
275 263
 			logger.error(e.getMessage(), e);
276
-			return ReturnT.FAIL;
264
+			return new ReturnT<String>(ReturnT.FAIL_CODE, I18nUtil.getString("jobinfo_field_cron_unvalid")+" | "+ e.getMessage());
277 265
 		}
278
-	}
279 266
 
280
-	/*@Override
281
-    public ReturnT<String> triggerJob(int id, int failRetryCount) {
267
+		xxlJobInfo.setTriggerStatus(0);
268
+		xxlJobInfo.setTriggerLastTime(0);
269
+		xxlJobInfo.setTriggerNextTime(nextTriggerTime);
282 270
 
283
-		JobTriggerPoolHelper.trigger(id, failRetryCount);
271
+		xxlJobInfoDao.update(xxlJobInfo);
284 272
 		return ReturnT.SUCCESS;
285
-
286
-        *//*XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id);
287
-        if (xxlJobInfo == null) {
288
-        	return new ReturnT<String>(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_id")+I18nUtil.getString("system_unvalid")) );
289
-		}
290
-
291
-        String group = String.valueOf(xxlJobInfo.getJobGroup());
292
-        String name = String.valueOf(xxlJobInfo.getId());
293
-
294
-		try {
295
-			XxlJobDynamicScheduler.triggerJob(name, group);
296
-			return ReturnT.SUCCESS;
297
-		} catch (SchedulerException e) {
298
-			logger.error(e.getMessage(), e);
299
-			return new ReturnT<String>(ReturnT.FAIL_CODE, e.getMessage());
300
-		}*//*
301
-
302
-	}*/
273
+	}
303 274
 
304 275
 	@Override
305 276
 	public Map<String, Object> dashboardInfo() {

+ 6 - 6
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobGroupMapper.xml Zobrazit soubor

@@ -23,24 +23,24 @@
23 23
 
24 24
 	<select id="findAll" resultMap="XxlJobGroup">
25 25
 		SELECT <include refid="Base_Column_List" />
26
-		FROM XXL_JOB_QRTZ_TRIGGER_GROUP AS t
26
+		FROM XXL_JOB_GROUP AS t
27 27
 		ORDER BY t.order ASC
28 28
 	</select>
29 29
 
30 30
 	<select id="findByAddressType" parameterType="java.lang.Integer" resultMap="XxlJobGroup">
31 31
 		SELECT <include refid="Base_Column_List" />
32
-		FROM XXL_JOB_QRTZ_TRIGGER_GROUP AS t
32
+		FROM XXL_JOB_GROUP AS t
33 33
 		WHERE t.address_type = #{addressType}
34 34
 		ORDER BY t.order ASC
35 35
 	</select>
36 36
 
37 37
 	<insert id="save" parameterType="com.xxl.job.admin.core.model.XxlJobGroup" useGeneratedKeys="true" keyProperty="id" >
38
-		INSERT INTO XXL_JOB_QRTZ_TRIGGER_GROUP ( `app_name`, `title`, `order`, `address_type`, `address_list`)
38
+		INSERT INTO XXL_JOB_GROUP ( `app_name`, `title`, `order`, `address_type`, `address_list`)
39 39
 		values ( #{appName}, #{title}, #{order}, #{addressType}, #{addressList});
40 40
 	</insert>
41 41
 
42 42
 	<update id="update" parameterType="com.xxl.job.admin.core.model.XxlJobGroup" >
43
-		UPDATE XXL_JOB_QRTZ_TRIGGER_GROUP
43
+		UPDATE XXL_JOB_GROUP
44 44
 		SET `app_name` = #{appName},
45 45
 			`title` = #{title},
46 46
 			`order` = #{order},
@@ -50,13 +50,13 @@
50 50
 	</update>
51 51
 
52 52
 	<delete id="remove" parameterType="java.lang.Integer" >
53
-		DELETE FROM XXL_JOB_QRTZ_TRIGGER_GROUP
53
+		DELETE FROM XXL_JOB_GROUP
54 54
 		WHERE id = #{id}
55 55
 	</delete>
56 56
 
57 57
 	<select id="load" parameterType="java.lang.Integer" resultMap="XxlJobGroup">
58 58
 		SELECT <include refid="Base_Column_List" />
59
-		FROM XXL_JOB_QRTZ_TRIGGER_GROUP AS t
59
+		FROM XXL_JOB_GROUP AS t
60 60
 		WHERE t.id = #{id}
61 61
 	</select>
62 62
 

+ 44 - 12
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml Zobrazit soubor

@@ -29,6 +29,10 @@
29 29
 		<result column="glue_updatetime" property="glueUpdatetime" />
30 30
 
31 31
 		<result column="child_jobid" property="childJobId" />
32
+
33
+		<result column="trigger_status" property="triggerStatus" />
34
+		<result column="trigger_last_time" property="triggerLastTime" />
35
+		<result column="trigger_next_time" property="triggerNextTime" />
32 36
 	</resultMap>
33 37
 
34 38
 	<sql id="Base_Column_List">
@@ -50,12 +54,15 @@
50 54
 		t.glue_source,
51 55
 		t.glue_remark,
52 56
 		t.glue_updatetime,
53
-		t.child_jobid
57
+		t.child_jobid,
58
+		t.trigger_status,
59
+		t.trigger_last_time,
60
+		t.trigger_next_time
54 61
 	</sql>
55 62
 
56 63
 	<select id="pageList" parameterType="java.util.HashMap" resultMap="XxlJobInfo">
57 64
 		SELECT <include refid="Base_Column_List" />
58
-		FROM XXL_JOB_QRTZ_TRIGGER_INFO AS t
65
+		FROM XXL_JOB_INFO AS t
59 66
 		<trim prefix="WHERE" prefixOverrides="AND | OR" >
60 67
 			<if test="jobGroup gt 0">
61 68
 				AND t.job_group = #{jobGroup}
@@ -73,7 +80,7 @@
73 80
 
74 81
 	<select id="pageListCount" parameterType="java.util.HashMap" resultType="int">
75 82
 		SELECT count(1)
76
-		FROM XXL_JOB_QRTZ_TRIGGER_INFO AS t
83
+		FROM XXL_JOB_INFO AS t
77 84
 		<trim prefix="WHERE" prefixOverrides="AND | OR" >
78 85
 			<if test="jobGroup gt 0">
79 86
 				AND t.job_group = #{jobGroup}
@@ -88,7 +95,7 @@
88 95
 	</select>
89 96
 
90 97
 	<insert id="save" parameterType="com.xxl.job.admin.core.model.XxlJobInfo" useGeneratedKeys="true" keyProperty="id" >
91
-		INSERT INTO XXL_JOB_QRTZ_TRIGGER_INFO (
98
+		INSERT INTO XXL_JOB_INFO (
92 99
 			job_group,
93 100
 			job_cron,
94 101
 			job_desc,
@@ -106,7 +113,10 @@
106 113
 			glue_source,
107 114
 			glue_remark,
108 115
 			glue_updatetime,
109
-			child_jobid
116
+			child_jobid,
117
+			trigger_status,
118
+			trigger_last_time,
119
+			trigger_next_time
110 120
 		) VALUES (
111 121
 			#{jobGroup},
112 122
 			#{jobCron},
@@ -125,7 +135,10 @@
125 135
 			#{glueSource},
126 136
 			#{glueRemark},
127 137
 			NOW(),
128
-			#{childJobId}
138
+			#{childJobId},
139
+			#{triggerStatus},
140
+			#{triggerLastTime},
141
+			#{triggerNextTime}
129 142
 		);
130 143
 		<!--<selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id">
131 144
 			SELECT LAST_INSERT_ID()
@@ -135,12 +148,12 @@
135 148
 
136 149
 	<select id="loadById" parameterType="java.util.HashMap" resultMap="XxlJobInfo">
137 150
 		SELECT <include refid="Base_Column_List" />
138
-		FROM XXL_JOB_QRTZ_TRIGGER_INFO AS t
151
+		FROM XXL_JOB_INFO AS t
139 152
 		WHERE t.id = #{id}
140 153
 	</select>
141 154
 
142 155
 	<update id="update" parameterType="com.xxl.job.admin.core.model.XxlJobInfo" >
143
-		UPDATE XXL_JOB_QRTZ_TRIGGER_INFO
156
+		UPDATE XXL_JOB_INFO
144 157
 		SET
145 158
 			job_group = #{jobGroup},
146 159
 			job_cron = #{jobCron},
@@ -158,25 +171,44 @@
158 171
 			glue_source = #{glueSource},
159 172
 			glue_remark = #{glueRemark},
160 173
 			glue_updatetime = #{glueUpdatetime},
161
-			child_jobid = #{childJobId}
174
+			child_jobid = #{childJobId},
175
+			trigger_status = #{triggerStatus},
176
+			trigger_last_time = #{triggerLastTime},
177
+			trigger_next_time = #{triggerNextTime}
162 178
 		WHERE id = #{id}
163 179
 	</update>
164 180
 
165 181
 	<delete id="delete" parameterType="java.util.HashMap">
166 182
 		DELETE
167
-		FROM XXL_JOB_QRTZ_TRIGGER_INFO
183
+		FROM XXL_JOB_INFO
168 184
 		WHERE id = #{id}
169 185
 	</delete>
170 186
 
171 187
 	<select id="getJobsByGroup" parameterType="java.util.HashMap" resultMap="XxlJobInfo">
172 188
 		SELECT <include refid="Base_Column_List" />
173
-		FROM XXL_JOB_QRTZ_TRIGGER_INFO AS t
189
+		FROM XXL_JOB_INFO AS t
174 190
 		WHERE t.job_group = #{jobGroup}
175 191
 	</select>
176 192
 
177 193
 	<select id="findAllCount" resultType="int">
178 194
 		SELECT count(1)
179
-		FROM XXL_JOB_QRTZ_TRIGGER_INFO
195
+		FROM XXL_JOB_INFO
196
+	</select>
197
+
198
+
199
+	<select id="scheduleJobQuery" parameterType="java.util.HashMap" resultMap="XxlJobInfo">
200
+		SELECT <include refid="Base_Column_List" />
201
+		FROM XXL_JOB_INFO AS t
202
+		WHERE t.trigger_status = 1
203
+			and t.trigger_next_time<![CDATA[ < ]]> #{maxNextTime}
180 204
 	</select>
181 205
 
206
+	<update id="scheduleUpdate" parameterType="com.xxl.job.admin.core.model.XxlJobInfo"  >
207
+		UPDATE XXL_JOB_INFO
208
+		SET
209
+			trigger_last_time = #{triggerLastTime},
210
+			trigger_next_time = #{triggerNextTime}
211
+		WHERE id = #{id}
212
+	</update>
213
+
182 214
 </mapper>

+ 5 - 5
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogGlueMapper.xml Zobrazit soubor

@@ -24,7 +24,7 @@
24 24
 	</sql>
25 25
 	
26 26
 	<insert id="save" parameterType="com.xxl.job.admin.core.model.XxlJobLogGlue" useGeneratedKeys="true" keyProperty="id" >
27
-		INSERT INTO XXL_JOB_QRTZ_TRIGGER_LOGGLUE (
27
+		INSERT INTO XXL_JOB_LOGGLUE (
28 28
 			`job_id`,
29 29
 			`glue_type`,
30 30
 			`glue_source`,
@@ -46,16 +46,16 @@
46 46
 	
47 47
 	<select id="findByJobId" parameterType="java.lang.Integer" resultMap="XxlJobLogGlue">
48 48
 		SELECT <include refid="Base_Column_List" />
49
-		FROM XXL_JOB_QRTZ_TRIGGER_LOGGLUE AS t
49
+		FROM XXL_JOB_LOGGLUE AS t
50 50
 		WHERE t.job_id = #{jobId}
51 51
 		ORDER BY id DESC
52 52
 	</select>
53 53
 	
54 54
 	<delete id="removeOld" >
55
-		DELETE FROM XXL_JOB_QRTZ_TRIGGER_LOGGLUE
55
+		DELETE FROM XXL_JOB_LOGGLUE
56 56
 		WHERE id NOT in(
57 57
 			SELECT id FROM(
58
-				SELECT id FROM XXL_JOB_QRTZ_TRIGGER_LOGGLUE
58
+				SELECT id FROM XXL_JOB_LOGGLUE
59 59
 				WHERE `job_id` = #{jobId}
60 60
 				ORDER BY update_time desc
61 61
 				LIMIT 0, #{limit}
@@ -64,7 +64,7 @@
64 64
 	</delete>
65 65
 	
66 66
 	<delete id="deleteByJobId" parameterType="java.lang.Integer" >
67
-		DELETE FROM XXL_JOB_QRTZ_TRIGGER_LOGGLUE
67
+		DELETE FROM XXL_JOB_LOGGLUE
68 68
 		WHERE `job_id` = #{jobId}
69 69
 	</delete>
70 70
 	

+ 13 - 13
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml Zobrazit soubor

@@ -46,7 +46,7 @@
46 46
 	
47 47
 	<select id="pageList" resultMap="XxlJobLog">
48 48
 		SELECT <include refid="Base_Column_List" />
49
-		FROM XXL_JOB_QRTZ_TRIGGER_LOG AS t
49
+		FROM XXL_JOB_LOG AS t
50 50
 		<trim prefix="WHERE" prefixOverrides="AND | OR" >
51 51
 			<if test="jobId==0 and jobGroup gt 0">
52 52
 				AND t.job_group = #{jobGroup}
@@ -80,7 +80,7 @@
80 80
 	
81 81
 	<select id="pageListCount" resultType="int">
82 82
 		SELECT count(1)
83
-		FROM XXL_JOB_QRTZ_TRIGGER_LOG AS t
83
+		FROM XXL_JOB_LOG AS t
84 84
 		<trim prefix="WHERE" prefixOverrides="AND | OR" >
85 85
 			<if test="jobId==0 and jobGroup gt 0">
86 86
 				AND t.job_group = #{jobGroup}
@@ -112,13 +112,13 @@
112 112
 	
113 113
 	<select id="load" parameterType="java.lang.Integer" resultMap="XxlJobLog">
114 114
 		SELECT <include refid="Base_Column_List" />
115
-		FROM XXL_JOB_QRTZ_TRIGGER_LOG AS t
115
+		FROM XXL_JOB_LOG AS t
116 116
 		WHERE t.id = #{id}
117 117
 	</select>
118 118
 
119 119
 	
120 120
 	<insert id="save" parameterType="com.xxl.job.admin.core.model.XxlJobLog" useGeneratedKeys="true" keyProperty="id" >
121
-		INSERT INTO XXL_JOB_QRTZ_TRIGGER_LOG (
121
+		INSERT INTO XXL_JOB_LOG (
122 122
 			`job_group`,
123 123
 			`job_id`,
124 124
 			`trigger_time`,
@@ -137,7 +137,7 @@
137 137
 	</insert>
138 138
 
139 139
 	<update id="updateTriggerInfo" >
140
-		UPDATE XXL_JOB_QRTZ_TRIGGER_LOG
140
+		UPDATE XXL_JOB_LOG
141 141
 		SET
142 142
 			`trigger_time`= #{triggerTime},
143 143
 			`trigger_code`= #{triggerCode},
@@ -151,7 +151,7 @@
151 151
 	</update>
152 152
 
153 153
 	<update id="updateHandleInfo">
154
-		UPDATE XXL_JOB_QRTZ_TRIGGER_LOG
154
+		UPDATE XXL_JOB_LOG
155 155
 		SET 
156 156
 			`handle_time`= #{handleTime}, 
157 157
 			`handle_code`= #{handleCode},
@@ -160,13 +160,13 @@
160 160
 	</update>
161 161
 	
162 162
 	<delete id="delete" >
163
-		delete from XXL_JOB_QRTZ_TRIGGER_LOG
163
+		delete from XXL_JOB_LOG
164 164
 		WHERE job_id = #{jobId}
165 165
 	</delete>
166 166
 
167 167
 	<select id="triggerCountByHandleCode" resultType="int" >
168 168
 		SELECT count(1)
169
-		FROM XXL_JOB_QRTZ_TRIGGER_LOG AS t
169
+		FROM XXL_JOB_LOG AS t
170 170
 		<trim prefix="WHERE" prefixOverrides="AND | OR" >
171 171
 			<if test="handleCode gt 0">
172 172
 				AND t.handle_code = #{handleCode}
@@ -180,13 +180,13 @@
180 180
 			COUNT(handle_code) triggerDayCount,
181 181
 			SUM(CASE WHEN (trigger_code in (0, 200) and handle_code = 0) then 1 else 0 end) as triggerDayCountRunning,
182 182
 			SUM(CASE WHEN handle_code = 200 then 1 else 0 end) as triggerDayCountSuc
183
-		FROM XXL_JOB_QRTZ_TRIGGER_LOG
183
+		FROM XXL_JOB_LOG
184 184
 		WHERE trigger_time BETWEEN #{from} and #{to}
185 185
 		GROUP BY triggerDay;
186 186
     </select>
187 187
 
188 188
 	<delete id="clearLog" >
189
-		delete from XXL_JOB_QRTZ_TRIGGER_LOG
189
+		delete from XXL_JOB_LOG
190 190
 		<trim prefix="WHERE" prefixOverrides="AND | OR" >
191 191
 			<if test="jobGroup gt 0">
192 192
 				AND job_group = #{jobGroup}
@@ -200,7 +200,7 @@
200 200
 			<if test="clearBeforeNum gt 0">
201 201
 				AND id NOT in(
202 202
 					SELECT id FROM(
203
-						SELECT id FROM XXL_JOB_QRTZ_TRIGGER_LOG AS t
203
+						SELECT id FROM XXL_JOB_LOG AS t
204 204
 						<trim prefix="WHERE" prefixOverrides="AND | OR" >
205 205
 							<if test="jobGroup gt 0">
206 206
 								AND t.job_group = #{jobGroup}
@@ -218,7 +218,7 @@
218 218
 	</delete>
219 219
 
220 220
 	<select id="findFailJobLogIds" resultType="int" >
221
-		SELECT id FROM `XXL_JOB_QRTZ_TRIGGER_LOG`
221
+		SELECT id FROM `XXL_JOB_LOG`
222 222
 		WHERE !(
223 223
 			(trigger_code in (0, 200) and handle_code = 0)
224 224
 			OR
@@ -229,7 +229,7 @@
229 229
 	</select>
230 230
 
231 231
 	<update id="updateAlarmStatus" >
232
-		UPDATE XXL_JOB_QRTZ_TRIGGER_LOG
232
+		UPDATE XXL_JOB_LOG
233 233
 		SET
234 234
 			`alarm_status` = #{newAlarmStatus}
235 235
 		WHERE `id`= #{logId} AND `alarm_status` = #{oldAlarmStatus}

+ 5 - 5
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobRegistryMapper.xml Zobrazit soubor

@@ -20,18 +20,18 @@
20 20
 	</sql>
21 21
 	
22 22
 	<delete id="removeDead" parameterType="java.lang.Integer" >
23
-		DELETE FROM XXL_JOB_QRTZ_TRIGGER_REGISTRY
23
+		DELETE FROM XXL_JOB_REGISTRY
24 24
 		WHERE update_time <![CDATA[ < ]]> DATE_ADD(NOW(),INTERVAL -#{timeout} SECOND)
25 25
 	</delete>
26 26
 
27 27
 	<select id="findAll" parameterType="java.lang.Integer" resultMap="XxlJobRegistry">
28 28
 		SELECT <include refid="Base_Column_List" />
29
-		FROM XXL_JOB_QRTZ_TRIGGER_REGISTRY AS t
29
+		FROM XXL_JOB_REGISTRY AS t
30 30
 		WHERE t.update_time <![CDATA[ > ]]> DATE_ADD(NOW(),INTERVAL -#{timeout} SECOND)
31 31
 	</select>
32 32
 
33 33
     <update id="registryUpdate" >
34
-        UPDATE XXL_JOB_QRTZ_TRIGGER_REGISTRY
34
+        UPDATE XXL_JOB_REGISTRY
35 35
         SET `update_time` = NOW()
36 36
         WHERE `registry_group` = #{registryGroup}
37 37
           AND `registry_key` = #{registryKey}
@@ -39,12 +39,12 @@
39 39
     </update>
40 40
 
41 41
     <insert id="registrySave" >
42
-        INSERT INTO XXL_JOB_QRTZ_TRIGGER_REGISTRY( `registry_group` , `registry_key` , `registry_value`, `update_time`)
42
+        INSERT INTO XXL_JOB_REGISTRY( `registry_group` , `registry_key` , `registry_value`, `update_time`)
43 43
         VALUES( #{registryGroup}  , #{registryKey} , #{registryValue}, NOW())
44 44
     </insert>
45 45
 
46 46
 	<delete id="registryDelete" >
47
-		DELETE FROM XXL_JOB_QRTZ_TRIGGER_REGISTRY
47
+		DELETE FROM XXL_JOB_REGISTRY
48 48
 		WHERE registry_group = #{registryGroup}
49 49
 			AND registry_key = #{registryKey}
50 50
 			AND registry_value = #{registryValue}

+ 6 - 6
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobUserMapper.xml Zobrazit soubor

@@ -21,7 +21,7 @@
21 21
 
22 22
 	<select id="pageList" parameterType="java.util.HashMap" resultMap="XxlJobUser">
23 23
 		SELECT <include refid="Base_Column_List" />
24
-		FROM XXL_JOB_QRTZ_USER AS t
24
+		FROM XXL_JOB_USER AS t
25 25
 		<trim prefix="WHERE" prefixOverrides="AND | OR" >
26 26
 			<if test="username != null and username != ''">
27 27
 				AND t.username like CONCAT(CONCAT('%', #{username}), '%')
@@ -36,7 +36,7 @@
36 36
 
37 37
 	<select id="pageListCount" parameterType="java.util.HashMap" resultType="int">
38 38
 		SELECT count(1)
39
-		FROM XXL_JOB_QRTZ_USER AS t
39
+		FROM XXL_JOB_USER AS t
40 40
 		<trim prefix="WHERE" prefixOverrides="AND | OR" >
41 41
 			<if test="username != null and username != ''">
42 42
 				AND t.username like CONCAT(CONCAT('%', #{username}), '%')
@@ -49,12 +49,12 @@
49 49
 
50 50
 	<select id="loadByUserName" parameterType="java.util.HashMap" resultMap="XxlJobUser">
51 51
 		SELECT <include refid="Base_Column_List" />
52
-		FROM XXL_JOB_QRTZ_USER AS t
52
+		FROM XXL_JOB_USER AS t
53 53
 		WHERE t.username = #{username}
54 54
 	</select>
55 55
 
56 56
 	<insert id="save" parameterType="com.xxl.job.admin.core.model.XxlJobUser" useGeneratedKeys="true" keyProperty="id" >
57
-		INSERT INTO XXL_JOB_QRTZ_USER (
57
+		INSERT INTO XXL_JOB_USER (
58 58
 			username,
59 59
 			password,
60 60
 			role,
@@ -68,7 +68,7 @@
68 68
 	</insert>
69 69
 
70 70
 	<update id="update" parameterType="com.xxl.job.admin.core.model.XxlJobUser" >
71
-		UPDATE XXL_JOB_QRTZ_USER
71
+		UPDATE XXL_JOB_USER
72 72
 		SET
73 73
 			<if test="password != null and password != ''">
74 74
 				password = #{password},
@@ -80,7 +80,7 @@
80 80
 
81 81
 	<delete id="delete" parameterType="java.util.HashMap">
82 82
 		DELETE
83
-		FROM XXL_JOB_QRTZ_USER
83
+		FROM XXL_JOB_USER
84 84
 		WHERE id = #{id}
85 85
 	</delete>
86 86
 

+ 0 - 29
xxl-job-admin/src/main/resources/quartz.properties Zobrazit soubor

@@ -1,29 +0,0 @@
1
-# Default Properties file for use by StdSchedulerFactory
2
-# to create a Quartz Scheduler Instance, if a different
3
-# properties file is not explicitly specified.
4
-#
5
-
6
-org.quartz.scheduler.instanceName: DefaultQuartzScheduler
7
-org.quartz.scheduler.instanceId: AUTO
8
-org.quartz.scheduler.rmi.export: false
9
-org.quartz.scheduler.rmi.proxy: false
10
-org.quartz.scheduler.wrapJobExecutionInUserTransaction: false
11
-
12
-#org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
13
-#org.quartz.threadPool.threadCount: 5
14
-#org.quartz.threadPool.threadPriority: 5
15
-#org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true
16
-
17
-org.quartz.jobStore.misfireThreshold: 60000
18
-org.quartz.jobStore.maxMisfiresToHandleAtATime: 1
19
-
20
-#org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore
21
-
22
-# for async trigger
23
-org.quartz.threadPool.class: com.xxl.job.admin.core.quartz.XxlJobThreadPool
24
-
25
-# for cluster
26
-org.quartz.jobStore.tablePrefix: XXL_JOB_QRTZ_
27
-org.quartz.jobStore.class: org.quartz.impl.jdbcjobstore.JobStoreTX
28
-org.quartz.jobStore.isClustered: true
29
-org.quartz.jobStore.clusterCheckinInterval: 5000

+ 8 - 18
xxl-job-admin/src/main/resources/static/js/jobinfo.index.1.js Zobrazit soubor

@@ -83,22 +83,16 @@ $(function() {
83 83
 	                { "data": 'author', "visible" : true, "width":'10%'},
84 84
 	                { "data": 'alarmEmail', "visible" : false},
85 85
 	                { 
86
-	                	"data": 'jobStatus',
86
+	                	"data": 'triggerStatus',
87 87
 						"width":'10%',
88 88
 	                	"visible" : true,
89 89
 	                	"render": function ( data, type, row ) {
90
-
91 90
                             // status
92
-	                		if (data && data != 'NONE') {
93
-                                if ('NORMAL' == data) {
94
-                                    return '<small class="label label-success" ><i class="fa fa-clock-o"></i>RUNNING</small>';
95
-                                } else {
96
-                                    return '<small class="label label-warning" >ERROR('+ data +')</small>';
97
-                                }
98
-							} else {
91
+                            if (1 == data) {
92
+                                return '<small class="label label-success" ><i class="fa fa-clock-o"></i>RUNNING</small>';
93
+                            } else {
99 94
                                 return '<small class="label label-default" ><i class="fa fa-clock-o"></i>STOP</small>';
100
-							}
101
-
95
+                            }
102 96
 	                		return data;
103 97
 	                	}
104 98
 	                },
@@ -109,15 +103,11 @@ $(function() {
109 103
 	                		return function(){
110 104
 	                			// status
111 105
 	                			var start_stop = "";
112
-                                if (row.jobStatus && row.jobStatus != 'NONE') {
113
-                                    if ('NORMAL' == row.jobStatus) {
114
-                                        start_stop = '<button class="btn btn-primary btn-xs job_operate" _type="job_pause" type="button">'+ I18n.jobinfo_opt_stop +'</button>  ';
115
-                                    } else {
116
-                                        start_stop = '<button class="btn btn-primary btn-xs job_operate" _type="job_pause" type="button">'+ I18n.jobinfo_opt_stop +'</button>  ';
117
-                                    }
106
+                                if (1 == row.triggerStatus ) {
107
+                                    start_stop = '<button class="btn btn-primary btn-xs job_operate" _type="job_pause" type="button">'+ I18n.jobinfo_opt_stop +'</button>  ';
118 108
                                 } else {
119 109
                                     start_stop = '<button class="btn btn-primary btn-xs job_operate" _type="job_resume" type="button">'+ I18n.jobinfo_opt_start +'</button>  ';
120
-                                }
110
+								}
121 111
 
122 112
 	                			// log url
123 113
 	                			var logUrl = base_url +'/joblog?jobId='+ row.id;

+ 1 - 1
xxl-job-admin/src/main/resources/templates/jobinfo/jobinfo.index.ftl Zobrazit soubor

@@ -75,7 +75,7 @@
75 75
 					                  	<th name="updateTime" >updateTime</th>
76 76
 					                  	<th name="author" >${I18n.jobinfo_field_author}</th>
77 77
 					                  	<th name="alarmEmail" >${I18n.jobinfo_field_alarmemail}</th>
78
-					                  	<th name="jobStatus" >${I18n.system_status}</th>
78
+					                  	<th name="triggerStatus" >${I18n.system_status}</th>
79 79
 					                  	<th>${I18n.system_opt}</th>
80 80
 					                </tr>
81 81
 				                </thead>