diff --git a/doc/db/tables_xxl_job.sql b/doc/db/tables_xxl_job.sql index 64af82d0..2aa94a91 100644 --- a/doc/db/tables_xxl_job.sql +++ b/doc/db/tables_xxl_job.sql @@ -111,10 +111,11 @@ CREATE TABLE `xxl_job_lock` ( CREATE TABLE `xxl_job_machine` ( `machine_ip` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主机IP', - `machine_id` int(11) 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 + PRIMARY KEY (`machine_ip`) USING BTREE, + UNIQUE INDEX `index_machine_id`(`machine_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/doc/db/tables_xxl_job_oracle.sql b/doc/db/tables_xxl_job_oracle.sql index 6f8569f6..a7a82265 100644 --- a/doc/db/tables_xxl_job_oracle.sql +++ b/doc/db/tables_xxl_job_oracle.sql @@ -270,7 +270,7 @@ CREATE UNIQUE INDEX I_USERNAME DROP TABLE XXL_JOB_MACHINE; CREATE TABLE XXL_JOB_MACHINE ( MACHINE_IP NVARCHAR2(16) NOT NULL , - MACHINE_ID NUMBER(11) NOT NULL , + MACHINE_ID NUMBER(4) NOT NULL , ADD_TIME DATE NOT NULL , HEART_LAST_TIME DATE NOT NULL ); @@ -284,6 +284,9 @@ COMMENT ON COLUMN XXL_JOB_MACHINE.HEART_LAST_TIME IS '最后一次心跳时间'; -- ---------------------------- 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 -- ---------------------------- 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/core/id/HeartBeat.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/id/HeartBeat.java index 3bc9f5bb..c1052076 100644 --- 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 @@ -3,6 +3,7 @@ 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; @@ -15,15 +16,18 @@ import com.xxl.job.admin.core.util.MachineUtils; @EnableScheduling public class HeartBeat { + @Value("${server.port}") + private String serverPort; + @Autowired private MachineService machineService; @Scheduled(fixedDelay = 10000) public void checkMachineSurvive() { - String machineIp = MachineUtils.getIP(); - XxlJobMachine xxlJobMachine = machineService.selectByMachineIp(machineIp); + String machineIpStr = MachineUtils.getIPAndPort(serverPort); + XxlJobMachine xxlJobMachine = machineService.selectByMachineIp(machineIpStr); if (xxlJobMachine != null) { - machineService.update(machineIp, new Date()); + 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/impl/MachineServiceImpl.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/id/impl/MachineServiceImpl.java index 7488e274..79b281cf 100644 --- 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 @@ -7,6 +7,7 @@ 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; @@ -18,6 +19,9 @@ public class MachineServiceImpl implements MachineService { private final Logger logger = LoggerFactory.getLogger(MachineServiceImpl.class); + @Value("${server.port}") + private String serverPort; + @Autowired private XxlJobMachineDao xxlJobMachineDao; @@ -43,37 +47,43 @@ public class MachineServiceImpl implements MachineService { @Override public Integer getInitMachineId() { - XxlJobMachine xxlJobMachine = selectByMachineIp(MachineUtils.getIP()); + String ipStr = MachineUtils.getIPAndPort(serverPort); + XxlJobMachine xxlJobMachine = selectByMachineIp(ipStr); Date nowDate = new Date(); int machineId = -1; if(xxlJobMachine != null){ - update(MachineUtils.getIP(),nowDate); + update(ipStr,nowDate); machineId = xxlJobMachine.getMachineId(); }else{ xxlJobMachine = new XxlJobMachine(); - xxlJobMachine.setMachineIp(MachineUtils.getIP()); + 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(1000)+1); + 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); - System.exit(0); } } + if(!flag) { + logger.error("多次获取machineId失败,退出程序"); + System.exit(0); + } } return machineId; } 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 index 98fdd731..5b664a5a 100644 --- 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 @@ -18,6 +18,10 @@ 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) {