diff --git a/.gitignore b/.gitignore
index 52c1b008..3f3d40be 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,32 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**
+!**/src/test/**
.idea
+### STS ###
+.apt_generated
.classpath
+.factorypath
.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
*.iml
+*.ipr
target/
.DS_Store
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
.gitattributes
+### VS Code ###
+.vscode/
diff --git a/doc/db/tables_xxl_job.sql b/doc/db/tables_xxl_job.sql
index 52e015c4..d438238c 100644
--- a/doc/db/tables_xxl_job.sql
+++ b/doc/db/tables_xxl_job.sql
@@ -8,7 +8,7 @@ use `xxl_job`;
SET NAMES utf8mb4;
CREATE TABLE `xxl_job_info` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
+ `id` bigint(20) NOT NULL
`job_group` int(11) NOT NULL COMMENT '执行器主键ID',
`job_cron` varchar(128) NOT NULL COMMENT '任务执行CRON',
`job_desc` varchar(255) NOT NULL,
@@ -34,7 +34,7 @@ CREATE TABLE `xxl_job_info` (
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `xxl_job_log` (
- `id` bigint(20) NOT NULL AUTO_INCREMENT,
+ `id` bigint(20) NOT NULL
`job_group` int(11) NOT NULL COMMENT '执行器主键ID',
`job_id` int(11) NOT NULL COMMENT '任务,主键ID',
`executor_address` varchar(255) DEFAULT NULL COMMENT '执行器地址,本次执行的地址',
@@ -55,7 +55,7 @@ CREATE TABLE `xxl_job_log` (
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `xxl_job_log_report` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
+ `id` bigint(20) NOT NULL
`trigger_day` datetime DEFAULT NULL COMMENT '调度-时间',
`running_count` int(11) NOT NULL DEFAULT '0' COMMENT '运行中-日志数量',
`suc_count` int(11) NOT NULL DEFAULT '0' COMMENT '执行成功-日志数量',
@@ -65,7 +65,7 @@ CREATE TABLE `xxl_job_log_report` (
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `xxl_job_logglue` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
+ `id` bigint(20) NOT NULL
`job_id` int(11) NOT NULL COMMENT '任务,主键ID',
`glue_type` varchar(50) DEFAULT NULL COMMENT 'GLUE类型',
`glue_source` mediumtext COMMENT 'GLUE源代码',
@@ -76,7 +76,7 @@ CREATE TABLE `xxl_job_logglue` (
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `xxl_job_registry` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
+ `id` bigint(20) NOT NULL
`registry_group` varchar(50) NOT NULL,
`registry_key` varchar(255) NOT NULL,
`registry_value` varchar(255) NOT NULL,
@@ -86,7 +86,7 @@ CREATE TABLE `xxl_job_registry` (
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `xxl_job_group` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
+ `id` bigint(20) NOT NULL
`app_name` varchar(64) NOT NULL COMMENT '执行器AppName',
`title` varchar(12) NOT NULL COMMENT '执行器名称',
`address_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '执行器地址类型:0=自动注册、1=手动录入',
@@ -95,7 +95,7 @@ CREATE TABLE `xxl_job_group` (
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `xxl_job_user` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
+ `id` bigint(20) NOT NULL
`username` varchar(50) NOT NULL COMMENT '账号',
`password` varchar(50) NOT NULL COMMENT '密码',
`role` tinyint(4) NOT NULL COMMENT '角色:0-普通用户、1-管理员',
@@ -109,6 +109,15 @@ CREATE TABLE `xxl_job_lock` (
PRIMARY KEY (`lock_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+CREATE TABLE `xxl_job_machine` (
+ `machine_ip` varchar(22) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主机IP',
+ `machine_id` int(4) NOT NULL COMMENT '主机IP对应的机器码',
+ `add_time` datetime NOT NULL COMMENT '创建时间',
+ `heart_last_time` datetime NOT NULL COMMENT '最后一次心跳时间',
+ PRIMARY KEY (`machine_ip`) USING BTREE,
+ UNIQUE INDEX `index_machine_id`(`machine_id`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
INSERT INTO `xxl_job_group`(`id`, `app_name`, `title`, `address_type`, `address_list`) VALUES (1, 'xxl-job-executor-sample', '示例执行器', 0, NULL);
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', '');
diff --git a/doc/db/tables_xxl_job_oracle.sql b/doc/db/tables_xxl_job_oracle.sql
new file mode 100644
index 00000000..8c13a44d
--- /dev/null
+++ b/doc/db/tables_xxl_job_oracle.sql
@@ -0,0 +1,296 @@
+/*
+ Target Server Type : Oracle
+ Date: 29/06/2020 10:24:23
+*/
+
+-- ----------------------------
+-- Table structure for XXL_JOB_GROUP
+-- ----------------------------
+DROP TABLE XXL_JOB_GROUP;
+CREATE TABLE XXL_JOB_GROUP (
+ ID NUMBER(20) NOT NULL ,
+ APP_NAME NVARCHAR2(64) NOT NULL ,
+ TITLE NVARCHAR2(12) NOT NULL ,
+ ADDRESS_TYPE NUMBER(4) NOT NULL ,
+ ADDRESS_LIST NVARCHAR2(512)
+);
+COMMENT ON COLUMN XXL_JOB_GROUP.APP_NAME IS '执行器AppName';
+COMMENT ON COLUMN XXL_JOB_GROUP.TITLE IS '执行器名称';
+COMMENT ON COLUMN XXL_JOB_GROUP.ADDRESS_TYPE IS '执行器地址类型:0=自动注册、1=手动录入';
+COMMENT ON COLUMN XXL_JOB_GROUP.ADDRESS_LIST IS '执行器地址列表,多地址逗号分隔';
+
+-- ----------------------------
+-- Records of XXL_JOB_GROUP
+-- ----------------------------
+INSERT INTO XXL_JOB_GROUP VALUES ('1', 'xxl-job-executor-sample', '示例执行器', '0', NULL);
+
+-- ----------------------------
+-- Primary Key structure for table XXL_JOB_GROUP
+-- ----------------------------
+ALTER TABLE XXL_JOB_GROUP ADD CONSTRAINT SYS_C0026588 PRIMARY KEY (ID);
+
+
+-- ----------------------------
+-- Table structure for XXL_JOB_INFO
+-- ----------------------------
+DROP TABLE XXL_JOB_INFO;
+CREATE TABLE XXL_JOB_INFO (
+ ID NUMBER(20) NOT NULL ,
+ JOB_GROUP NUMBER(11) NOT NULL ,
+ JOB_CRON NVARCHAR2(128) NOT NULL ,
+ JOB_DESC NVARCHAR2(255) NOT NULL ,
+ ADD_TIME DATE ,
+ UPDATE_TIME DATE ,
+ AUTHOR NVARCHAR2(64) ,
+ ALARM_EMAIL NVARCHAR2(255) ,
+ EXECUTOR_ROUTE_STRATEGY NVARCHAR2(50) ,
+ EXECUTOR_HANDLER NVARCHAR2(255) ,
+ EXECUTOR_PARAM NVARCHAR2(512) ,
+ EXECUTOR_BLOCK_STRATEGY NVARCHAR2(50) ,
+ EXECUTOR_TIMEOUT NUMBER(11) NOT NULL ,
+ EXECUTOR_FAIL_RETRY_COUNT NUMBER(11) NOT NULL ,
+ GLUE_TYPE NVARCHAR2(50) NOT NULL ,
+ GLUE_SOURCE NCLOB ,
+ GLUE_REMARK NVARCHAR2(128) ,
+ GLUE_UPDATETIME DATE ,
+ CHILD_JOBID NVARCHAR2(255) ,
+ TRIGGER_STATUS NUMBER(4) NOT NULL ,
+ TRIGGER_LAST_TIME NUMBER(20) NOT NULL ,
+ TRIGGER_NEXT_TIME NUMBER(20) NOT NULL
+);
+COMMENT ON COLUMN XXL_JOB_INFO.JOB_GROUP IS '执行器主键ID';
+COMMENT ON COLUMN XXL_JOB_INFO.JOB_CRON IS '任务执行CRON';
+COMMENT ON COLUMN XXL_JOB_INFO.AUTHOR IS '作者';
+COMMENT ON COLUMN XXL_JOB_INFO.ALARM_EMAIL IS '报警邮件';
+COMMENT ON COLUMN XXL_JOB_INFO.EXECUTOR_ROUTE_STRATEGY IS '执行器路由策略';
+COMMENT ON COLUMN XXL_JOB_INFO.EXECUTOR_HANDLER IS '执行器任务handler';
+COMMENT ON COLUMN XXL_JOB_INFO.EXECUTOR_PARAM IS '执行器任务参数';
+COMMENT ON COLUMN XXL_JOB_INFO.EXECUTOR_BLOCK_STRATEGY IS '阻塞处理策略';
+COMMENT ON COLUMN XXL_JOB_INFO.EXECUTOR_TIMEOUT IS '任务执行超时时间,单位秒';
+COMMENT ON COLUMN XXL_JOB_INFO.EXECUTOR_FAIL_RETRY_COUNT IS '失败重试次数';
+COMMENT ON COLUMN XXL_JOB_INFO.GLUE_TYPE IS 'GLUE类型';
+COMMENT ON COLUMN XXL_JOB_INFO.GLUE_SOURCE IS 'GLUE源代码';
+COMMENT ON COLUMN XXL_JOB_INFO.GLUE_REMARK IS 'GLUE备注';
+COMMENT ON COLUMN XXL_JOB_INFO.GLUE_UPDATETIME IS 'GLUE更新时间';
+COMMENT ON COLUMN XXL_JOB_INFO.CHILD_JOBID IS '子任务ID,多个逗号分隔';
+COMMENT ON COLUMN XXL_JOB_INFO.TRIGGER_STATUS IS '调度状态:0-停止,1-运行';
+COMMENT ON COLUMN XXL_JOB_INFO.TRIGGER_LAST_TIME IS '上次调度时间';
+COMMENT ON COLUMN XXL_JOB_INFO.TRIGGER_NEXT_TIME IS '下次调度时间';
+
+-- ----------------------------
+-- Records of XXL_JOB_INFO
+-- ----------------------------
+INSERT INTO XXL_JOB_INFO VALUES ('1', '1', '0 0 0 * * ? *', '测试任务1', TO_DATE('2018-11-03 22:21:31', 'SYYYY-MM-DD HH24:MI:SS'), TO_DATE('2018-11-03 22:21:31', 'SYYYY-MM-DD HH24:MI:SS'), 'XXL', NULL, 'FIRST', 'demoJobHandler', NULL, 'SERIAL_EXECUTION', '0', '0', 'BEAN', NULL, 'GLUE代码初始化', TO_DATE('2018-11-03 22:21:31', 'SYYYY-MM-DD HH24:MI:SS'), NULL, '0', '0', '0');
+
+-- ----------------------------
+-- Primary Key structure for table XXL_JOB_INFO
+-- ----------------------------
+ALTER TABLE XXL_JOB_INFO ADD CONSTRAINT SYS_C0026589 PRIMARY KEY (ID);
+
+
+-- ----------------------------
+-- Table structure for XXL_JOB_LOCK
+-- ----------------------------
+DROP TABLE XXL_JOB_LOCK;
+CREATE TABLE XXL_JOB_LOCK (
+ LOCK_NAME NVARCHAR2(50) NOT NULL
+);
+COMMENT ON COLUMN XXL_JOB_LOCK.LOCK_NAME IS '锁名称';
+
+-- ----------------------------
+-- Records of XXL_JOB_LOCK
+-- ----------------------------
+INSERT INTO XXL_JOB_LOCK VALUES ('schedule_lock');
+
+
+-- ----------------------------
+-- Table structure for XXL_JOB_LOG
+-- ----------------------------
+DROP TABLE XXL_JOB_LOG;
+CREATE TABLE XXL_JOB_LOG (
+ ID NUMBER(20) NOT NULL ,
+ JOB_GROUP NUMBER(11) NOT NULL ,
+ JOB_ID NUMBER(11) NOT NULL ,
+ EXECUTOR_ADDRESS NVARCHAR2(255) ,
+ EXECUTOR_HANDLER NVARCHAR2(255) ,
+ EXECUTOR_PARAM NVARCHAR2(512) ,
+ EXECUTOR_SHARDING_PARAM NVARCHAR2(20) ,
+ EXECUTOR_FAIL_RETRY_COUNT NUMBER(11) NOT NULL ,
+ TRIGGER_TIME DATE ,
+ TRIGGER_CODE NUMBER(11) NOT NULL ,
+ TRIGGER_MSG NCLOB ,
+ HANDLE_TIME DATE ,
+ HANDLE_CODE NUMBER(11) NOT NULL ,
+ HANDLE_MSG NCLOB ,
+ ALARM_STATUS NUMBER(4) NOT NULL
+);
+COMMENT ON COLUMN XXL_JOB_LOG.JOB_GROUP IS '执行器主键ID';
+COMMENT ON COLUMN XXL_JOB_LOG.JOB_ID IS '任务,主键ID';
+COMMENT ON COLUMN XXL_JOB_LOG.EXECUTOR_ADDRESS IS '执行器地址,本次执行的地址';
+COMMENT ON COLUMN XXL_JOB_LOG.EXECUTOR_HANDLER IS '执行器任务handler';
+COMMENT ON COLUMN XXL_JOB_LOG.EXECUTOR_PARAM IS '执行器任务参数';
+COMMENT ON COLUMN XXL_JOB_LOG.EXECUTOR_SHARDING_PARAM IS '执行器任务分片参数,格式如 1/2';
+COMMENT ON COLUMN XXL_JOB_LOG.EXECUTOR_FAIL_RETRY_COUNT IS '失败重试次数';
+COMMENT ON COLUMN XXL_JOB_LOG.TRIGGER_TIME IS '调度-时间';
+COMMENT ON COLUMN XXL_JOB_LOG.TRIGGER_CODE IS '调度-结果';
+COMMENT ON COLUMN XXL_JOB_LOG.TRIGGER_MSG IS '调度-日志';
+COMMENT ON COLUMN XXL_JOB_LOG.HANDLE_TIME IS '执行-时间';
+COMMENT ON COLUMN XXL_JOB_LOG.HANDLE_CODE IS '执行-状态';
+COMMENT ON COLUMN XXL_JOB_LOG.HANDLE_MSG IS '执行-日志';
+COMMENT ON COLUMN XXL_JOB_LOG.ALARM_STATUS IS '告警状态:0-默认、1-无需告警、2-告警成功、3-告警失败';
+
+-- ----------------------------
+-- Primary Key structure for table XXL_JOB_LOG
+-- ----------------------------
+ALTER TABLE XXL_JOB_LOG ADD CONSTRAINT SYS_C0026591 PRIMARY KEY (ID);
+
+-- ----------------------------
+-- Indexes structure for table XXL_JOB_LOG
+-- ----------------------------
+CREATE INDEX I_HANDLE_CODE
+ ON XXL_JOB_LOG (HANDLE_CODE ASC);
+CREATE INDEX I_TRIGGER_TIME
+ ON XXL_JOB_LOG (TRIGGER_TIME ASC);
+
+-- ----------------------------
+-- Table structure for XXL_JOB_LOG_REPORT
+-- ----------------------------
+DROP TABLE XXL_JOB_LOG_REPORT;
+CREATE TABLE XXL_JOB_LOG_REPORT (
+ ID NUMBER(20) NOT NULL ,
+ TRIGGER_DAY DATE ,
+ RUNNING_COUNT NUMBER(11) NOT NULL ,
+ SUC_COUNT NUMBER(11) NOT NULL ,
+ FAIL_COUNT NUMBER(11) NOT NULL
+);
+COMMENT ON COLUMN XXL_JOB_LOG_REPORT.TRIGGER_DAY IS '调度-时间';
+COMMENT ON COLUMN XXL_JOB_LOG_REPORT.RUNNING_COUNT IS '运行中-日志数量';
+COMMENT ON COLUMN XXL_JOB_LOG_REPORT.SUC_COUNT IS '执行成功-日志数量';
+COMMENT ON COLUMN XXL_JOB_LOG_REPORT.FAIL_COUNT IS '执行失败-日志数量';
+
+-- ----------------------------
+-- Primary Key structure for table XXL_JOB_LOG_REPORT
+-- ----------------------------
+ALTER TABLE XXL_JOB_LOG_REPORT ADD CONSTRAINT SYS_C0026592 PRIMARY KEY (ID);
+
+-- ----------------------------
+-- Indexes structure for table XXL_JOB_LOG_REPORT
+-- ----------------------------
+CREATE UNIQUE INDEX I_TRIGGER_DAY
+ ON XXL_JOB_LOG_REPORT (TRIGGER_DAY ASC);
+
+
+-- ----------------------------
+-- Table structure for XXL_JOB_LOGGLUE
+-- ----------------------------
+DROP TABLE XXL_JOB_LOGGLUE;
+CREATE TABLE XXL_JOB_LOGGLUE (
+ ID NUMBER(20) NOT NULL ,
+ JOB_ID NUMBER(20) NOT NULL ,
+ GLUE_TYPE NVARCHAR2(50) ,
+ GLUE_SOURCE NCLOB ,
+ GLUE_REMARK NVARCHAR2(128) NOT NULL ,
+ ADD_TIME DATE ,
+ UPDATE_TIME DATE
+);
+COMMENT ON COLUMN XXL_JOB_LOGGLUE.JOB_ID IS '任务,主键ID';
+COMMENT ON COLUMN XXL_JOB_LOGGLUE.GLUE_TYPE IS 'GLUE类型';
+COMMENT ON COLUMN XXL_JOB_LOGGLUE.GLUE_SOURCE IS 'GLUE源代码';
+COMMENT ON COLUMN XXL_JOB_LOGGLUE.GLUE_REMARK IS 'GLUE备注';
+
+-- ----------------------------
+-- Primary Key structure for table XXL_JOB_LOGGLUE
+-- ----------------------------
+ALTER TABLE XXL_JOB_LOGGLUE ADD CONSTRAINT SYS_C0026593 PRIMARY KEY (ID);
+
+
+
+-- ----------------------------
+-- Table structure for XXL_JOB_REGISTRY
+-- ----------------------------
+DROP TABLE XXL_JOB_REGISTRY;
+CREATE TABLE XXL_JOB_REGISTRY (
+ ID NUMBER(20) NOT NULL ,
+ REGISTRY_GROUP NVARCHAR2(50) NOT NULL ,
+ REGISTRY_KEY NVARCHAR2(255) NOT NULL ,
+ REGISTRY_VALUE NVARCHAR2(255) NOT NULL ,
+ UPDATE_TIME DATE
+);
+
+-- ----------------------------
+-- Primary Key structure for table XXL_JOB_REGISTRY
+-- ----------------------------
+ALTER TABLE XXL_JOB_REGISTRY ADD CONSTRAINT SYS_C0026594 PRIMARY KEY (ID);
+
+-- ----------------------------
+-- Indexes structure for table XXL_JOB_REGISTRY
+-- ----------------------------
+CREATE INDEX I_G_K_V
+ ON XXL_JOB_REGISTRY (REGISTRY_GROUP ASC, REGISTRY_VALUE ASC, REGISTRY_KEY ASC);
+
+
+
+-- ----------------------------
+-- Table structure for XXL_JOB_USER
+-- ----------------------------
+DROP TABLE XXL_JOB_USER;
+CREATE TABLE XXL_JOB_USER (
+ ID NUMBER(20) NOT NULL ,
+ USERNAME NVARCHAR2(50) NOT NULL ,
+ PASSWORD NVARCHAR2(50) NOT NULL ,
+ ROLE NUMBER(4) NOT NULL ,
+ PERMISSION NVARCHAR2(255)
+);
+COMMENT ON COLUMN XXL_JOB_USER.USERNAME IS '账号';
+COMMENT ON COLUMN XXL_JOB_USER.PASSWORD IS '密码';
+COMMENT ON COLUMN XXL_JOB_USER.ROLE IS '角色:0-普通用户、1-管理员';
+COMMENT ON COLUMN XXL_JOB_USER.PERMISSION IS '权限:执行器ID列表,多个逗号分割';
+
+-- ----------------------------
+-- Records of XXL_JOB_USER
+-- ----------------------------
+INSERT INTO XXL_JOB_USER VALUES ('1', 'admin', 'e10adc3949ba59abbe56e057f20f883e', '1', NULL);
+
+-- ----------------------------
+-- Primary Key structure for table XXL_JOB_USER
+-- ----------------------------
+ALTER TABLE XXL_JOB_USER ADD CONSTRAINT SYS_C0026595 PRIMARY KEY (ID);
+
+-- ----------------------------
+-- Indexes structure for table XXL_JOB_USER
+-- ----------------------------
+CREATE UNIQUE INDEX I_USERNAME
+ ON XXL_JOB_USER (USERNAME ASC);
+
+
+
+-- ----------------------------
+-- Table structure for XXL_JOB_MACHINE
+-- ----------------------------
+DROP TABLE XXL_JOB_MACHINE;
+CREATE TABLE XXL_JOB_MACHINE (
+ MACHINE_IP NVARCHAR2(22) NOT NULL ,
+ MACHINE_ID NUMBER(4) NOT NULL ,
+ ADD_TIME DATE NOT NULL ,
+ HEART_LAST_TIME DATE NOT NULL
+);
+COMMENT ON COLUMN XXL_JOB_MACHINE.MACHINE_IP IS '主机IP';
+COMMENT ON COLUMN XXL_JOB_MACHINE.MACHINE_ID IS '主机IP对应的机器码';
+COMMENT ON COLUMN XXL_JOB_MACHINE.ADD_TIME IS '创建时间';
+COMMENT ON COLUMN XXL_JOB_MACHINE.HEART_LAST_TIME IS '最后一次心跳时间';
+
+-- ----------------------------
+-- Primary Key structure for table XXL_JOB_MACHINE
+-- ----------------------------
+ALTER TABLE XXL_JOB_MACHINE ADD CONSTRAINT SYS_C0026684 PRIMARY KEY (MACHINE_IP);
+
+CREATE UNIQUE INDEX I_MACHINE_ID
+ ON XXL_JOB_MACHINE (MACHINE_ID ASC);
+
+-- ----------------------------
+-- Checks structure for table XXL_JOB_MACHINE
+-- ----------------------------
+ALTER TABLE XXL_JOB_MACHINE ADD CONSTRAINT SYS_C0026680 CHECK (MACHINE_IP IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE;
+ALTER TABLE XXL_JOB_MACHINE ADD CONSTRAINT SYS_C0026681 CHECK (MACHINE_ID IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE;
+ALTER TABLE XXL_JOB_MACHINE ADD CONSTRAINT SYS_C0026682 CHECK (ADD_TIME IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE;
+ALTER TABLE XXL_JOB_MACHINE ADD CONSTRAINT SYS_C0026683 CHECK (HEART_LAST_TIME IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE;
diff --git a/pom.xml b/pom.xml
index 565a93c4..f433df46 100644
--- a/pom.xml
+++ b/pom.xml
@@ -32,6 +32,7 @@
2.1.2
8.0.19
+ 1.2.12
1.7.30
4.13
diff --git a/xxl-job-admin/pom.xml b/xxl-job-admin/pom.xml
index f1646528..840110ac 100644
--- a/xxl-job-admin/pom.xml
+++ b/xxl-job-admin/pom.xml
@@ -66,6 +66,13 @@
${mysql-connector-java.version}
+
+
+ com.oracle
+ ojdbc7
+ 12.1.0.2
+
+
com.xuxueli
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java
index aa51e739..2b5cbad7 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java
@@ -1,22 +1,26 @@
package com.xxl.job.admin.controller;
+import java.util.List;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
import com.xxl.job.admin.controller.annotation.PermissionLimit;
import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
+import com.xxl.job.admin.core.model.XxlJobInfo;
+import com.xxl.job.admin.service.XxlJobService;
import com.xxl.job.core.biz.AdminBiz;
import com.xxl.job.core.biz.model.HandleCallbackParam;
import com.xxl.job.core.biz.model.RegistryParam;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.util.GsonTool;
import com.xxl.job.core.util.XxlJobRemotingUtil;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletRequest;
-import java.util.List;
/**
* Created by xuxueli on 17/5/10.
@@ -28,6 +32,9 @@ public class JobApiController {
@Resource
private AdminBiz adminBiz;
+ @Resource
+ private XxlJobService xxlJobService;
+
/**
* api
*
@@ -63,6 +70,12 @@ public class JobApiController {
} else if ("registryRemove".equals(uri)) {
RegistryParam registryParam = GsonTool.fromJson(data, RegistryParam.class);
return adminBiz.registryRemove(registryParam);
+ } else if ("jobInfoAdd".equals(uri)) {
+ XxlJobInfo jobInfo = GsonTool.fromJson(data, XxlJobInfo.class);
+ return xxlJobService.add(jobInfo);
+ } else if ("jobInfoRemove".equals(uri)) {
+ XxlJobInfo jobInfo = GsonTool.fromJson(data, XxlJobInfo.class);
+ return xxlJobService.remove(jobInfo.getId());
} else {
return new ReturnT(ReturnT.FAIL_CODE, "invalid request, uri-mapping("+ uri +") not found.");
}
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java
index 302b9bf9..29cfb9ae 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java
@@ -1,5 +1,7 @@
package com.xxl.job.admin.controller;
+import com.github.pagehelper.PageHelper;
+import com.xxl.job.admin.core.id.GenerateId;
import com.xxl.job.admin.core.model.XxlJobInfo;
import com.xxl.job.admin.core.model.XxlJobLogGlue;
import com.xxl.job.admin.core.util.I18nUtil;
@@ -30,8 +32,11 @@ public class JobCodeController {
@Resource
private XxlJobLogGlueDao xxlJobLogGlueDao;
+ @Resource
+ private GenerateId generateId;
+
@RequestMapping
- public String index(HttpServletRequest request, Model model, int jobId) {
+ public String index(HttpServletRequest request, Model model, long jobId) {
XxlJobInfo jobInfo = xxlJobInfoDao.loadById(jobId);
List jobLogGlues = xxlJobLogGlueDao.findByJobId(jobId);
@@ -55,7 +60,7 @@ public class JobCodeController {
@RequestMapping("/save")
@ResponseBody
- public ReturnT save(Model model, int id, String glueSource, String glueRemark) {
+ public ReturnT save(Model model, long id, String glueSource, String glueRemark) {
// valid
if (glueRemark==null) {
return new ReturnT(500, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobinfo_glue_remark")) );
@@ -85,10 +90,13 @@ public class JobCodeController {
xxlJobLogGlue.setAddTime(new Date());
xxlJobLogGlue.setUpdateTime(new Date());
+ xxlJobLogGlue.setId(generateId.getId());
xxlJobLogGlueDao.save(xxlJobLogGlue);
// remove code backup more than 30
- xxlJobLogGlueDao.removeOld(exists_jobInfo.getId(), 30);
+ PageHelper.startPage(1,30);
+ List ids = xxlJobLogGlueDao.findIds(exists_jobInfo.getId());
+ xxlJobLogGlueDao.removeOld(exists_jobInfo.getId(), ids);
return ReturnT.SUCCESS;
}
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java
index f1d1168a..1f390064 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java
@@ -1,5 +1,7 @@
package com.xxl.job.admin.controller;
+import com.github.pagehelper.PageHelper;
+import com.xxl.job.admin.core.id.GenerateId;
import com.xxl.job.admin.core.model.XxlJobGroup;
import com.xxl.job.admin.core.model.XxlJobRegistry;
import com.xxl.job.admin.core.util.I18nUtil;
@@ -8,6 +10,7 @@ import com.xxl.job.admin.dao.XxlJobInfoDao;
import com.xxl.job.admin.dao.XxlJobRegistryDao;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.enums.RegistryConfig;
+import com.xxl.job.core.util.DateUtil;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -32,6 +35,8 @@ public class JobGroupController {
public XxlJobGroupDao xxlJobGroupDao;
@Resource
private XxlJobRegistryDao xxlJobRegistryDao;
+ @Resource
+ private GenerateId generateId;
@RequestMapping
public String index(Model model) {
@@ -45,9 +50,10 @@ public class JobGroupController {
@RequestParam(required = false, defaultValue = "10") int length,
String appname, String title) {
+ PageHelper.startPage(start/length+1,length);
// page query
- List list = xxlJobGroupDao.pageList(start, length, appname, title);
- int list_count = xxlJobGroupDao.pageListCount(start, length, appname, title);
+ List list = xxlJobGroupDao.pageList(appname, title);
+ int list_count = xxlJobGroupDao.pageListCount(appname, title);
// package result
Map maps = new HashMap();
@@ -82,7 +88,7 @@ public class JobGroupController {
}
}
}
-
+ xxlJobGroup.setId(generateId.getId());
int ret = xxlJobGroupDao.save(xxlJobGroup);
return (ret>0)?ReturnT.SUCCESS:ReturnT.FAIL;
}
@@ -132,7 +138,8 @@ public class JobGroupController {
private List findRegistryByAppName(String appnameParam){
HashMap> appAddressMap = new HashMap>();
- List list = xxlJobRegistryDao.findAll(RegistryConfig.DEAD_TIMEOUT, new Date());
+ Date date = DateUtil.addSecond(new Date(), -RegistryConfig.DEAD_TIMEOUT);
+ List list = xxlJobRegistryDao.findAll(date);
if (list != null) {
for (XxlJobRegistry item: list) {
if (RegistryConfig.RegistType.EXECUTOR.name().equals(item.getRegistryGroup())) {
@@ -154,10 +161,11 @@ public class JobGroupController {
@RequestMapping("/remove")
@ResponseBody
- public ReturnT remove(int id){
+ public ReturnT remove(long id){
// valid
- int count = xxlJobInfoDao.pageListCount(0, 10, id, -1, null, null, null);
+ PageHelper.startPage(1,10);
+ int count = xxlJobInfoDao.pageListCount(id, -1, null, null, null);
if (count > 0) {
return new ReturnT(500, I18nUtil.getString("jobgroup_del_limit_0") );
}
@@ -173,7 +181,7 @@ public class JobGroupController {
@RequestMapping("/loadById")
@ResponseBody
- public ReturnT loadById(int id){
+ public ReturnT loadById(long id){
XxlJobGroup jobGroup = xxlJobGroupDao.load(id);
return jobGroup!=null?new ReturnT(jobGroup):new ReturnT(ReturnT.FAIL_CODE, null);
}
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java
index 3cf8029a..74beb454 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java
@@ -41,7 +41,7 @@ public class JobInfoController {
private XxlJobService xxlJobService;
@RequestMapping
- public String index(HttpServletRequest request, Model model, @RequestParam(required = false, defaultValue = "-1") int jobGroup) {
+ public String index(HttpServletRequest request, Model model, @RequestParam(required = false, defaultValue = "-1") long jobGroup) {
// 枚举-字典
model.addAttribute("ExecutorRouteStrategyEnum", ExecutorRouteStrategyEnum.values()); // 路由策略-列表
@@ -83,7 +83,7 @@ public class JobInfoController {
}
return jobGroupList;
}
- public static void validPermission(HttpServletRequest request, int jobGroup) {
+ public static void validPermission(HttpServletRequest request, long jobGroup) {
XxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY);
if (!loginUser.validPermission(jobGroup)) {
throw new RuntimeException(I18nUtil.getString("system_permission_limit") + "[username="+ loginUser.getUsername() +"]");
@@ -94,7 +94,7 @@ public class JobInfoController {
@ResponseBody
public Map pageList(@RequestParam(required = false, defaultValue = "0") int start,
@RequestParam(required = false, defaultValue = "10") int length,
- int jobGroup, int triggerStatus, String jobDesc, String executorHandler, String author) {
+ long jobGroup, int triggerStatus, String jobDesc, String executorHandler, String author) {
return xxlJobService.pageList(start, length, jobGroup, triggerStatus, jobDesc, executorHandler, author);
}
@@ -113,26 +113,26 @@ public class JobInfoController {
@RequestMapping("/remove")
@ResponseBody
- public ReturnT remove(int id) {
+ public ReturnT remove(long id) {
return xxlJobService.remove(id);
}
@RequestMapping("/stop")
@ResponseBody
- public ReturnT pause(int id) {
+ public ReturnT pause(long id) {
return xxlJobService.stop(id);
}
@RequestMapping("/start")
@ResponseBody
- public ReturnT start(int id) {
+ public ReturnT start(long id) {
return xxlJobService.start(id);
}
@RequestMapping("/trigger")
@ResponseBody
//@PermissionLimit(limit = false)
- public ReturnT triggerJob(int id, String executorParam, String addressList) {
+ public ReturnT triggerJob(long id, String executorParam, String addressList) {
// force cover job param
if (executorParam == null) {
executorParam = "";
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java
index 70e62ae8..735e851d 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java
@@ -1,5 +1,6 @@
package com.xxl.job.admin.controller;
+import com.github.pagehelper.PageHelper;
import com.xxl.job.admin.core.exception.XxlJobException;
import com.xxl.job.admin.core.model.XxlJobGroup;
import com.xxl.job.admin.core.model.XxlJobInfo;
@@ -47,7 +48,7 @@ public class JobLogController {
public XxlJobLogDao xxlJobLogDao;
@RequestMapping
- public String index(HttpServletRequest request, Model model, @RequestParam(required = false, defaultValue = "0") Integer jobId) {
+ public String index(HttpServletRequest request, Model model, @RequestParam(required = false, defaultValue = "0") Long jobId) {
// 执行器列表
List jobGroupList_all = xxlJobGroupDao.findAll();
@@ -78,7 +79,7 @@ public class JobLogController {
@RequestMapping("/getJobsByGroup")
@ResponseBody
- public ReturnT> getJobsByGroup(int jobGroup){
+ public ReturnT> getJobsByGroup(long jobGroup){
List list = xxlJobInfoDao.getJobsByGroup(jobGroup);
return new ReturnT>(list);
}
@@ -88,7 +89,7 @@ public class JobLogController {
public Map pageList(HttpServletRequest request,
@RequestParam(required = false, defaultValue = "0") int start,
@RequestParam(required = false, defaultValue = "10") int length,
- int jobGroup, int jobId, int logStatus, String filterTime) {
+ long jobGroup, long jobId, int logStatus, String filterTime) {
// valid permission
JobInfoController.validPermission(request, jobGroup); // 仅管理员支持查询全部;普通用户仅支持查询有权限的 jobGroup
@@ -105,8 +106,9 @@ public class JobLogController {
}
// page query
- List list = xxlJobLogDao.pageList(start, length, jobGroup, jobId, triggerTimeStart, triggerTimeEnd, logStatus);
- int list_count = xxlJobLogDao.pageListCount(start, length, jobGroup, jobId, triggerTimeStart, triggerTimeEnd, logStatus);
+ PageHelper.startPage(start/length+1,length);
+ List list = xxlJobLogDao.pageList(jobGroup, jobId, triggerTimeStart, triggerTimeEnd, logStatus);
+ int list_count = xxlJobLogDao.pageListCount(jobGroup, jobId, triggerTimeStart, triggerTimeEnd, logStatus);
// package result
Map maps = new HashMap();
@@ -117,7 +119,7 @@ public class JobLogController {
}
@RequestMapping("/logDetailPage")
- public String logDetailPage(int id, Model model){
+ public String logDetailPage(long id, Model model){
// base check
ReturnT logStatue = ReturnT.SUCCESS;
@@ -158,7 +160,7 @@ public class JobLogController {
@RequestMapping("/logKill")
@ResponseBody
- public ReturnT logKill(int id){
+ public ReturnT logKill(long id){
// base check
XxlJobLog log = xxlJobLogDao.load(id);
XxlJobInfo jobInfo = xxlJobInfoDao.loadById(log.getJobId());
@@ -192,7 +194,7 @@ public class JobLogController {
@RequestMapping("/clearLog")
@ResponseBody
- public ReturnT clearLog(int jobGroup, int jobId, int type){
+ public ReturnT clearLog(long jobGroup, long jobId, int type){
Date clearBeforeTime = null;
int clearBeforeNum = 0;
@@ -214,13 +216,20 @@ public class JobLogController {
clearBeforeNum = 100000; // 清理十万条以前日志数据
} else if (type == 9) {
clearBeforeNum = 0; // 清理所有日志数据
+
} else {
return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("joblog_clean_type_unvalid"));
}
List logIds = null;
+ List recentLogIds = null;
do {
- logIds = xxlJobLogDao.findClearLogIds(jobGroup, jobId, clearBeforeTime, clearBeforeNum, 1000);
+ if(clearBeforeNum > 0){
+ PageHelper.startPage(1,clearBeforeNum);
+ recentLogIds = xxlJobLogDao.findRecentLogs(jobGroup,jobId);
+ }
+ PageHelper.startPage(1,1000);
+ logIds = xxlJobLogDao.findClearLogIds(jobGroup, jobId, clearBeforeTime,recentLogIds);
if (logIds!=null && logIds.size()>0) {
xxlJobLogDao.clearLog(logIds);
}
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/UserController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/UserController.java
index 573ffccf..388ff5e7 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/UserController.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/UserController.java
@@ -1,10 +1,14 @@
package com.xxl.job.admin.controller;
+import com.github.pagehelper.PageHelper;
import com.xxl.job.admin.controller.annotation.PermissionLimit;
+import com.xxl.job.admin.core.id.GenerateId;
import com.xxl.job.admin.core.model.XxlJobGroup;
+import com.xxl.job.admin.core.model.XxlJobLogGlue;
import com.xxl.job.admin.core.model.XxlJobUser;
import com.xxl.job.admin.core.util.I18nUtil;
import com.xxl.job.admin.dao.XxlJobGroupDao;
+import com.xxl.job.admin.dao.XxlJobLogGlueDao;
import com.xxl.job.admin.dao.XxlJobUserDao;
import com.xxl.job.admin.service.LoginService;
import com.xxl.job.core.biz.model.ReturnT;
@@ -18,6 +22,7 @@ import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -33,6 +38,10 @@ public class UserController {
private XxlJobUserDao xxlJobUserDao;
@Resource
private XxlJobGroupDao xxlJobGroupDao;
+ @Resource
+ private GenerateId generateId;
+ @Resource
+ private XxlJobLogGlueDao xxlJobLogGlueDao;
@RequestMapping
@PermissionLimit(adminuser = true)
@@ -52,9 +61,11 @@ public class UserController {
@RequestParam(required = false, defaultValue = "10") int length,
String username, int role) {
+ PageHelper.startPage(start/length+1,length);
// page list
- List list = xxlJobUserDao.pageList(start, length, username, role);
- int list_count = xxlJobUserDao.pageListCount(start, length, username, role);
+ List list = xxlJobUserDao.pageList(username, role);
+
+ int list_count = xxlJobUserDao.pageListCount(username, role);
// package result
Map maps = new HashMap();
@@ -94,6 +105,8 @@ public class UserController {
return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("user_username_repeat") );
}
+ xxlJobUser.setId(generateId.getId());
+
// write
xxlJobUserDao.save(xxlJobUser);
return ReturnT.SUCCESS;
@@ -130,7 +143,7 @@ public class UserController {
@RequestMapping("/remove")
@ResponseBody
@PermissionLimit(adminuser = true)
- public ReturnT remove(HttpServletRequest request, int id) {
+ public ReturnT remove(HttpServletRequest request, long id) {
// avoid opt login seft
XxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY);
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/impl/EmailJobAlarm.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/impl/EmailJobAlarm.java
index fe16fbdf..08836e91 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/impl/EmailJobAlarm.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/impl/EmailJobAlarm.java
@@ -48,7 +48,7 @@ public class EmailJobAlarm implements JobAlarm {
}
// email info
- XxlJobGroup group = XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().load(Integer.valueOf(info.getJobGroup()));
+ XxlJobGroup group = XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().load(info.getJobGroup());
String personal = I18nUtil.getString("admin_name_full");
String title = I18nUtil.getString("jobconf_monitor");
String content = MessageFormat.format(loadEmailJobAlarmTemplate(),
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/JacksonConfigurer.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/JacksonConfigurer.java
new file mode 100644
index 00000000..9e6248b1
--- /dev/null
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/JacksonConfigurer.java
@@ -0,0 +1,27 @@
+package com.xxl.job.admin.core.conf;
+
+import java.math.BigDecimal;
+
+import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+
+/**
+ * Json配置类,Long和BigDecimal过时,前端js会出现丢失精度问题
+ *
+ * @author 单红宇
+ *
+ */
+@Configuration
+public class JacksonConfigurer {
+
+ @Bean
+ public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
+ return builder -> {
+ builder.serializerByType(BigDecimal.class, ToStringSerializer.instance);
+ builder.serializerByType(Long.TYPE, ToStringSerializer.instance);
+ };
+ }
+}
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java
index 1b0405ac..ddf8eae4 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java
@@ -1,6 +1,7 @@
package com.xxl.job.admin.core.conf;
import com.xxl.job.admin.core.alarm.JobAlarmer;
+import com.xxl.job.admin.core.id.GenerateId;
import com.xxl.job.admin.core.scheduler.XxlJobScheduler;
import com.xxl.job.admin.dao.*;
import org.springframework.beans.factory.DisposableBean;
@@ -85,6 +86,8 @@ public class XxlJobAdminConfig implements InitializingBean, DisposableBean {
private DataSource dataSource;
@Resource
private JobAlarmer jobAlarmer;
+ @Resource
+ private GenerateId generateId;
public String getI18n() {
@@ -155,4 +158,7 @@ public class XxlJobAdminConfig implements InitializingBean, DisposableBean {
return jobAlarmer;
}
+ public GenerateId getGenerateId() {
+ return generateId;
+ }
}
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/id/GenerateId.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/id/GenerateId.java
new file mode 100644
index 00000000..f32ebb8a
--- /dev/null
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/id/GenerateId.java
@@ -0,0 +1,45 @@
+package com.xxl.job.admin.core.id;
+
+import com.xxl.job.admin.core.id.service.MachineService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+
+@Component
+public class GenerateId {
+
+ private final Logger logger = LoggerFactory.getLogger(GenerateId.class);
+
+ private SnowflakeIdWorker idWorker = null;
+
+ @Autowired
+ private MachineService machineService;
+
+ private Integer machineId = -1;
+
+ public Long getId() {
+ return idWorker.nextId();
+ }
+
+ @PostConstruct
+ private void getIdBefore() {
+ //只需要第一次调用 对idworker进行初始化
+ machineId = machineService.getInitMachineId();
+ idWorker = new SnowflakeIdWorker(machineId);
+ }
+
+ public Integer getMachineId(){
+ return this.machineId;
+ }
+
+ public void setMachineId(Integer machineId){
+ this.machineId = machineId;
+ }
+
+ public void setIdWorker(SnowflakeIdWorker snowflakeIdWorker){
+ this.idWorker = snowflakeIdWorker;
+ }
+}
\ No newline at end of file
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/id/HeartBeat.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/id/HeartBeat.java
new file mode 100644
index 00000000..c1052076
--- /dev/null
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/id/HeartBeat.java
@@ -0,0 +1,33 @@
+package com.xxl.job.admin.core.id;
+
+import java.util.Date;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import com.xxl.job.admin.core.id.service.MachineService;
+import com.xxl.job.admin.core.model.XxlJobMachine;
+import com.xxl.job.admin.core.util.MachineUtils;
+
+@Component
+@EnableScheduling
+public class HeartBeat {
+
+ @Value("${server.port}")
+ private String serverPort;
+
+ @Autowired
+ private MachineService machineService;
+
+ @Scheduled(fixedDelay = 10000)
+ public void checkMachineSurvive() {
+ String machineIpStr = MachineUtils.getIPAndPort(serverPort);
+ XxlJobMachine xxlJobMachine = machineService.selectByMachineIp(machineIpStr);
+ if (xxlJobMachine != null) {
+ machineService.update(machineIpStr, new Date());
+ }
+ }
+}
\ No newline at end of file
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/id/SnowflakeIdWorker.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/id/SnowflakeIdWorker.java
new file mode 100644
index 00000000..3a660515
--- /dev/null
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/id/SnowflakeIdWorker.java
@@ -0,0 +1,95 @@
+package com.xxl.job.admin.core.id;
+
+public class SnowflakeIdWorker {
+
+ // ==============================Fields===========================================
+ /** 开始时间截 (2019-01-01) */
+ private final long twepoch = 1546272000000L;
+
+ /** 机器id所占的位数 */
+ private final long workerIdBits = 5L;
+
+ /** 数据标识id所占的位数 */
+ private final long datacenterIdBits = 5L;
+
+ private final long maxMachineId = 1023;
+
+ /** 序列在id中占的位数 */
+ private final long sequenceBits = 12L;
+
+ /** 机器ID向左移12位 */
+ private final long getMachineIdShift = sequenceBits;
+
+ /** 时间截向左移22位(5+5+12) */
+ private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
+
+ /** 生成序列的掩码,这里为4095 (0b111111111111=0xfff=4095) */
+ private final long sequenceMask = -1L ^ (-1L << sequenceBits);
+
+ /** 机器Id */
+ private long machineId;
+
+ /** 毫秒内序列(0~4095) */
+ private long sequence = 0L;
+
+ /** 上次生成ID的时间截 */
+ private long lastTimestamp = -1L;
+
+ // ==============================Constructors=====================================
+ /**
+ * 构造函数
+ *
+ * @param machineId 工作ID (0~31)
+ */
+ public SnowflakeIdWorker(long machineId) {
+ if (machineId > maxMachineId || machineId < 0) {
+ throw new IllegalArgumentException(
+ String.format("worker machineId can't be greater than %d or less than 0", maxMachineId));
+ }
+ this.machineId = machineId;
+ }
+
+ // ==============================Methods==========================================
+ /**
+ * 获得下一个ID (该方法是线程安全的)
+ *
+ * @return SnowflakeId
+ */
+ public synchronized long nextId() {
+ long timestamp = timeGen();
+
+ // 如果是同一时间生成的,则进行毫秒内序列
+ if (timestamp <= lastTimestamp) {
+
+ timestamp = lastTimestamp;
+ sequence = (sequence + 1) & sequenceMask;
+ // 毫秒内序列溢出
+ if (sequence == 0) {
+ // 阻塞到下一个毫秒,获得新的时间戳
+ timestamp++;
+ }
+ }
+ // 时间戳改变,毫秒内序列重置
+ else {
+ sequence = 0L;
+ }
+
+ // 上次生成ID的时间截
+ lastTimestamp = timestamp;
+
+ // 移位并通过或运算拼到一起组成64位的ID
+ return ((timestamp - twepoch) << timestampLeftShift) //
+ | (machineId << getMachineIdShift) //
+ | sequence;
+ }
+
+ /**
+ * 返回以毫秒为单位的当前时间
+ *
+ * @return 当前时间(毫秒)
+ */
+ protected long timeGen() {
+ return System.currentTimeMillis();
+ }
+
+}
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/id/impl/MachineServiceImpl.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/id/impl/MachineServiceImpl.java
new file mode 100644
index 00000000..79b281cf
--- /dev/null
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/id/impl/MachineServiceImpl.java
@@ -0,0 +1,90 @@
+package com.xxl.job.admin.core.id.impl;
+
+import com.xxl.job.admin.core.id.service.MachineService;
+import com.xxl.job.admin.core.model.XxlJobMachine;
+import com.xxl.job.admin.core.util.MachineUtils;
+import com.xxl.job.admin.dao.XxlJobMachineDao;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.dao.DuplicateKeyException;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.Random;
+
+@Service
+public class MachineServiceImpl implements MachineService {
+
+ private final Logger logger = LoggerFactory.getLogger(MachineServiceImpl.class);
+
+ @Value("${server.port}")
+ private String serverPort;
+
+ @Autowired
+ private XxlJobMachineDao xxlJobMachineDao;
+
+ @Override
+ public void save(XxlJobMachine xxlJobMachine) {
+ xxlJobMachineDao.save(xxlJobMachine);
+ }
+
+ @Override
+ public void update(String machineIp, Date heartLastTime) {
+ xxlJobMachineDao.update(machineIp,heartLastTime);
+ }
+
+ @Override
+ public XxlJobMachine selectByMachineIp(String machineIp) {
+ return xxlJobMachineDao.selectByHostIp(machineIp);
+ }
+
+ @Override
+ public Integer selectMaxMachineId() {
+ return xxlJobMachineDao.selectMaxMachineId();
+ }
+
+ @Override
+ public Integer getInitMachineId() {
+ String ipStr = MachineUtils.getIPAndPort(serverPort);
+ XxlJobMachine xxlJobMachine = selectByMachineIp(ipStr);
+ Date nowDate = new Date();
+ int machineId = -1;
+ if(xxlJobMachine != null){
+ update(ipStr,nowDate);
+ machineId = xxlJobMachine.getMachineId();
+ }else{
+ xxlJobMachine = new XxlJobMachine();
+ xxlJobMachine.setMachineIp(ipStr);
+ xxlJobMachine.setAddTime(nowDate);
+ xxlJobMachine.setHeartLastTime(nowDate);
+ Random random = new Random();
+ boolean flag = false;
+ for(int i = 0; i < 100; i++){
+ try {
+ Integer value = selectMaxMachineId();
+ machineId = value == null ? 1 : value+1;
+ xxlJobMachine.setMachineId(machineId);
+ save(xxlJobMachine);
+ flag = true;
+ break;
+ } catch (DuplicateKeyException e) {
+ try {
+ Thread.sleep(random.nextInt(2000)+1);
+ } catch (InterruptedException interruptedException) {
+ logger.error("sleep error,cause:",interruptedException);
+ }
+ logger.error("retry >>>>>>>>>>>>> ");
+ } catch (Exception e){
+ logger.error("save error >>>>>>,system exit,cause:",e);
+ }
+ }
+ if(!flag) {
+ logger.error("多次获取machineId失败,退出程序");
+ System.exit(0);
+ }
+ }
+ return machineId;
+ }
+}
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/id/service/MachineService.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/id/service/MachineService.java
new file mode 100644
index 00000000..d02f10e9
--- /dev/null
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/id/service/MachineService.java
@@ -0,0 +1,18 @@
+package com.xxl.job.admin.core.id.service;
+
+import com.xxl.job.admin.core.model.XxlJobMachine;
+
+import java.util.Date;
+
+public interface MachineService {
+
+ void save(XxlJobMachine xxlJobMachine);
+
+ void update(String machineIp, Date heartLastTime);
+
+ XxlJobMachine selectByMachineIp(String machineIp);
+
+ Integer selectMaxMachineId();
+
+ Integer getInitMachineId();
+}
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobGroup.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobGroup.java
index f87a7a68..ed9fef48 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobGroup.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobGroup.java
@@ -9,7 +9,7 @@ import java.util.List;
*/
public class XxlJobGroup {
- private int id;
+ private long id;
private String appname;
private String title;
private int addressType; // 执行器地址类型:0=自动注册、1=手动录入
@@ -24,11 +24,11 @@ public class XxlJobGroup {
return registryList;
}
- public int getId() {
+ public long getId() {
return id;
}
- public void setId(int id) {
+ public void setId(long id) {
this.id = id;
}
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java
index 1e4a74b1..05121384 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobInfo.java
@@ -9,9 +9,9 @@ import java.util.Date;
*/
public class XxlJobInfo {
- private int id; // 主键ID
+ private long id; // 主键ID
- private int jobGroup; // 执行器主键ID
+ private long jobGroup; // 执行器主键ID
private String jobCron; // 任务执行CRON表达式
private String jobDesc;
@@ -40,19 +40,19 @@ public class XxlJobInfo {
private long triggerNextTime; // 下次调度时间
- public int getId() {
+ public long getId() {
return id;
}
- public void setId(int id) {
+ public void setId(long id) {
this.id = id;
}
- public int getJobGroup() {
+ public long getJobGroup() {
return jobGroup;
}
- public void setJobGroup(int jobGroup) {
+ public void setJobGroup(long jobGroup) {
this.jobGroup = jobGroup;
}
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLog.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLog.java
index 7d3072aa..a035e5e5 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLog.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLog.java
@@ -11,8 +11,8 @@ public class XxlJobLog {
private long id;
// job info
- private int jobGroup;
- private int jobId;
+ private long jobGroup;
+ private long jobId;
// execute info
private String executorAddress;
@@ -42,19 +42,19 @@ public class XxlJobLog {
this.id = id;
}
- public int getJobGroup() {
+ public long getJobGroup() {
return jobGroup;
}
- public void setJobGroup(int jobGroup) {
+ public void setJobGroup(long jobGroup) {
this.jobGroup = jobGroup;
}
- public int getJobId() {
+ public long getJobId() {
return jobId;
}
- public void setJobId(int jobId) {
+ public void setJobId(long jobId) {
this.jobId = jobId;
}
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogGlue.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogGlue.java
index 7b1ca461..5841b018 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogGlue.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogGlue.java
@@ -8,27 +8,27 @@ import java.util.Date;
*/
public class XxlJobLogGlue {
- private int id;
- private int jobId; // 任务主键ID
+ private long id;
+ private long jobId; // 任务主键ID
private String glueType; // GLUE类型 #com.xxl.job.core.glue.GlueTypeEnum
private String glueSource;
private String glueRemark;
private Date addTime;
private Date updateTime;
- public int getId() {
+ public long getId() {
return id;
}
- public void setId(int id) {
+ public void setId(long id) {
this.id = id;
}
- public int getJobId() {
+ public long getJobId() {
return jobId;
}
- public void setJobId(int jobId) {
+ public void setJobId(long jobId) {
this.jobId = jobId;
}
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogReport.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogReport.java
index e58ff1a9..722b6582 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogReport.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobLogReport.java
@@ -4,7 +4,7 @@ import java.util.Date;
public class XxlJobLogReport {
- private int id;
+ private long id;
private Date triggerDay;
@@ -12,11 +12,11 @@ public class XxlJobLogReport {
private int sucCount;
private int failCount;
- public int getId() {
+ public long getId() {
return id;
}
- public void setId(int id) {
+ public void setId(long id) {
this.id = id;
}
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobMachine.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobMachine.java
new file mode 100644
index 00000000..e4193af0
--- /dev/null
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobMachine.java
@@ -0,0 +1,58 @@
+package com.xxl.job.admin.core.model;
+
+import java.util.Date;
+
+public class XxlJobMachine {
+
+ /**
+ * 主机IP
+ */
+ private String machineIp;
+
+ /**
+ * 主机IP对应的机器码
+ */
+ private Integer machineId;
+
+ /**
+ * 创建时间
+ */
+ private Date addTime;
+
+ /**
+ * 最后一次心跳时间
+ */
+ private Date heartLastTime;
+
+ public Date getHeartLastTime() {
+ return heartLastTime;
+ }
+
+ public void setHeartLastTime(Date heartLastTime) {
+ this.heartLastTime = heartLastTime;
+ }
+
+ public Integer getMachineId() {
+ return machineId;
+ }
+
+ public void setMachineId(Integer machineId) {
+ this.machineId = machineId;
+ }
+
+ public Date getAddTime() {
+ return addTime;
+ }
+
+ public void setAddTime(Date addTime) {
+ this.addTime = addTime;
+ }
+
+ public String getMachineIp() {
+ return machineIp;
+ }
+
+ public void setMachineIp(String machineIp) {
+ this.machineIp = machineIp;
+ }
+}
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobRegistry.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobRegistry.java
index 924d6d33..67e74bb0 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobRegistry.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobRegistry.java
@@ -7,17 +7,17 @@ import java.util.Date;
*/
public class XxlJobRegistry {
- private int id;
+ private long id;
private String registryGroup;
private String registryKey;
private String registryValue;
private Date updateTime;
- public int getId() {
+ public long getId() {
return id;
}
- public void setId(int id) {
+ public void setId(long id) {
this.id = id;
}
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobUser.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobUser.java
index db17327a..9773e0d1 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobUser.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/model/XxlJobUser.java
@@ -7,17 +7,17 @@ import org.springframework.util.StringUtils;
*/
public class XxlJobUser {
- private int id;
+ private long id;
private String username; // 账号
private String password; // 密码
private int role; // 角色:0-普通用户、1-管理员
private String permission; // 权限:执行器ID列表,多个逗号分割
- public int getId() {
+ public long getId() {
return id;
}
- public void setId(int id) {
+ public void setId(long id) {
this.id = id;
}
@@ -54,7 +54,7 @@ public class XxlJobUser {
}
// plugin
- public boolean validPermission(int jobGroup){
+ public boolean validPermission(long jobGroup){
if (this.role == 1) {
return true;
} else {
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteConsistentHash.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteConsistentHash.java
index 41ac671c..64d8f83c 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteConsistentHash.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteConsistentHash.java
@@ -56,7 +56,7 @@ public class ExecutorRouteConsistentHash extends ExecutorRouter {
return truncateHashCode;
}
- public String hashJob(int jobId, List addressList) {
+ public String hashJob(long jobId, List addressList) {
// ------A1------A2-------A3------
// -----------J1------------------
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLFU.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLFU.java
index 9df19726..6075ca58 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLFU.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLFU.java
@@ -17,10 +17,10 @@ import java.util.concurrent.ConcurrentMap;
*/
public class ExecutorRouteLFU extends ExecutorRouter {
- private static ConcurrentMap> jobLfuMap = new ConcurrentHashMap>();
+ private static ConcurrentMap> jobLfuMap = new ConcurrentHashMap<>();
private static long CACHE_VALID_TIME = 0;
- public String route(int jobId, List addressList) {
+ public String route(long jobId, List addressList) {
// cache clear
if (System.currentTimeMillis() > CACHE_VALID_TIME) {
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLRU.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLRU.java
index 2d540067..b769a7b2 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLRU.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteLRU.java
@@ -19,10 +19,10 @@ import java.util.concurrent.ConcurrentMap;
*/
public class ExecutorRouteLRU extends ExecutorRouter {
- private static ConcurrentMap> jobLRUMap = new ConcurrentHashMap>();
+ private static ConcurrentMap> jobLRUMap = new ConcurrentHashMap<>();
private static long CACHE_VALID_TIME = 0;
- public String route(int jobId, List addressList) {
+ public String route(long jobId, List addressList) {
// cache clear
if (System.currentTimeMillis() > CACHE_VALID_TIME) {
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRound.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRound.java
index 936ef0ed..f64ae6d1 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRound.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteRound.java
@@ -14,9 +14,9 @@ import java.util.concurrent.ConcurrentMap;
*/
public class ExecutorRouteRound extends ExecutorRouter {
- private static ConcurrentMap routeCountEachJob = new ConcurrentHashMap();
+ private static ConcurrentMap routeCountEachJob = new ConcurrentHashMap<>();
private static long CACHE_VALID_TIME = 0;
- private static int count(int jobId) {
+ private static int count(long jobId) {
// cache clear
if (System.currentTimeMillis() > CACHE_VALID_TIME) {
routeCountEachJob.clear();
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java
index 33e4d250..b07b35ad 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java
@@ -1,5 +1,6 @@
package com.xxl.job.admin.core.thread;
+import com.github.pagehelper.PageHelper;
import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
import com.xxl.job.admin.core.model.XxlJobInfo;
import com.xxl.job.admin.core.model.XxlJobLog;
@@ -38,7 +39,8 @@ public class JobFailMonitorHelper {
while (!toStop) {
try {
- List failLogIds = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().findFailJobLogIds(1000);
+ PageHelper.startPage(1,1000);
+ List failLogIds = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().findFailJobLogIds();
if (failLogIds!=null && !failLogIds.isEmpty()) {
for (long failLogId: failLogIds) {
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobLogReportHelper.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobLogReportHelper.java
index 2387a0c4..130c5522 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobLogReportHelper.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobLogReportHelper.java
@@ -1,5 +1,6 @@
package com.xxl.job.admin.core.thread;
+import com.github.pagehelper.PageHelper;
import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
import com.xxl.job.admin.core.model.XxlJobLogReport;
import org.slf4j.Logger;
@@ -24,7 +25,6 @@ public class JobLogReportHelper {
return instance;
}
-
private Thread logrThread;
private volatile boolean toStop = false;
public void start(){
@@ -83,6 +83,7 @@ public class JobLogReportHelper {
// do refresh
int ret = XxlJobAdminConfig.getAdminConfig().getXxlJobLogReportDao().update(xxlJobLogReport);
if (ret < 1) {
+ xxlJobLogReport.setId(XxlJobAdminConfig.getAdminConfig().getGenerateId().getId());
XxlJobAdminConfig.getAdminConfig().getXxlJobLogReportDao().save(xxlJobLogReport);
}
}
@@ -109,7 +110,8 @@ public class JobLogReportHelper {
// clean expired log
List logIds = null;
do {
- logIds = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().findClearLogIds(0, 0, clearBeforeTime, 0, 1000);
+ PageHelper.startPage(1,1000);
+ logIds = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().findClearLogIds(0, 0, clearBeforeTime, null);
if (logIds!=null && logIds.size()>0) {
XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().clearLog(logIds);
}
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryMonitorHelper.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryMonitorHelper.java
index 5c23237d..6ae3fed6 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryMonitorHelper.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryMonitorHelper.java
@@ -4,6 +4,7 @@ import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
import com.xxl.job.admin.core.model.XxlJobGroup;
import com.xxl.job.admin.core.model.XxlJobRegistry;
import com.xxl.job.core.enums.RegistryConfig;
+import com.xxl.job.core.util.DateUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -35,14 +36,16 @@ public class JobRegistryMonitorHelper {
if (groupList!=null && !groupList.isEmpty()) {
// remove dead address (admin/executor)
- List ids = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findDead(RegistryConfig.DEAD_TIMEOUT, new Date());
+ Date date = DateUtil.addSecond(new Date(), -RegistryConfig.DEAD_TIMEOUT);
+ List ids = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findDead(date);
if (ids!=null && ids.size()>0) {
XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().removeDead(ids);
}
// fresh online address (admin/executor)
HashMap> appAddressMap = new HashMap>();
- List list = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findAll(RegistryConfig.DEAD_TIMEOUT, new Date());
+ Date time = DateUtil.addSecond(new Date(), -RegistryConfig.DEAD_TIMEOUT);
+ List list = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findAll(time);
if (list != null) {
for (XxlJobRegistry item: list) {
if (RegistryConfig.RegistType.EXECUTOR.name().equals(item.getRegistryGroup())) {
@@ -72,7 +75,7 @@ public class JobRegistryMonitorHelper {
}
addressListStr = addressListStr.substring(0, addressListStr.length()-1);
}
- group.setAddressList(addressListStr);
+ group.setAddressList(addressListStr == null ? "" : addressListStr);
XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().update(group);
}
}
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java
index e425b323..8b0ad589 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java
@@ -1,5 +1,6 @@
package com.xxl.job.admin.core.thread;
+import com.github.pagehelper.PageHelper;
import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
import com.xxl.job.admin.core.cron.CronExpression;
import com.xxl.job.admin.core.model.XxlJobInfo;
@@ -32,7 +33,7 @@ public class JobScheduleHelper {
private Thread ringThread;
private volatile boolean scheduleThreadToStop = false;
private volatile boolean ringThreadToStop = false;
- private volatile static Map> ringData = new ConcurrentHashMap<>();
+ private volatile static Map> ringData = new ConcurrentHashMap<>();
public void start(){
@@ -76,7 +77,8 @@ public class JobScheduleHelper {
// 1、pre read
long nowTime = System.currentTimeMillis();
- List scheduleList = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().scheduleJobQuery(nowTime + PRE_READ_MS, preReadCount);
+ PageHelper.startPage(1,preReadCount);
+ List scheduleList = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().scheduleJobQuery(nowTime + PRE_READ_MS);
if (scheduleList!=null && scheduleList.size()>0) {
// 2、push time-ring
for (XxlJobInfo jobInfo: scheduleList) {
@@ -226,10 +228,10 @@ public class JobScheduleHelper {
try {
// second data
- List ringItemData = new ArrayList<>();
+ List ringItemData = new ArrayList<>();
int nowSecond = Calendar.getInstance().get(Calendar.SECOND); // 避免处理耗时太长,跨过刻度,向前校验一个刻度;
for (int i = 0; i < 2; i++) {
- List tmpData = ringData.remove( (nowSecond+60-i)%60 );
+ List tmpData = ringData.remove( (nowSecond+60-i)%60 );
if (tmpData != null) {
ringItemData.addAll(tmpData);
}
@@ -239,7 +241,7 @@ public class JobScheduleHelper {
logger.debug(">>>>>>>>>>> xxl-job, time-ring beat : " + nowSecond + " = " + Arrays.asList(ringItemData) );
if (ringItemData.size() > 0) {
// do trigger
- for (int jobId: ringItemData) {
+ for (long jobId: ringItemData) {
// do trigger
JobTriggerPoolHelper.trigger(jobId, TriggerTypeEnum.CRON, -1, null, null, null);
}
@@ -281,11 +283,11 @@ public class JobScheduleHelper {
}
}
- private void pushTimeRing(int ringSecond, int jobId){
+ private void pushTimeRing(int ringSecond, long jobId){
// push async ring
- List ringItemData = ringData.get(ringSecond);
+ List ringItemData = ringData.get(ringSecond);
if (ringItemData == null) {
- ringItemData = new ArrayList();
+ ringItemData = new ArrayList<>();
ringData.put(ringSecond, ringItemData);
}
ringItemData.add(jobId);
@@ -316,7 +318,7 @@ public class JobScheduleHelper {
boolean hasRingData = false;
if (!ringData.isEmpty()) {
for (int second : ringData.keySet()) {
- List tmpData = ringData.get(second);
+ List tmpData = ringData.get(second);
if (tmpData!=null && tmpData.size()>0) {
hasRingData = true;
break;
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java
index 398713dd..42a0cfa1 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java
@@ -6,6 +6,7 @@ import com.xxl.job.admin.core.trigger.XxlJobTrigger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import javax.annotation.Resource;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
@@ -16,6 +17,8 @@ import java.util.concurrent.atomic.AtomicInteger;
*/
public class JobTriggerPoolHelper {
private static Logger logger = LoggerFactory.getLogger(JobTriggerPoolHelper.class);
+ @Resource
+ private XxlJobTrigger xxlJobTrigger;
// ---------------------- trigger pool ----------------------
@@ -63,13 +66,13 @@ public class JobTriggerPoolHelper {
// job timeout count
private volatile long minTim = System.currentTimeMillis()/60000; // ms > min
- private volatile ConcurrentMap jobTimeoutCountMap = new ConcurrentHashMap<>();
+ private volatile ConcurrentMap jobTimeoutCountMap = new ConcurrentHashMap<>();
/**
* add trigger
*/
- public void addTrigger(final int jobId,
+ public void addTrigger(final long jobId,
final TriggerTypeEnum triggerType,
final int failRetryCount,
final String executorShardingParam,
@@ -143,7 +146,7 @@ public class JobTriggerPoolHelper {
* null: use job param
* not null: cover job param
*/
- public static void trigger(int jobId, TriggerTypeEnum triggerType, int failRetryCount, String executorShardingParam, String executorParam, String addressList) {
+ public static void trigger(long jobId, TriggerTypeEnum triggerType, int failRetryCount, String executorShardingParam, String executorParam, String addressList) {
helper.addTrigger(jobId, triggerType, failRetryCount, executorShardingParam, executorParam, addressList);
}
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java
index 748befc6..23f01e13 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java
@@ -15,6 +15,7 @@ import com.xxl.job.core.util.IpUtil;
import com.xxl.job.core.util.ThrowableUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
import java.util.Date;
@@ -22,9 +23,13 @@ import java.util.Date;
* xxl-job trigger
* Created by xuxueli on 17/7/13.
*/
+@Component
public class XxlJobTrigger {
private static Logger logger = LoggerFactory.getLogger(XxlJobTrigger.class);
+// @Autowired
+// private static GenerateId generateId;
+
/**
* trigger job
*
@@ -41,7 +46,7 @@ public class XxlJobTrigger {
* null: use executor addressList
* not null: cover
*/
- public static void trigger(int jobId,
+ public static void trigger(long jobId,
TriggerTypeEnum triggerType,
int failRetryCount,
String executorShardingParam,
@@ -120,6 +125,10 @@ public class XxlJobTrigger {
jobLog.setJobGroup(jobInfo.getJobGroup());
jobLog.setJobId(jobInfo.getId());
jobLog.setTriggerTime(new Date());
+ jobLog.setId(XxlJobAdminConfig.getAdminConfig().getGenerateId().getId());
+ jobLog.setHandleTime(new Date());
+ jobLog.setExecutorFailRetryCount(0);
+ jobLog.setAlarmStatus(0);
XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().save(jobLog);
logger.debug(">>>>>>>>>>> xxl-job trigger start, jobId:{}", jobLog.getId());
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/MachineUtils.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/MachineUtils.java
new file mode 100644
index 00000000..5b664a5a
--- /dev/null
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/MachineUtils.java
@@ -0,0 +1,60 @@
+package com.xxl.job.admin.core.util;
+
+import java.net.Inet4Address;
+import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.util.Enumeration;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * 机器工具类
+ * @author 单红宇
+ *
+ */
+public class MachineUtils {
+
+ private static final Logger logger = LoggerFactory.getLogger(MachineUtils.class);
+
+ private static String machineIp = null;
+
+ public static String getIPAndPort(String port) {
+ return getIP().concat(":").concat(port);
+ }
+
+ public static String getIP() {
+ if (machineIp == null) {
+ String ipv4 = getInet4Address();
+ logger.info("ipv4={}", ipv4);
+ machineIp = ipv4;
+ }
+ return machineIp;
+ }
+
+ /**
+ * 获取服务器Ipv4地址
+ */
+ public static String getInet4Address() {
+ Enumeration nis;
+ String ip = null;
+ try {
+ nis = NetworkInterface.getNetworkInterfaces();
+ for (; nis.hasMoreElements();) {
+ NetworkInterface ni = nis.nextElement();
+ Enumeration ias = ni.getInetAddresses();
+ for (; ias.hasMoreElements();) {
+ InetAddress ia = ias.nextElement();
+ // ia instanceof Inet6Address && !ia.equals("")
+ if (ia instanceof Inet4Address && !ia.getHostAddress().equals("127.0.0.1")) {
+ ip = ia.getHostAddress();
+ }
+ }
+ }
+ } catch (Exception e) {
+ logger.error("getServerIpAddress执行出错:" + e.getMessage() + "," + e.getCause());
+ }
+ return ip;
+ }
+
+}
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobGroupDao.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobGroupDao.java
index b608d9fb..f3cef774 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobGroupDao.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobGroupDao.java
@@ -20,18 +20,14 @@ public interface XxlJobGroupDao {
public int update(XxlJobGroup xxlJobGroup);
- public int remove(@Param("id") int id);
+ public int remove(@Param("id") long Id);
- public XxlJobGroup load(@Param("id") int id);
+ public XxlJobGroup load(@Param("id") long Id);
- public List pageList(@Param("offset") int offset,
- @Param("pagesize") int pagesize,
- @Param("appname") String appname,
+ public List pageList(@Param("appname") String appname,
@Param("title") String title);
- public int pageListCount(@Param("offset") int offset,
- @Param("pagesize") int pagesize,
- @Param("appname") String appname,
+ public int pageListCount(@Param("appname") String appname,
@Param("title") String title);
}
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobInfoDao.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobInfoDao.java
index d640efff..beeade63 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobInfoDao.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobInfoDao.java
@@ -14,16 +14,12 @@ import java.util.List;
@Mapper
public interface XxlJobInfoDao {
- public List pageList(@Param("offset") int offset,
- @Param("pagesize") int pagesize,
- @Param("jobGroup") int jobGroup,
+ public List pageList(@Param("jobGroup") long jobGroup,
@Param("triggerStatus") int triggerStatus,
@Param("jobDesc") String jobDesc,
@Param("executorHandler") String executorHandler,
@Param("author") String author);
- public int pageListCount(@Param("offset") int offset,
- @Param("pagesize") int pagesize,
- @Param("jobGroup") int jobGroup,
+ public int pageListCount(@Param("jobGroup") long jobGroup,
@Param("triggerStatus") int triggerStatus,
@Param("jobDesc") String jobDesc,
@Param("executorHandler") String executorHandler,
@@ -31,17 +27,17 @@ public interface XxlJobInfoDao {
public int save(XxlJobInfo info);
- public XxlJobInfo loadById(@Param("id") int id);
+ public XxlJobInfo loadById(@Param("id") long id);
public int update(XxlJobInfo xxlJobInfo);
public int delete(@Param("id") long id);
- public List getJobsByGroup(@Param("jobGroup") int jobGroup);
+ public List getJobsByGroup(@Param("jobGroup") long jobGroup);
public int findAllCount();
- public List scheduleJobQuery(@Param("maxNextTime") long maxNextTime, @Param("pagesize") int pagesize );
+ public List scheduleJobQuery(@Param("maxNextTime") long maxNextTime );
public int scheduleUpdate(XxlJobInfo xxlJobInfo);
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogDao.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogDao.java
index 62fa3b4f..2c953039 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogDao.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogDao.java
@@ -16,17 +16,13 @@ import java.util.Map;
public interface XxlJobLogDao {
// exist jobId not use jobGroup, not exist use jobGroup
- public List pageList(@Param("offset") int offset,
- @Param("pagesize") int pagesize,
- @Param("jobGroup") int jobGroup,
- @Param("jobId") int jobId,
+ public List pageList(@Param("jobGroup") long jobGroup,
+ @Param("jobId") long jobId,
@Param("triggerTimeStart") Date triggerTimeStart,
@Param("triggerTimeEnd") Date triggerTimeEnd,
@Param("logStatus") int logStatus);
- public int pageListCount(@Param("offset") int offset,
- @Param("pagesize") int pagesize,
- @Param("jobGroup") int jobGroup,
- @Param("jobId") int jobId,
+ public int pageListCount(@Param("jobGroup") long jobGroup,
+ @Param("jobId") long jobId,
@Param("triggerTimeStart") Date triggerTimeStart,
@Param("triggerTimeEnd") Date triggerTimeEnd,
@Param("logStatus") int logStatus);
@@ -39,19 +35,19 @@ public interface XxlJobLogDao {
public int updateHandleInfo(XxlJobLog xxlJobLog);
- public int delete(@Param("jobId") int jobId);
+ public int delete(@Param("jobId") long jobId);
public Map findLogReport(@Param("from") Date from,
@Param("to") Date to);
- public List findClearLogIds(@Param("jobGroup") int jobGroup,
- @Param("jobId") int jobId,
+ public List findClearLogIds(@Param("jobGroup") long jobGroup,
+ @Param("jobId") long jobId,
@Param("clearBeforeTime") Date clearBeforeTime,
- @Param("clearBeforeNum") int clearBeforeNum,
- @Param("pagesize") int pagesize);
+ @Param("recentLogIds") List recentLogIds
+ );
public int clearLog(@Param("logIds") List logIds);
- public List findFailJobLogIds(@Param("pagesize") int pagesize);
+ public List findFailJobLogIds();
public int updateAlarmStatus(@Param("logId") long logId,
@Param("oldAlarmStatus") int oldAlarmStatus,
@@ -59,4 +55,6 @@ public interface XxlJobLogDao {
public List findLostJobIds(@Param("losedTime") Date losedTime);
+ public List findRecentLogs(@Param("jobGroup") long jobGroup, @Param("jobId") long jobId);
+
}
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogGlueDao.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogGlueDao.java
index 3028aed2..1fd37d59 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogGlueDao.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogGlueDao.java
@@ -15,10 +15,12 @@ public interface XxlJobLogGlueDao {
public int save(XxlJobLogGlue xxlJobLogGlue);
- public List findByJobId(@Param("jobId") int jobId);
+ public List findByJobId(@Param("jobId") long jobId);
- public int removeOld(@Param("jobId") int jobId, @Param("limit") int limit);
+ public int removeOld(@Param("jobId") long jobId,@Param("recentLogIds") List recentLogIds);
- public int deleteByJobId(@Param("jobId") int jobId);
+ public int deleteByJobId(@Param("jobId") long jobId);
+
+ public List findIds(@Param("jobId") long jobId);
}
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogReportDao.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogReportDao.java
index f4b3dc81..7c60e27b 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogReportDao.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogReportDao.java
@@ -14,7 +14,7 @@ import java.util.List;
@Mapper
public interface XxlJobLogReportDao {
- public int save(XxlJobLogReport xxlJobLogReport);
+ void save(XxlJobLogReport xxlJobLogReport);
public int update(XxlJobLogReport xxlJobLogReport);
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobMachineDao.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobMachineDao.java
new file mode 100644
index 00000000..88ac0aae
--- /dev/null
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobMachineDao.java
@@ -0,0 +1,20 @@
+package com.xxl.job.admin.dao;
+
+import com.xxl.job.admin.core.model.XxlJobMachine;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+
+@Mapper
+public interface XxlJobMachineDao {
+
+ void save(@Param("xxlJobMachine")XxlJobMachine xxlJobMachine);
+
+ void update(@Param("machineIp") String machineIp, @Param("heartLastTime") Date heartLastTime);
+
+ XxlJobMachine selectByHostIp(String machineIp);
+
+ Integer selectMaxMachineId();
+
+}
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobRegistryDao.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobRegistryDao.java
index 1005c46c..03dc73cb 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobRegistryDao.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobRegistryDao.java
@@ -13,13 +13,11 @@ import java.util.List;
@Mapper
public interface XxlJobRegistryDao {
- public List findDead(@Param("timeout") int timeout,
- @Param("nowTime") Date nowTime);
+ public List findDead(@Param("date") Date date);
- public int removeDead(@Param("ids") List ids);
+ public int removeDead(@Param("ids") List ids);
- public List findAll(@Param("timeout") int timeout,
- @Param("nowTime") Date nowTime);
+ public List findAll(@Param("date") Date date);
public int registryUpdate(@Param("registryGroup") String registryGroup,
@Param("registryKey") String registryKey,
@@ -29,7 +27,8 @@ public interface XxlJobRegistryDao {
public int registrySave(@Param("registryGroup") String registryGroup,
@Param("registryKey") String registryKey,
@Param("registryValue") String registryValue,
- @Param("updateTime") Date updateTime);
+ @Param("updateTime") Date updateTime,
+ @Param("id") long id);
public int registryDelete(@Param("registryGroup") String registryGroup,
@Param("registryKey") String registryKey,
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobUserDao.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobUserDao.java
index e8404947..979cab32 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobUserDao.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobUserDao.java
@@ -11,21 +11,16 @@ import java.util.List;
@Mapper
public interface XxlJobUserDao {
- public List pageList(@Param("offset") int offset,
- @Param("pagesize") int pagesize,
- @Param("username") String username,
- @Param("role") int role);
- public int pageListCount(@Param("offset") int offset,
- @Param("pagesize") int pagesize,
- @Param("username") String username,
- @Param("role") int role);
+ public List pageList(@Param("username") String username, @Param("role") int role);
+
+ public int pageListCount(@Param("username") String username, @Param("role") int role);
public XxlJobUser loadByUserName(@Param("username") String username);
- public int save(XxlJobUser xxlJobUser);
+ public void save(XxlJobUser xxlJobUser);
public int update(XxlJobUser xxlJobUser);
- public int delete(@Param("id") int id);
+ public int delete(@Param("id") long id);
}
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/service/XxlJobService.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/service/XxlJobService.java
index 61da3a27..03129d4e 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/service/XxlJobService.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/service/XxlJobService.java
@@ -25,7 +25,7 @@ public interface XxlJobService {
* @param author
* @return
*/
- public Map pageList(int start, int length, int jobGroup, int triggerStatus, String jobDesc, String executorHandler, String author);
+ public Map pageList(int start, int length, long jobGroup, int triggerStatus, String jobDesc, String executorHandler, String author);
/**
* add job
@@ -49,7 +49,7 @@ public interface XxlJobService {
* @param id
* @return
*/
- public ReturnT remove(int id);
+ public ReturnT remove(long id);
/**
* start job
@@ -57,7 +57,7 @@ public interface XxlJobService {
* @param id
* @return
*/
- public ReturnT start(int id);
+ public ReturnT start(long id);
/**
* stop job
@@ -65,7 +65,7 @@ public interface XxlJobService {
* @param id
* @return
*/
- public ReturnT stop(int id);
+ public ReturnT stop(long id);
/**
* dashboard info
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java
index 51fbff92..f792dd12 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java
@@ -1,5 +1,6 @@
package com.xxl.job.admin.service.impl;
+import com.xxl.job.admin.core.id.GenerateId;
import com.xxl.job.admin.core.model.XxlJobInfo;
import com.xxl.job.admin.core.model.XxlJobLog;
import com.xxl.job.admin.core.thread.JobTriggerPoolHelper;
@@ -39,6 +40,8 @@ public class AdminBizImpl implements AdminBiz {
private XxlJobRegistryDao xxlJobRegistryDao;
@Resource
private XxlJobGroupDao xxlJobGroupDao;
+ @Resource
+ private GenerateId generateId;
@Override
@@ -141,7 +144,7 @@ public class AdminBizImpl implements AdminBiz {
int ret = xxlJobRegistryDao.registryUpdate(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date());
if (ret < 1) {
- xxlJobRegistryDao.registrySave(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date());
+ xxlJobRegistryDao.registrySave(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date(), generateId.getId());
// fresh
freshGroupRegistryInfo(registryParam);
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java
index 526c43b3..a723150d 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java
@@ -1,5 +1,7 @@
package com.xxl.job.admin.service.impl;
+import com.github.pagehelper.PageHelper;
+import com.xxl.job.admin.core.id.GenerateId;
import com.xxl.job.admin.core.model.XxlJobGroup;
import com.xxl.job.admin.core.model.XxlJobInfo;
import com.xxl.job.admin.core.cron.CronExpression;
@@ -16,7 +18,6 @@ import com.xxl.job.core.util.DateUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
-
import javax.annotation.Resource;
import java.text.MessageFormat;
import java.text.ParseException;
@@ -40,13 +41,16 @@ public class XxlJobServiceImpl implements XxlJobService {
private XxlJobLogGlueDao xxlJobLogGlueDao;
@Resource
private XxlJobLogReportDao xxlJobLogReportDao;
+ @Resource
+ private GenerateId generateId;
@Override
- public Map pageList(int start, int length, int jobGroup, int triggerStatus, String jobDesc, String executorHandler, String author) {
+ public Map pageList(int start, int length, long jobGroup, int triggerStatus, String jobDesc, String executorHandler, String author) {
// page list
- List list = xxlJobInfoDao.pageList(start, length, jobGroup, triggerStatus, jobDesc, executorHandler, author);
- int list_count = xxlJobInfoDao.pageListCount(start, length, jobGroup, triggerStatus, jobDesc, executorHandler, author);
+ PageHelper.startPage(start/length+1,length);
+ List list = xxlJobInfoDao.pageList(jobGroup, triggerStatus, jobDesc, executorHandler, author);
+ int list_count = xxlJobInfoDao.pageListCount(jobGroup, triggerStatus, jobDesc, executorHandler, author);
// package result
Map maps = new HashMap();
@@ -120,6 +124,7 @@ public class XxlJobServiceImpl implements XxlJobService {
jobInfo.setAddTime(new Date());
jobInfo.setUpdateTime(new Date());
jobInfo.setGlueUpdatetime(new Date());
+ jobInfo.setId(generateId.getId());
xxlJobInfoDao.save(jobInfo);
if (jobInfo.getId() < 1) {
return new ReturnT(ReturnT.FAIL_CODE, (I18nUtil.getString("jobinfo_field_add")+I18nUtil.getString("system_fail")) );
@@ -128,6 +133,10 @@ public class XxlJobServiceImpl implements XxlJobService {
return new ReturnT(String.valueOf(jobInfo.getId()));
}
+ public static void main(String[] args) {
+// Integer a = 185337369535193088;
+ }
+
private boolean isNumeric(String str){
try {
int result = Integer.valueOf(str);
@@ -232,7 +241,7 @@ public class XxlJobServiceImpl implements XxlJobService {
}
@Override
- public ReturnT remove(int id) {
+ public ReturnT remove(long id) {
XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id);
if (xxlJobInfo == null) {
return ReturnT.SUCCESS;
@@ -245,7 +254,7 @@ public class XxlJobServiceImpl implements XxlJobService {
}
@Override
- public ReturnT start(int id) {
+ public ReturnT start(long id) {
XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id);
// next trigger time (5s后生效,避开预读周期)
@@ -271,7 +280,7 @@ public class XxlJobServiceImpl implements XxlJobService {
}
@Override
- public ReturnT stop(int id) {
+ public ReturnT stop(long id) {
XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id);
xxlJobInfo.setTriggerStatus(0);
diff --git a/xxl-job-admin/src/main/resources/application.properties b/xxl-job-admin/src/main/resources/application.properties
index eea8afe7..18c4b28b 100644
--- a/xxl-job-admin/src/main/resources/application.properties
+++ b/xxl-job-admin/src/main/resources/application.properties
@@ -20,13 +20,28 @@ spring.freemarker.settings.number_format=0.##########
### mybatis
mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml
+mybatis.configuration.jdbc-type-for-null=NULL
#mybatis.type-aliases-package=com.xxl.job.admin.core.model
+logging.level.com.xxl.job.admin.dao.XxlJobLogDao=debug
+logging.level.com.xxl.job.admin.dao.XxlJobRegistryDao=debug
+logging.level.com.xxl.job.admin.dao.XxlJobLogReportDao=debug
-### xxl-job, datasource
-spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
-spring.datasource.username=root
-spring.datasource.password=root_pwd
+### pagehelper
+pagehelper.auto-runtime-dialect=true
+
+### xxl-job, mysql datasource
+spring.datasource.url=jdbc:xxxxxxxx
+spring.datasource.username=xxxxxxxxxx
+spring.datasource.password=xxxxxxxx
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
+spring.datasource.hikari.connection-test-query=SELECT 1
+
+### xxl-job, oracle datasource
+#spring.datasource.url = xxxxxxx
+#spring.datasource.username=xxxxxxx
+#spring.datasource.password=xxxxxxx
+#spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
+#spring.datasource.hikari.connection-test-query=SELECT 1 FROM DUAL
### datasource-pool
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
@@ -37,7 +52,6 @@ spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=HikariCP
spring.datasource.hikari.max-lifetime=900000
spring.datasource.hikari.connection-timeout=10000
-spring.datasource.hikari.connection-test-query=SELECT 1
### xxl-job, email
spring.mail.host=smtp.qq.com
@@ -61,3 +75,5 @@ xxl.job.triggerpool.slow.max=100
### xxl-job, log retention days
xxl.job.logretentiondays=30
+
+
diff --git a/xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobGroupMapper.xml b/xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobGroupMapper.xml
index 7635214a..18cf7d43 100644
--- a/xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobGroupMapper.xml
+++ b/xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobGroupMapper.xml
@@ -12,75 +12,74 @@
- t.id,
- t.app_name,
- t.title,
- t.address_type,
- t.address_list
+ id,
+ app_name,
+ title,
+ address_type,
+ address_list
-
- INSERT INTO xxl_job_group ( `app_name`, `title`, `address_type`, `address_list`)
- values ( #{appname}, #{title}, #{addressType}, #{addressList});
+
+ INSERT INTO xxl_job_group (id, app_name, title, address_type, address_list)
+ values (#{id}, #{appname}, #{title}, #{addressType}, #{addressList})
UPDATE xxl_job_group
- SET `app_name` = #{appname},
- `title` = #{title},
- `address_type` = #{addressType},
- `address_list` = #{addressList}
+ SET app_name = #{appname},
+ title = #{title},
+ address_type = #{addressType},
+ address_list = #{addressList}
WHERE id = #{id}
-
+
DELETE FROM xxl_job_group
WHERE id = #{id}
-
+
+
+ com.github.pagehelper
+ pagehelper-spring-boot-starter
+ ${mybatis.pagehelper.version}
+
+
\ No newline at end of file
diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/biz/model/IdleBeatParam.java b/xxl-job-core/src/main/java/com/xxl/job/core/biz/model/IdleBeatParam.java
index 80cd288d..8c540ff5 100644
--- a/xxl-job-core/src/main/java/com/xxl/job/core/biz/model/IdleBeatParam.java
+++ b/xxl-job-core/src/main/java/com/xxl/job/core/biz/model/IdleBeatParam.java
@@ -10,18 +10,18 @@ public class IdleBeatParam implements Serializable {
public IdleBeatParam() {
}
- public IdleBeatParam(int jobId) {
+ public IdleBeatParam(long jobId) {
this.jobId = jobId;
}
- private int jobId;
+ private long jobId;
- public int getJobId() {
+ public long getJobId() {
return jobId;
}
- public void setJobId(int jobId) {
+ public void setJobId(long jobId) {
this.jobId = jobId;
}
diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/biz/model/KillParam.java b/xxl-job-core/src/main/java/com/xxl/job/core/biz/model/KillParam.java
index b0d96e36..c85abd4d 100644
--- a/xxl-job-core/src/main/java/com/xxl/job/core/biz/model/KillParam.java
+++ b/xxl-job-core/src/main/java/com/xxl/job/core/biz/model/KillParam.java
@@ -10,18 +10,18 @@ public class KillParam implements Serializable {
public KillParam() {
}
- public KillParam(int jobId) {
+ public KillParam(long jobId) {
this.jobId = jobId;
}
- private int jobId;
+ private long jobId;
- public int getJobId() {
+ public long getJobId() {
return jobId;
}
- public void setJobId(int jobId) {
+ public void setJobId(long jobId) {
this.jobId = jobId;
}
diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/biz/model/TriggerParam.java b/xxl-job-core/src/main/java/com/xxl/job/core/biz/model/TriggerParam.java
index 4f56368a..d69c0cc6 100644
--- a/xxl-job-core/src/main/java/com/xxl/job/core/biz/model/TriggerParam.java
+++ b/xxl-job-core/src/main/java/com/xxl/job/core/biz/model/TriggerParam.java
@@ -8,7 +8,7 @@ import java.io.Serializable;
public class TriggerParam implements Serializable{
private static final long serialVersionUID = 42L;
- private int jobId;
+ private long jobId;
private String executorHandler;
private String executorParams;
@@ -26,11 +26,11 @@ public class TriggerParam implements Serializable{
private int broadcastTotal;
- public int getJobId() {
+ public long getJobId() {
return jobId;
}
- public void setJobId(int jobId) {
+ public void setJobId(long jobId) {
this.jobId = jobId;
}
diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java b/xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java
index 86936365..3500cf99 100644
--- a/xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java
+++ b/xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java
@@ -86,7 +86,7 @@ public class XxlJobExecutor {
// destory jobThreadRepository
if (jobThreadRepository.size() > 0) {
- for (Map.Entry item: jobThreadRepository.entrySet()) {
+ for (Map.Entry item: jobThreadRepository.entrySet()) {
JobThread oldJobThread = removeJobThread(item.getKey(), "web container destroy and kill the job.");
// wait for job thread push result to callback queue
if (oldJobThread != null) {
@@ -174,8 +174,8 @@ public class XxlJobExecutor {
// ---------------------- job thread repository ----------------------
- private static ConcurrentMap jobThreadRepository = new ConcurrentHashMap();
- public static JobThread registJobThread(int jobId, IJobHandler handler, String removeOldReason){
+ private static ConcurrentMap jobThreadRepository = new ConcurrentHashMap();
+ public static JobThread registJobThread(long jobId, IJobHandler handler, String removeOldReason){
JobThread newJobThread = new JobThread(jobId, handler);
newJobThread.start();
logger.info(">>>>>>>>>>> xxl-job regist JobThread success, jobId:{}, handler:{}", new Object[]{jobId, handler});
@@ -188,7 +188,7 @@ public class XxlJobExecutor {
return newJobThread;
}
- public static JobThread removeJobThread(int jobId, String removeOldReason){
+ public static JobThread removeJobThread(long jobId, String removeOldReason){
JobThread oldJobThread = jobThreadRepository.remove(jobId);
if (oldJobThread != null) {
oldJobThread.toStop(removeOldReason);
@@ -198,7 +198,7 @@ public class XxlJobExecutor {
}
return null;
}
- public static JobThread loadJobThread(int jobId){
+ public static JobThread loadJobThread(long jobId){
JobThread jobThread = jobThreadRepository.get(jobId);
return jobThread;
}
diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java b/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java
index 452c3877..8b4c72c0 100644
--- a/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java
+++ b/xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java
@@ -15,12 +15,12 @@ import java.io.File;
*/
public class ScriptJobHandler extends IJobHandler {
- private int jobId;
+ private long jobId;
private long glueUpdatetime;
private String gluesource;
private GlueTypeEnum glueType;
- public ScriptJobHandler(int jobId, long glueUpdatetime, String gluesource, GlueTypeEnum glueType){
+ public ScriptJobHandler(long jobId, long glueUpdatetime, String gluesource, GlueTypeEnum glueType){
this.jobId = jobId;
this.glueUpdatetime = glueUpdatetime;
this.gluesource = gluesource;
diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java b/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java
index 126fd143..2e53d9c2 100644
--- a/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java
+++ b/xxl-job-core/src/main/java/com/xxl/job/core/thread/JobThread.java
@@ -27,7 +27,7 @@ import java.util.concurrent.*;
public class JobThread extends Thread{
private static Logger logger = LoggerFactory.getLogger(JobThread.class);
- private int jobId;
+ private long jobId;
private IJobHandler handler;
private LinkedBlockingQueue triggerQueue;
private Set triggerLogIdSet; // avoid repeat trigger for the same TRIGGER_LOG_ID
@@ -39,7 +39,7 @@ public class JobThread extends Thread{
private int idleTimes = 0; // idel times
- public JobThread(int jobId, IJobHandler handler) {
+ public JobThread(long jobId, IJobHandler handler) {
this.jobId = jobId;
this.handler = handler;
this.triggerQueue = new LinkedBlockingQueue();
diff --git a/xxl-job-core/src/main/java/com/xxl/job/core/util/DateUtil.java b/xxl-job-core/src/main/java/com/xxl/job/core/util/DateUtil.java
index 71afe0a6..b8c4fc57 100644
--- a/xxl-job-core/src/main/java/com/xxl/job/core/util/DateUtil.java
+++ b/xxl-job-core/src/main/java/com/xxl/job/core/util/DateUtil.java
@@ -143,6 +143,10 @@ public class DateUtil {
return add(date, Calendar.MINUTE, amount);
}
+ public static Date addSecond(final Date date, final int amount) {
+ return add(date, Calendar.SECOND, amount);
+ }
+
private static Date add(final Date date, final int calendarField, final int amount) {
if (date == null) {
return null;