diff --git a/openjob-common/pom.xml b/openjob-common/pom.xml
index f1ac8062..a97d835f 100644
--- a/openjob-common/pom.xml
+++ b/openjob-common/pom.xml
@@ -5,7 +5,7 @@
openjob
io.openjob
- 1.0.7
+ 1.0.8
4.0.0
openjob-common
diff --git a/openjob-common/src/test/java/io/openjob/common/util/DateUtilTest.java b/openjob-common/src/test/java/io/openjob/common/util/DateUtilTest.java
index db8a65e9..0577a8d5 100644
--- a/openjob-common/src/test/java/io/openjob/common/util/DateUtilTest.java
+++ b/openjob-common/src/test/java/io/openjob/common/util/DateUtilTest.java
@@ -15,7 +15,7 @@
public class DateUtilTest {
@Test
public void testFormatDateByTimestamp() {
- Integer dateTime = DateUtil.formatDateByTimestamp(DateUtil.timestamp());
+ Integer dateTime = DateUtil.formatDateByTimestamp(DateUtil.timestamp()* 1000);
Integer HourTime = DateUtil.formatHourByTimestamp(DateUtil.timestamp());
Assertions.assertNotNull(dateTime);
diff --git a/openjob-server/openjob-server-admin/pom.xml b/openjob-server/openjob-server-admin/pom.xml
index 7c5c3948..d5ec4d48 100644
--- a/openjob-server/openjob-server-admin/pom.xml
+++ b/openjob-server/openjob-server-admin/pom.xml
@@ -5,7 +5,7 @@
openjob-server
io.openjob
- 1.0.7
+ 1.0.8
4.0.0
openjob-server-admin
diff --git a/openjob-server/openjob-server-admin/src/main/java/io/openjob/server/admin/request/job/DeleteJobRequest.java b/openjob-server/openjob-server-admin/src/main/java/io/openjob/server/admin/request/job/DeleteJobRequest.java
index 4899499d..99d259f8 100644
--- a/openjob-server/openjob-server-admin/src/main/java/io/openjob/server/admin/request/job/DeleteJobRequest.java
+++ b/openjob-server/openjob-server-admin/src/main/java/io/openjob/server/admin/request/job/DeleteJobRequest.java
@@ -6,7 +6,7 @@
import javax.validation.constraints.NotNull;
/**
- * @author zhenghongyang
+ * @author zhenghongyang sakuraovq@gmail.com
* @since 1.0.0
*/
@Data
diff --git a/openjob-server/openjob-server-admin/src/main/java/io/openjob/server/admin/request/job/ListJobRequest.java b/openjob-server/openjob-server-admin/src/main/java/io/openjob/server/admin/request/job/ListJobRequest.java
index 0e226428..09072447 100644
--- a/openjob-server/openjob-server-admin/src/main/java/io/openjob/server/admin/request/job/ListJobRequest.java
+++ b/openjob-server/openjob-server-admin/src/main/java/io/openjob/server/admin/request/job/ListJobRequest.java
@@ -9,7 +9,7 @@
import javax.validation.constraints.NotNull;
/**
- * @author zhenghongyang
+ * @author zhenghongyang sakuraovq@gmail.com
* @since 1.0.0
*/
@Data
diff --git a/openjob-server/openjob-server-admin/src/main/java/io/openjob/server/admin/request/job/UpdateJobStatusRequest.java b/openjob-server/openjob-server-admin/src/main/java/io/openjob/server/admin/request/job/UpdateJobStatusRequest.java
index 55a6f61e..ce95d446 100644
--- a/openjob-server/openjob-server-admin/src/main/java/io/openjob/server/admin/request/job/UpdateJobStatusRequest.java
+++ b/openjob-server/openjob-server-admin/src/main/java/io/openjob/server/admin/request/job/UpdateJobStatusRequest.java
@@ -6,7 +6,7 @@
import javax.validation.constraints.NotNull;
/**
- * @author zhenghongyang
+ * @author zhenghongyang sakuraovq@gmail.com
* @since 1.0.0
*/
@Data
diff --git a/openjob-server/openjob-server-admin/src/main/java/io/openjob/server/admin/service/JobService.java b/openjob-server/openjob-server-admin/src/main/java/io/openjob/server/admin/service/JobService.java
index d387825f..8963abf0 100644
--- a/openjob-server/openjob-server-admin/src/main/java/io/openjob/server/admin/service/JobService.java
+++ b/openjob-server/openjob-server-admin/src/main/java/io/openjob/server/admin/service/JobService.java
@@ -17,7 +17,7 @@
import io.openjob.server.common.vo.PageVO;
/**
- * @author zhenghongyang
+ * @author zhenghongyang sakuraovq@gmail.com
* @since 1.0.0
*/
public interface JobService {
diff --git a/openjob-server/openjob-server-admin/src/main/java/io/openjob/server/admin/service/impl/AppServiceImpl.java b/openjob-server/openjob-server-admin/src/main/java/io/openjob/server/admin/service/impl/AppServiceImpl.java
index de4b6031..b476a185 100644
--- a/openjob-server/openjob-server-admin/src/main/java/io/openjob/server/admin/service/impl/AppServiceImpl.java
+++ b/openjob-server/openjob-server-admin/src/main/java/io/openjob/server/admin/service/impl/AppServiceImpl.java
@@ -34,7 +34,7 @@
import java.util.stream.Collectors;
/**
- * @author zhenghongyang
+ * @author zhenghongyang sakuraovq@gmail.com
* @since 1.0.0
*/
@Service
diff --git a/openjob-server/openjob-server-admin/src/main/java/io/openjob/server/admin/service/impl/JobServiceImpl.java b/openjob-server/openjob-server-admin/src/main/java/io/openjob/server/admin/service/impl/JobServiceImpl.java
index 08ceac41..7bdd1089 100644
--- a/openjob-server/openjob-server-admin/src/main/java/io/openjob/server/admin/service/impl/JobServiceImpl.java
+++ b/openjob-server/openjob-server-admin/src/main/java/io/openjob/server/admin/service/impl/JobServiceImpl.java
@@ -66,7 +66,7 @@
import java.util.stream.Collectors;
/**
- * @author zhenghongyang
+ * @author zhenghongyang sakuraovq@gmail.com
* @since 1.0.0
*/
@Slf4j
diff --git a/openjob-server/openjob-server-admin/src/main/java/io/openjob/server/admin/vo/job/ListJobVO.java b/openjob-server/openjob-server-admin/src/main/java/io/openjob/server/admin/vo/job/ListJobVO.java
index 98cd52c2..65845ea6 100644
--- a/openjob-server/openjob-server-admin/src/main/java/io/openjob/server/admin/vo/job/ListJobVO.java
+++ b/openjob-server/openjob-server-admin/src/main/java/io/openjob/server/admin/vo/job/ListJobVO.java
@@ -4,7 +4,7 @@
import lombok.Data;
/**
- * @author zhenghongyang
+ * @author zhenghongyang sakuraovq@gmail.com
* @since 1.0.0
*/
@Data
diff --git a/openjob-server/openjob-server-admin/src/main/java/io/openjob/server/admin/vo/job/UpdateJobStatusVO.java b/openjob-server/openjob-server-admin/src/main/java/io/openjob/server/admin/vo/job/UpdateJobStatusVO.java
index f8438861..4f16a97f 100644
--- a/openjob-server/openjob-server-admin/src/main/java/io/openjob/server/admin/vo/job/UpdateJobStatusVO.java
+++ b/openjob-server/openjob-server-admin/src/main/java/io/openjob/server/admin/vo/job/UpdateJobStatusVO.java
@@ -3,7 +3,7 @@
import lombok.Data;
/**
- * @author zhenghongyang
+ * @author zhenghongyang sakuraovq@gmail.com
* @since 1.0.0
*/
@Data
diff --git a/openjob-server/openjob-server-alarm/pom.xml b/openjob-server/openjob-server-alarm/pom.xml
index 47e0fe99..356dd637 100644
--- a/openjob-server/openjob-server-alarm/pom.xml
+++ b/openjob-server/openjob-server-alarm/pom.xml
@@ -5,7 +5,7 @@
openjob-server
io.openjob
- 1.0.7
+ 1.0.8
4.0.0
openjob-server-alarm
diff --git a/openjob-server/openjob-server-cluster/pom.xml b/openjob-server/openjob-server-cluster/pom.xml
index 0d79e4b1..7cdeb828 100644
--- a/openjob-server/openjob-server-cluster/pom.xml
+++ b/openjob-server/openjob-server-cluster/pom.xml
@@ -5,7 +5,7 @@
openjob-server
io.openjob
- 1.0.7
+ 1.0.8
4.0.0
diff --git a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/ClusterServer.java b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/ClusterServer.java
index 6fe434c8..f845c852 100644
--- a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/ClusterServer.java
+++ b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/ClusterServer.java
@@ -8,7 +8,7 @@
import akka.routing.RoundRobinPool;
import com.typesafe.config.Config;
import io.openjob.common.constant.AkkaConstant;
-import io.openjob.server.cluster.manager.FailManager;
+import io.openjob.server.cluster.common.FailCommon;
import io.openjob.server.cluster.service.ClusterService;
import io.openjob.server.cluster.service.JoinService;
import io.openjob.server.common.ClusterContext;
@@ -29,16 +29,16 @@ public class ClusterServer {
private final ActorSystem actorSystem;
private final SchedulerProperties schedulerProperties;
private final JoinService joinService;
- private final FailManager failManager;
+ private final FailCommon failCommon;
private final ClusterService clusterService;
@Autowired
- public ClusterServer(ActorSystem actorSystem, SchedulerProperties schedulerProperties, JoinService joinService, FailManager failManager, ClusterService clusterService) {
+ public ClusterServer(ActorSystem actorSystem, SchedulerProperties schedulerProperties, JoinService joinService, FailCommon failCommon, ClusterService clusterService) {
this.actorSystem = actorSystem;
this.schedulerProperties = schedulerProperties;
this.joinService = joinService;
- this.failManager = failManager;
+ this.failCommon = failCommon;
this.clusterService = clusterService;
}
@@ -148,7 +148,7 @@ private void registerCoordinatedShutdown() {
.addTask(CoordinatedShutdown.PhaseServiceUnbind(),
"coordinated-shutdown-hook",
() -> {
- this.failManager.shutdown(ClusterContext.getCurrentNode());
+ this.failCommon.shutdown(ClusterContext.getCurrentNode());
return Future.successful(Done.done());
});
}
diff --git a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/manager/FailManager.java b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/common/FailCommon.java
similarity index 96%
rename from openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/manager/FailManager.java
rename to openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/common/FailCommon.java
index 4dd0ba02..6b1be1c0 100644
--- a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/manager/FailManager.java
+++ b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/common/FailCommon.java
@@ -1,4 +1,4 @@
-package io.openjob.server.cluster.manager;
+package io.openjob.server.cluster.common;
import com.google.common.collect.Maps;
import io.openjob.common.OpenjobSpringContext;
@@ -33,7 +33,7 @@
*/
@Slf4j
@Component
-public class FailManager {
+public class FailCommon {
private final ServerDAO serverDAO;
private final JobSlotsDAO jobSlotsDAO;
private final ClusterProperties clusterProperties;
@@ -41,7 +41,7 @@ public class FailManager {
private final Scheduler scheduler;
@Autowired
- public FailManager(ServerDAO serverDAO, JobSlotsDAO jobSlotsDAO, ClusterProperties clusterProperties, RefreshData refreshData, Scheduler scheduler) {
+ public FailCommon(ServerDAO serverDAO, JobSlotsDAO jobSlotsDAO, ClusterProperties clusterProperties, RefreshData refreshData, Scheduler scheduler) {
this.serverDAO = serverDAO;
this.jobSlotsDAO = jobSlotsDAO;
this.clusterProperties = clusterProperties;
diff --git a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/manager/JoinManager.java b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/common/JoinCommon.java
similarity index 96%
rename from openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/manager/JoinManager.java
rename to openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/common/JoinCommon.java
index 6d829816..6212f300 100644
--- a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/manager/JoinManager.java
+++ b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/common/JoinCommon.java
@@ -1,4 +1,4 @@
-package io.openjob.server.cluster.manager;
+package io.openjob.server.cluster.common;
import com.google.common.collect.Maps;
import io.openjob.common.OpenjobSpringContext;
@@ -29,7 +29,7 @@
*/
@Slf4j
@Component
-public class JoinManager {
+public class JoinCommon {
private final ServerDAO serverDAO;
private final JobSlotsDAO jobSlotsDAO;
private final RefreshData refreshData;
@@ -39,7 +39,7 @@ public class JoinManager {
* Refresh status.
*/
@Autowired
- public JoinManager(ServerDAO serverDAO, JobSlotsDAO jobSlotsDAO, RefreshData refreshData, ClusterProperties clusterProperties) {
+ public JoinCommon(ServerDAO serverDAO, JobSlotsDAO jobSlotsDAO, RefreshData refreshData, ClusterProperties clusterProperties) {
this.serverDAO = serverDAO;
this.jobSlotsDAO = jobSlotsDAO;
this.refreshData = refreshData;
diff --git a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/dto/WorkerHeartbeatReqDTO.java b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/dto/WorkerHeartbeatReqDTO.java
new file mode 100644
index 00000000..a2ba9d1c
--- /dev/null
+++ b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/dto/WorkerHeartbeatReqDTO.java
@@ -0,0 +1,25 @@
+package io.openjob.server.cluster.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author stelin swoft@qq.com
+ * @since 1.0.8
+ */
+@Data
+public class WorkerHeartbeatReqDTO {
+ private Long appId;
+
+ private String appName;
+
+ private String address;
+
+ private String version;
+
+ /**
+ * Running job instance ids.
+ */
+ private List runningJobInstanceIds;
+}
diff --git a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/dto/WorkerHeartbeatRespDTO.java b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/dto/WorkerHeartbeatRespDTO.java
new file mode 100644
index 00000000..dc5d854d
--- /dev/null
+++ b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/dto/WorkerHeartbeatRespDTO.java
@@ -0,0 +1,28 @@
+package io.openjob.server.cluster.dto;
+
+import lombok.Data;
+
+import java.util.Set;
+
+/**
+ * @author stelin swoft@qq.com
+ * @since 1.0.8
+ */
+@Data
+public class WorkerHeartbeatRespDTO {
+
+ /**
+ * Worker address list.
+ */
+ private Set workerAddressList;
+
+ /**
+ * Cluster version
+ */
+ private Long clusterVersion;
+
+ /**
+ * Cluster delay version
+ */
+ private Long clusterDelayVersion;
+}
diff --git a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/dto/WorkerJobInstanceStatusReqDTO.java b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/dto/WorkerJobInstanceStatusReqDTO.java
new file mode 100644
index 00000000..7ae79b1f
--- /dev/null
+++ b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/dto/WorkerJobInstanceStatusReqDTO.java
@@ -0,0 +1,47 @@
+package io.openjob.server.cluster.dto;
+
+import io.openjob.common.constant.FailStatusEnum;
+import io.openjob.common.constant.InstanceStatusEnum;
+import lombok.Data;
+
+/**
+ * @author stelin swoft@qq.com
+ * @since 1.0.8
+ */
+@Data
+public class WorkerJobInstanceStatusReqDTO {
+ /**
+ * Job id.
+ */
+ private Long jobId;
+
+ /**
+ * Job instance id.
+ */
+ private Long jobInstanceId;
+
+ /**
+ * Current circleId.
+ * Only for second delay task.
+ */
+ private Long circleId;
+
+ /**
+ * Job instance status.
+ *
+ * @see InstanceStatusEnum
+ */
+ private Integer status;
+
+ /**
+ * Fail status
+ *
+ * @see FailStatusEnum#getStatus()
+ */
+ private Integer failStatus;
+
+ /**
+ * Result
+ */
+ private String result;
+}
diff --git a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/dto/WorkerJobInstanceStatusRespDTO.java b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/dto/WorkerJobInstanceStatusRespDTO.java
new file mode 100644
index 00000000..c1b5e58d
--- /dev/null
+++ b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/dto/WorkerJobInstanceStatusRespDTO.java
@@ -0,0 +1,11 @@
+package io.openjob.server.cluster.dto;
+
+import lombok.Data;
+
+/**
+ * @author stelin swoft@qq.com
+ * @since 1.0.8
+ */
+@Data
+public class WorkerJobInstanceStatusRespDTO {
+}
diff --git a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/dto/WorkerJobInstanceTaskBatchReqDTO.java b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/dto/WorkerJobInstanceTaskBatchReqDTO.java
new file mode 100644
index 00000000..da386134
--- /dev/null
+++ b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/dto/WorkerJobInstanceTaskBatchReqDTO.java
@@ -0,0 +1,80 @@
+package io.openjob.server.cluster.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author stelin swoft@qq.com
+ * @since 1.0.8
+ */
+@Data
+public class WorkerJobInstanceTaskBatchReqDTO {
+ private List taskRequestList;
+
+ @Data
+ public static class WorkerJobInstanceTaskReqDTO {
+ /**
+ * Job id.
+ */
+ private Long jobId;
+
+ /**
+ * Job instance id.
+ */
+ private Long jobInstanceId;
+
+ /**
+ * Dispatch version
+ */
+ private Long dispatchVersion;
+
+ /**
+ * Only for second delay task.
+ */
+ private Long circleId;
+
+ /**
+ * Task unique id.
+ * like 'jobId_instanceId_taskId_circleId'
+ */
+ private String taskId;
+
+ /**
+ * Task parent unique id.
+ * like 'jobId_instanceId_taskId_circleId'
+ */
+ private String parentTaskId;
+
+ /**
+ * Task name.
+ * Only for map reduce task.
+ */
+ private String taskName;
+
+ /**
+ * Task status.
+ */
+ private Integer status;
+
+ /**
+ * Task result.
+ */
+ private String result;
+
+ /**
+ * Task worker address
+ */
+ private String workerAddress;
+
+ /**
+ * Task create time.
+ */
+ private Long createTime;
+
+ /**
+ * Task update time.
+ */
+ private Long updateTime;
+ }
+}
diff --git a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/dto/WorkerJobInstanceTaskBatchRespDTO.java b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/dto/WorkerJobInstanceTaskBatchRespDTO.java
new file mode 100644
index 00000000..9ddc161c
--- /dev/null
+++ b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/dto/WorkerJobInstanceTaskBatchRespDTO.java
@@ -0,0 +1,11 @@
+package io.openjob.server.cluster.dto;
+
+import lombok.Data;
+
+/**
+ * @author stelin swoft@qq.com
+ * @since 1.0.8
+ */
+@Data
+public class WorkerJobInstanceTaskBatchRespDTO {
+}
diff --git a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/dto/WorkerJobInstanceTaskLogReqDTO.java b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/dto/WorkerJobInstanceTaskLogReqDTO.java
new file mode 100644
index 00000000..05769919
--- /dev/null
+++ b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/dto/WorkerJobInstanceTaskLogReqDTO.java
@@ -0,0 +1,20 @@
+package io.openjob.server.cluster.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author stelin swoft@qq.com
+ * @since 1.0.8
+ */
+@Data
+public class WorkerJobInstanceTaskLogReqDTO {
+ private List> fieldList;
+
+ @Data
+ public static class WorkerJobInstanceTaskLogFieldReqDTO {
+ private String name;
+ private String value;
+ }
+}
diff --git a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/dto/WorkerJobInstanceTaskLogRespDTO.java b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/dto/WorkerJobInstanceTaskLogRespDTO.java
new file mode 100644
index 00000000..ba8c49de
--- /dev/null
+++ b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/dto/WorkerJobInstanceTaskLogRespDTO.java
@@ -0,0 +1,11 @@
+package io.openjob.server.cluster.dto;
+
+import lombok.Data;
+
+/**
+ * @author stelin swoft@qq.com
+ * @since 1.0.8
+ */
+@Data
+public class WorkerJobInstanceTaskLogRespDTO {
+}
diff --git a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/dto/WorkerStartReqDTO.java b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/dto/WorkerStartReqDTO.java
new file mode 100644
index 00000000..4b4e748b
--- /dev/null
+++ b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/dto/WorkerStartReqDTO.java
@@ -0,0 +1,20 @@
+package io.openjob.server.cluster.dto;
+
+import lombok.Data;
+
+/**
+ * @author stelin swoft@qq.com
+ * @since 1.0.8
+ */
+@Data
+public class WorkerStartReqDTO {
+ private String workerKey;
+
+ private String appName;
+
+ private String address;
+
+ private String version;
+
+ private String protocolType;
+}
diff --git a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/dto/WorkerStartRespDTO.java b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/dto/WorkerStartRespDTO.java
new file mode 100644
index 00000000..902ed22a
--- /dev/null
+++ b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/dto/WorkerStartRespDTO.java
@@ -0,0 +1,16 @@
+package io.openjob.server.cluster.dto;
+
+import lombok.Data;
+
+import java.util.Set;
+
+/**
+ * @author stelin swoft@qq.com
+ * @since 1.0.8
+ */
+@Data
+public class WorkerStartRespDTO {
+ private Long appId;
+ private String appName;
+ private Set workerAddressList;
+}
diff --git a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/dto/WorkerStopReqDTO.java b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/dto/WorkerStopReqDTO.java
new file mode 100644
index 00000000..3a93556e
--- /dev/null
+++ b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/dto/WorkerStopReqDTO.java
@@ -0,0 +1,14 @@
+package io.openjob.server.cluster.dto;
+
+import lombok.Data;
+
+/**
+ * @author stelin swoft@qq.com
+ * @since 1.0.8
+ */
+@Data
+public class WorkerStopReqDTO {
+ private String workerKey;
+ private String appName;
+ private String address;
+}
diff --git a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/dto/WorkerStopRespDTO.java b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/dto/WorkerStopRespDTO.java
new file mode 100644
index 00000000..d2d53905
--- /dev/null
+++ b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/dto/WorkerStopRespDTO.java
@@ -0,0 +1,11 @@
+package io.openjob.server.cluster.dto;
+
+import lombok.Data;
+
+/**
+ * @author stelin swoft@qq.com
+ * @since 1.0.8
+ */
+@Data
+public class WorkerStopRespDTO {
+}
diff --git a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/executor/WorkerHeartbeatExecutor.java b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/executor/WorkerHeartbeatExecutor.java
index bc610495..7ae4583f 100644
--- a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/executor/WorkerHeartbeatExecutor.java
+++ b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/executor/WorkerHeartbeatExecutor.java
@@ -1,7 +1,7 @@
package io.openjob.server.cluster.executor;
-import io.openjob.common.request.WorkerHeartbeatRequest;
import io.openjob.common.task.TaskQueue;
+import io.openjob.server.cluster.dto.WorkerHeartbeatReqDTO;
import io.openjob.server.cluster.task.WorkerHeartConsumer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@@ -13,7 +13,7 @@
@Slf4j
@Component
public class WorkerHeartbeatExecutor {
- private final TaskQueue queue;
+ private final TaskQueue queue;
/**
* New
@@ -39,7 +39,7 @@ public WorkerHeartbeatExecutor() {
*
* @param request request
*/
- public void submit(WorkerHeartbeatRequest request) {
+ public void submit(WorkerHeartbeatReqDTO request) {
try {
this.queue.submit(request);
} catch (InterruptedException e) {
diff --git a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/executor/WorkerJobInstanceExecutor.java b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/executor/WorkerJobInstanceExecutor.java
index 5da56614..7abf2d00 100644
--- a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/executor/WorkerJobInstanceExecutor.java
+++ b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/executor/WorkerJobInstanceExecutor.java
@@ -1,7 +1,7 @@
package io.openjob.server.cluster.executor;
-import io.openjob.common.request.WorkerJobInstanceStatusRequest;
import io.openjob.common.task.TaskQueue;
+import io.openjob.server.cluster.dto.WorkerJobInstanceStatusReqDTO;
import io.openjob.server.cluster.task.WorkerJobInstanceConsumer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@@ -13,7 +13,7 @@
@Slf4j
@Component
public class WorkerJobInstanceExecutor {
- private final TaskQueue queue;
+ private final TaskQueue queue;
/**
* New
@@ -39,7 +39,7 @@ public WorkerJobInstanceExecutor() {
*
* @param request request
*/
- public void submit(WorkerJobInstanceStatusRequest request) {
+ public void submit(WorkerJobInstanceStatusReqDTO request) {
try {
this.queue.submit(request);
} catch (InterruptedException e) {
diff --git a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/executor/WorkerJobInstanceTaskExecutor.java b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/executor/WorkerJobInstanceTaskExecutor.java
index 240710e5..b6c799a9 100644
--- a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/executor/WorkerJobInstanceTaskExecutor.java
+++ b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/executor/WorkerJobInstanceTaskExecutor.java
@@ -1,7 +1,7 @@
package io.openjob.server.cluster.executor;
-import io.openjob.common.request.WorkerJobInstanceTaskBatchRequest;
import io.openjob.common.task.TaskQueue;
+import io.openjob.server.cluster.dto.WorkerJobInstanceTaskBatchReqDTO;
import io.openjob.server.cluster.task.WorkerJobInstanceTaskConsumer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@@ -13,7 +13,7 @@
@Slf4j
@Component
public class WorkerJobInstanceTaskExecutor {
- private final TaskQueue queue;
+ private final TaskQueue queue;
/**
* New
@@ -39,7 +39,7 @@ public WorkerJobInstanceTaskExecutor() {
*
* @param request request
*/
- public void submit(WorkerJobInstanceTaskBatchRequest request) {
+ public void submit(WorkerJobInstanceTaskBatchReqDTO request) {
try {
this.queue.submit(request);
} catch (InterruptedException e) {
diff --git a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/executor/WorkerTaskLogExecutor.java b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/executor/WorkerTaskLogExecutor.java
index c25a7c99..2168f42e 100644
--- a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/executor/WorkerTaskLogExecutor.java
+++ b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/executor/WorkerTaskLogExecutor.java
@@ -1,7 +1,7 @@
package io.openjob.server.cluster.executor;
-import io.openjob.common.request.WorkerJobInstanceTaskLogRequest;
import io.openjob.common.task.TaskQueue;
+import io.openjob.server.cluster.dto.WorkerJobInstanceTaskLogReqDTO;
import io.openjob.server.cluster.task.WorkerTaskLogConsumer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@@ -13,7 +13,7 @@
@Slf4j
@Component
public class WorkerTaskLogExecutor {
- private final TaskQueue queue;
+ private final TaskQueue queue;
/**
* New
@@ -39,7 +39,7 @@ public WorkerTaskLogExecutor() {
*
* @param request request
*/
- public void submit(WorkerJobInstanceTaskLogRequest request) {
+ public void submit(WorkerJobInstanceTaskLogReqDTO request) {
try {
this.queue.submit(request);
} catch (InterruptedException e) {
diff --git a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/manager/JobInstanceManager.java b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/manager/JobInstanceManager.java
new file mode 100644
index 00000000..426f92f6
--- /dev/null
+++ b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/manager/JobInstanceManager.java
@@ -0,0 +1,124 @@
+package io.openjob.server.cluster.manager;
+
+import io.openjob.common.constant.CommonConstant;
+import io.openjob.common.constant.FailStatusEnum;
+import io.openjob.common.constant.InstanceStatusEnum;
+import io.openjob.server.alarm.constant.AlarmEventEnum;
+import io.openjob.server.alarm.dto.AlarmEventDTO;
+import io.openjob.server.alarm.event.AlarmEvent;
+import io.openjob.server.alarm.event.AlarmEventPublisher;
+import io.openjob.server.cluster.dto.WorkerJobInstanceStatusReqDTO;
+import io.openjob.server.cluster.dto.WorkerJobInstanceStatusRespDTO;
+import io.openjob.server.cluster.dto.WorkerJobInstanceTaskBatchReqDTO;
+import io.openjob.server.cluster.dto.WorkerJobInstanceTaskBatchRespDTO;
+import io.openjob.server.cluster.executor.WorkerJobInstanceExecutor;
+import io.openjob.server.cluster.executor.WorkerJobInstanceTaskExecutor;
+import io.openjob.server.repository.dao.JobInstanceDAO;
+import io.openjob.server.repository.dao.JobInstanceTaskDAO;
+import io.openjob.server.repository.entity.JobInstanceTask;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.dao.DataIntegrityViolationException;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.UnexpectedRollbackException;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * @author stelin swoft@qq.com
+ * @since 1.0.8
+ */
+@Slf4j
+@Component
+public class JobInstanceManager {
+ private final JobInstanceTaskDAO jobInstanceTaskDAO;
+ private final JobInstanceDAO jobInstanceDAO;
+ private final WorkerJobInstanceExecutor workerJobInstanceExecutor;
+ private final WorkerJobInstanceTaskExecutor workerJobInstanceTaskExecutor;
+
+ @Autowired
+ public JobInstanceManager(JobInstanceTaskDAO jobInstanceTaskDAO,
+ JobInstanceDAO jobInstanceDAO,
+ WorkerJobInstanceExecutor workerJobInstanceExecutor,
+ WorkerJobInstanceTaskExecutor workerJobInstanceTaskExecutor) {
+ this.jobInstanceTaskDAO = jobInstanceTaskDAO;
+ this.jobInstanceDAO = jobInstanceDAO;
+ this.workerJobInstanceExecutor = workerJobInstanceExecutor;
+ this.workerJobInstanceTaskExecutor = workerJobInstanceTaskExecutor;
+ }
+
+ public WorkerJobInstanceStatusRespDTO handleInstanceStatus(WorkerJobInstanceStatusReqDTO statusRequest) {
+ this.workerJobInstanceExecutor.submit(statusRequest);
+ return new WorkerJobInstanceStatusRespDTO();
+ }
+
+ @Transactional(rollbackFor = Exception.class)
+ public void handleConsumerInstanceStatus(List statusList) {
+ // Update status
+ statusList.forEach(s -> {
+ this.jobInstanceDAO.updateStatusById(s.getJobInstanceId(), s.getStatus(), s.getFailStatus());
+ this.addAlarmEvent(s);
+ });
+ }
+
+ public WorkerJobInstanceTaskBatchRespDTO handleInstanceTasks(WorkerJobInstanceTaskBatchReqDTO taskBatchRequest) {
+ this.workerJobInstanceTaskExecutor.submit(taskBatchRequest);
+ return new WorkerJobInstanceTaskBatchRespDTO();
+ }
+
+ /**
+ * Handle instance status.
+ *
+ * @param taskList task list
+ */
+ @Transactional(rollbackFor = Exception.class)
+ public void handleConsumerInstanceTasks(List taskList) {
+ List saveList = new ArrayList<>();
+ taskList.forEach(l -> l.getTaskRequestList().forEach(t -> {
+ JobInstanceTask jobInstanceTask = new JobInstanceTask();
+ jobInstanceTask.setJobId(t.getJobId());
+ jobInstanceTask.setJobInstanceId(t.getJobInstanceId());
+ jobInstanceTask.setDispatchVersion(t.getDispatchVersion());
+ jobInstanceTask.setCircleId(t.getCircleId());
+ jobInstanceTask.setTaskId(t.getTaskId());
+ jobInstanceTask.setParentTaskId(t.getParentTaskId());
+ jobInstanceTask.setTaskName(t.getTaskName());
+ jobInstanceTask.setStatus(t.getStatus());
+ jobInstanceTask.setResult(t.getResult());
+ jobInstanceTask.setWorkerAddress(t.getWorkerAddress());
+ jobInstanceTask.setDeleted(CommonConstant.NO);
+ jobInstanceTask.setDeleteTime(0L);
+ jobInstanceTask.setCreateTime(t.getCreateTime());
+ jobInstanceTask.setUpdateTime(t.getUpdateTime());
+ saveList.add(jobInstanceTask);
+ }));
+
+ try {
+ this.jobInstanceTaskDAO.batchSave(saveList);
+ } catch (DataIntegrityViolationException | UnexpectedRollbackException exception) {
+ log.warn("Data has been saved! {}", taskList);
+ }
+ }
+
+ protected void addAlarmEvent(WorkerJobInstanceStatusReqDTO statusRequest) {
+ if (InstanceStatusEnum.isFailed(statusRequest.getStatus())) {
+ AlarmEventDTO alarmEventDTO = new AlarmEventDTO();
+ alarmEventDTO.setJobUniqueId(String.valueOf(statusRequest.getJobId()));
+ alarmEventDTO.setInstanceId(String.valueOf(statusRequest.getJobInstanceId()));
+
+ // Fail status
+ if (FailStatusEnum.isExecuteTimeout(statusRequest.getFailStatus())) {
+ alarmEventDTO.setName(AlarmEventEnum.JOB_EXECUTE_TIMEOUT.getEvent());
+ } else {
+ alarmEventDTO.setName(AlarmEventEnum.JOB_EXECUTE_FAIL.getEvent());
+ }
+
+ // Event message
+ alarmEventDTO.setMessage(Optional.ofNullable(statusRequest.getResult()).orElse(""));
+ AlarmEventPublisher.publishEvent(new AlarmEvent(alarmEventDTO));
+ }
+ }
+}
diff --git a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/manager/JobInstanceTaskLogManager.java b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/manager/JobInstanceTaskLogManager.java
new file mode 100644
index 00000000..b7f63406
--- /dev/null
+++ b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/manager/JobInstanceTaskLogManager.java
@@ -0,0 +1,89 @@
+package io.openjob.server.cluster.manager;
+
+import com.google.common.collect.Lists;
+import io.openjob.common.constant.LogFieldConstant;
+import io.openjob.server.cluster.dto.WorkerJobInstanceTaskLogReqDTO;
+import io.openjob.server.cluster.dto.WorkerJobInstanceTaskLogRespDTO;
+import io.openjob.server.cluster.executor.WorkerTaskLogExecutor;
+import io.openjob.server.common.util.BeanMapperUtil;
+import io.openjob.server.log.dao.LogDAO;
+import io.openjob.server.log.dto.ProcessorLogDTO;
+import io.openjob.server.log.dto.ProcessorLogFieldDTO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+/**
+ * @author stelin swoft@qq.com
+ * @since 1.0.8
+ */
+@Slf4j
+@Component
+public class JobInstanceTaskLogManager {
+ private final LogDAO logDAO;
+ private final WorkerTaskLogExecutor executor;
+
+ @Autowired
+ public JobInstanceTaskLogManager(LogDAO logDAO, WorkerTaskLogExecutor executor) {
+ this.logDAO = logDAO;
+ this.executor = executor;
+ }
+
+ /**
+ * Handle instance log.
+ *
+ * @param logReq log request.
+ */
+ public WorkerJobInstanceTaskLogRespDTO handleInstanceTaskLog(WorkerJobInstanceTaskLogReqDTO logReq) {
+ this.executor.submit(logReq);
+ return new WorkerJobInstanceTaskLogRespDTO();
+ }
+
+ /**
+ * Batch instance log
+ *
+ * @param requests requests
+ */
+ public void batchInstanceTaskLog(List requests) {
+ List processorLogList = requests.stream().flatMap(r -> r.getFieldList().stream().map(fields -> {
+ // Field map.
+ Map> fieldMap = fields.stream()
+ .collect(Collectors.groupingBy(WorkerJobInstanceTaskLogReqDTO.WorkerJobInstanceTaskLogFieldReqDTO::getName));
+
+ // Task id.
+ String taskId = Optional.ofNullable(fieldMap.get(LogFieldConstant.TASK_ID))
+ .orElseGet(() -> Lists.newArrayList(new WorkerJobInstanceTaskLogReqDTO.WorkerJobInstanceTaskLogFieldReqDTO()))
+ .get(0).getValue();
+
+ // Worker address.
+ String workerAddress = Optional.ofNullable(fieldMap.get(LogFieldConstant.WORKER_ADDRESS))
+ .orElseGet(() -> Lists.newArrayList(new WorkerJobInstanceTaskLogReqDTO.WorkerJobInstanceTaskLogFieldReqDTO()))
+ .get(0).getValue();
+
+ // Time
+ String timeStamp = Optional.ofNullable(fieldMap.get(LogFieldConstant.TIME_STAMP))
+ .orElseGet(() -> Lists.newArrayList(new WorkerJobInstanceTaskLogReqDTO.WorkerJobInstanceTaskLogFieldReqDTO()))
+ .get(0).getValue();
+
+ ProcessorLogDTO processorLog = new ProcessorLogDTO();
+ processorLog.setTaskId(taskId);
+ processorLog.setWorkerAddress(workerAddress);
+ processorLog.setTime(Long.valueOf(timeStamp));
+ processorLog.setFields(BeanMapperUtil.mapList(fields, WorkerJobInstanceTaskLogReqDTO.WorkerJobInstanceTaskLogFieldReqDTO.class, ProcessorLogFieldDTO.class));
+ return processorLog;
+ })).collect(Collectors.toList());
+
+ try {
+ logDAO.batchAdd(processorLogList);
+ } catch (Exception e) {
+ log.error("Batch add task log failed!", e);
+ throw new RuntimeException(e);
+ }
+
+ }
+}
diff --git a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/manager/WorkerHeartbeatManager.java b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/manager/WorkerHeartbeatManager.java
new file mode 100644
index 00000000..ff964cd1
--- /dev/null
+++ b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/manager/WorkerHeartbeatManager.java
@@ -0,0 +1,98 @@
+package io.openjob.server.cluster.manager;
+
+import io.openjob.common.request.WorkerHeartbeatRequest;
+import io.openjob.common.response.ServerHeartbeatResponse;
+import io.openjob.common.response.ServerHeartbeatSystemResponse;
+import io.openjob.common.util.DateUtil;
+import io.openjob.server.cluster.dto.WorkerHeartbeatReqDTO;
+import io.openjob.server.cluster.dto.WorkerHeartbeatRespDTO;
+import io.openjob.server.cluster.executor.WorkerHeartbeatExecutor;
+import io.openjob.server.cluster.util.ClusterUtil;
+import io.openjob.server.common.ClusterContext;
+import io.openjob.server.common.dto.SystemDTO;
+import io.openjob.server.repository.dao.JobInstanceDAO;
+import io.openjob.server.repository.dao.WorkerDAO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author stelin swoft@qq.com
+ * @since 1.0.8
+ */
+@Slf4j
+@Component
+public class WorkerHeartbeatManager {
+ private final WorkerDAO workerDAO;
+ private final JobInstanceDAO jobInstanceDAO;
+ private final WorkerHeartbeatExecutor workerHeartbeatExecutor;
+
+ @Autowired
+ public WorkerHeartbeatManager(WorkerDAO workerDAO,
+ JobInstanceDAO jobInstanceDAO,
+ WorkerHeartbeatExecutor workerHeartbeatExecutor) {
+ this.workerDAO = workerDAO;
+ this.jobInstanceDAO = jobInstanceDAO;
+ this.workerHeartbeatExecutor = workerHeartbeatExecutor;
+ }
+
+ /**
+ * Worker heartbeat
+ *
+ * @param heartbeatReq heartbeat request.
+ */
+ public WorkerHeartbeatRespDTO workerHeartbeat(WorkerHeartbeatReqDTO heartbeatReq) {
+ //Submit request
+ this.workerHeartbeatExecutor.submit(heartbeatReq);
+
+
+ // System information.
+ SystemDTO system = ClusterContext.getSystem();
+
+ // Online workers and exclude start worker.
+ Set onlineWorkers = ClusterUtil.getOnlineWorkers(heartbeatReq.getAppId());
+
+ WorkerHeartbeatRespDTO respDTO = new WorkerHeartbeatRespDTO();
+ respDTO.setClusterVersion(system.getClusterVersion());
+ respDTO.setClusterDelayVersion(system.getClusterDelayVersion());
+ respDTO.setWorkerAddressList(onlineWorkers);
+ return respDTO;
+ }
+
+ /**
+ * Batch heartbeat
+ *
+ * @param requests requests
+ */
+ @Transactional(rollbackFor = Exception.class)
+ public void batchHeartbeat(List requests) {
+ Long timestamp = DateUtil.timestamp();
+ Set addressList = new HashSet<>();
+ Set instanceIds = new HashSet<>();
+
+ // Merge requests
+ requests.forEach(r -> {
+ addressList.add(r.getAddress());
+ if (!CollectionUtils.isEmpty(r.getRunningJobInstanceIds())) {
+ instanceIds.addAll(r.getRunningJobInstanceIds());
+ }
+ });
+
+ // Worker heartbeat
+ if (!CollectionUtils.isEmpty(addressList)) {
+ this.workerDAO.updateLastHeartbeatTimeByAddresses(new ArrayList<>(addressList), timestamp);
+ }
+
+ // Instance last report time.
+ if (!CollectionUtils.isEmpty(instanceIds)) {
+ this.jobInstanceDAO.updateLastReportTimeByIds(new ArrayList<>(instanceIds), timestamp);
+ }
+ }
+}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/service/impl/OpenapiWorkerServiceImpl.java b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/manager/WorkerManager.java
similarity index 55%
rename from openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/service/impl/OpenapiWorkerServiceImpl.java
rename to openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/manager/WorkerManager.java
index 9452e863..25b3c2fb 100644
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/service/impl/OpenapiWorkerServiceImpl.java
+++ b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/manager/WorkerManager.java
@@ -1,37 +1,29 @@
-package io.openjob.server.openapi.service.impl;
+package io.openjob.server.cluster.manager;
import io.openjob.common.OpenjobSpringContext;
import io.openjob.common.constant.CommonConstant;
import io.openjob.common.util.DateUtil;
+import io.openjob.server.cluster.autoconfigure.ClusterProperties;
+import io.openjob.server.cluster.data.RefreshData;
+import io.openjob.server.cluster.dto.WorkerFailDTO;
+import io.openjob.server.cluster.dto.WorkerJoinDTO;
+import io.openjob.server.cluster.dto.WorkerStartReqDTO;
+import io.openjob.server.cluster.dto.WorkerStartRespDTO;
+import io.openjob.server.cluster.dto.WorkerStopReqDTO;
+import io.openjob.server.cluster.dto.WorkerStopRespDTO;
+import io.openjob.server.cluster.util.ClusterUtil;
import io.openjob.server.common.ClusterContext;
-import io.openjob.server.common.dto.SystemDTO;
import io.openjob.server.common.util.SlotsUtil;
-import io.openjob.server.openapi.autoconfigure.ClusterProperties;
-import io.openjob.server.openapi.dto.WorkerFailDTO;
-import io.openjob.server.openapi.dto.WorkerJoinDTO;
-import io.openjob.server.openapi.executor.OpenapiWorkerHeartbeatExecutor;
-import io.openjob.server.openapi.manager.OpenapiRefreshManager;
-import io.openjob.server.openapi.request.WorkerHeartbeatRequest;
-import io.openjob.server.openapi.request.WorkerStartRequest;
-import io.openjob.server.openapi.request.WorkerStopRequest;
-import io.openjob.server.openapi.service.OpenapiWorkerService;
-import io.openjob.server.openapi.util.ClusterUtil;
-import io.openjob.server.openapi.vo.ServerHeartbeatVO;
-import io.openjob.server.openapi.vo.ServerWorkerStartVO;
-import io.openjob.server.openapi.vo.ServerWorkerStopVO;
import io.openjob.server.repository.constant.WorkerStatusEnum;
import io.openjob.server.repository.dao.AppDAO;
-import io.openjob.server.repository.dao.JobInstanceDAO;
import io.openjob.server.repository.dao.WorkerDAO;
import io.openjob.server.repository.entity.App;
import io.openjob.server.repository.entity.Worker;
-import lombok.extern.log4j.Log4j2;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
+import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
-import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
@@ -40,42 +32,36 @@
import java.util.stream.Collectors;
/**
- * @author zhenghongyang
- * @since 1.0.0
+ * @author stelin swoft@qq.com
+ * @since 1.0.8
*/
-@Service
-@Log4j2
-public class OpenapiWorkerServiceImpl implements OpenapiWorkerService {
-
+@Slf4j
+@Component
+public class WorkerManager {
private final WorkerDAO workerDAO;
private final AppDAO appDAO;
private final ClusterProperties clusterProperties;
- private final OpenapiRefreshManager refreshManager;
- private final OpenapiWorkerHeartbeatExecutor workerHeartbeatExecutor;
- private final JobInstanceDAO jobInstanceDAO;
+ private final RefreshData refreshManager;
@Autowired
- public OpenapiWorkerServiceImpl(WorkerDAO workerDAO,
- AppDAO appDAO,
- ClusterProperties clusterProperties,
- OpenapiRefreshManager refreshManager,
- OpenapiWorkerHeartbeatExecutor workerHeartbeatExecutor,
- JobInstanceDAO jobInstanceDAO) {
+ public WorkerManager(WorkerDAO workerDAO, AppDAO appDAO, ClusterProperties clusterProperties, RefreshData refreshManager) {
this.workerDAO = workerDAO;
this.appDAO = appDAO;
this.clusterProperties = clusterProperties;
this.refreshManager = refreshManager;
- this.workerHeartbeatExecutor = workerHeartbeatExecutor;
- this.jobInstanceDAO = jobInstanceDAO;
}
- @Override
- public ServerWorkerStartVO workerStart(WorkerStartRequest startRequest) {
+ /**
+ * Worker start
+ *
+ * @param reqDTO start request.
+ */
+ public WorkerStartRespDTO workerStart(WorkerStartReqDTO reqDTO) {
// Check app name.
- App app = this.checkAppName(startRequest.getAppName());
+ App app = this.checkAppName(reqDTO.getAppName());
// Do worker start.
- OpenjobSpringContext.getBean(this.getClass()).doWorkerStart(startRequest, app);
+ OpenjobSpringContext.getBean(this.getClass()).doWorkerStart(reqDTO, app);
// Akka message for worker start.
WorkerJoinDTO workerJoinDTO = new WorkerJoinDTO();
@@ -85,8 +71,8 @@ public ServerWorkerStartVO workerStart(WorkerStartRequest startRequest) {
// Online workers and exclude start worker.
Set onlineWorkers = ClusterUtil.getOnlineWorkers(app.getId());
- // VO
- ServerWorkerStartVO response = new ServerWorkerStartVO();
+ // Response
+ WorkerStartRespDTO response = new WorkerStartRespDTO();
response.setAppId(app.getId());
response.setAppName(app.getName());
response.setWorkerAddressList(onlineWorkers);
@@ -96,23 +82,27 @@ public ServerWorkerStartVO workerStart(WorkerStartRequest startRequest) {
/**
* Do worker start.
*
- * @param workerStartRequest workerStartRequest
+ * @param reqDTO reqDTO
*/
- @Transactional(rollbackFor = Exception.class, timeout = 1)
- public void doWorkerStart(WorkerStartRequest workerStartRequest, App app) {
+ @Transactional(rollbackFor = Exception.class)
+ public void doWorkerStart(WorkerStartReqDTO reqDTO, App app) {
// Refresh system.
// Lock system cluster version.
this.refreshManager.refreshSystem(true);
// Update worker status.
- this.updateWorkerForStart(workerStartRequest, app);
+ this.updateWorkerForStart(reqDTO, app);
// Refresh cluster context.
refreshClusterContext();
}
- @Override
- public ServerWorkerStopVO workerStop(WorkerStopRequest stopReq) {
+ /**
+ * Worker stop
+ *
+ * @param stopReq stop request.
+ */
+ public WorkerStopRespDTO workerStop(WorkerStopReqDTO stopReq) {
// Check app name.
this.checkAppName(stopReq.getAppName());
@@ -123,28 +113,7 @@ public ServerWorkerStopVO workerStop(WorkerStopRequest stopReq) {
WorkerFailDTO workerFailDTO = new WorkerFailDTO();
workerFailDTO.setClusterVersion(ClusterContext.getSystem().getClusterVersion());
ClusterUtil.sendMessage(workerFailDTO, ClusterContext.getCurrentNode(), this.clusterProperties.getSpreadSize(), new HashSet<>());
-
- return new ServerWorkerStopVO();
- }
-
- @Override
- public ServerHeartbeatVO workerHeartbeat(WorkerHeartbeatRequest workerHeartbeatRequest) {
- //Submit request
- this.workerHeartbeatExecutor.submit(workerHeartbeatRequest);
-
- ServerHeartbeatVO response = new ServerHeartbeatVO();
- ServerHeartbeatVO.HeartbeatSystemVO systemResponse = new ServerHeartbeatVO.HeartbeatSystemVO();
-
- // System information.
- SystemDTO system = ClusterContext.getSystem();
- systemResponse.setClusterVersion(system.getClusterVersion());
- systemResponse.setClusterDelayVersion(system.getClusterDelayVersion());
- response.setSystemResponse(systemResponse);
-
- // Online workers and exclude start worker.
- Set onlineWorkers = ClusterUtil.getOnlineWorkers(workerHeartbeatRequest.getAppId());
- response.setWorkerAddressList(onlineWorkers);
- return response;
+ return new WorkerStopRespDTO();
}
/**
@@ -153,7 +122,7 @@ public ServerHeartbeatVO workerHeartbeat(WorkerHeartbeatRequest workerHeartbeatR
* @param stopReq stopReq
*/
@Transactional(rollbackFor = Exception.class)
- public void doWorkerStop(WorkerStopRequest stopReq) {
+ public void doWorkerStop(WorkerStopReqDTO stopReq) {
// Refresh system.
// Lock system cluster version.
this.refreshManager.refreshSystem(true);
@@ -173,37 +142,6 @@ public void doWorkerStop(WorkerStopRequest stopReq) {
this.refreshClusterContext();
}
- /**
- * Batch heartbeat
- *
- * @param requests requests
- */
- @Override
- @Transactional(rollbackFor = Exception.class)
- public void batchHeartbeat(List requests) {
- Long timestamp = DateUtil.timestamp();
- Set addressList = new HashSet<>();
- Set instanceIds = new HashSet<>();
-
- // Merge requests
- requests.forEach(r -> {
- addressList.add(r.getAddress());
- if (!CollectionUtils.isEmpty(r.getRunningJobInstanceIds())) {
- instanceIds.addAll(r.getRunningJobInstanceIds());
- }
- });
-
- // Worker heartbeat
- if (!CollectionUtils.isEmpty(addressList)) {
- this.workerDAO.updateLastHeartbeatTimeByAddresses(new ArrayList<>(addressList), timestamp);
- }
-
- // Instance last report time.
- if (!CollectionUtils.isEmpty(instanceIds)) {
- this.jobInstanceDAO.updateLastReportTimeByIds(new ArrayList<>(instanceIds), timestamp);
- }
- }
-
private void refreshClusterContext() {
List workers = workerDAO.listOnlineWorkers();
ClusterUtil.refreshAppWorkers(workers);
@@ -225,7 +163,7 @@ private App checkAppName(String appName) {
return app;
}
- private void updateWorkerForStart(WorkerStartRequest startReq, App app) {
+ private void updateWorkerForStart(WorkerStartReqDTO startReq, App app) {
// Update worker.
long now = DateUtil.timestamp();
Worker worker = workerDAO.getByAddress(startReq.getAddress());
diff --git a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/service/ClusterService.java b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/service/ClusterService.java
index 0cd553c7..a14cd0de 100644
--- a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/service/ClusterService.java
+++ b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/service/ClusterService.java
@@ -8,7 +8,7 @@
import io.openjob.server.cluster.dto.NodeShutdownDTO;
import io.openjob.server.cluster.dto.WorkerFailDTO;
import io.openjob.server.cluster.dto.WorkerJoinDTO;
-import io.openjob.server.cluster.manager.FailManager;
+import io.openjob.server.cluster.common.FailCommon;
import io.openjob.server.cluster.data.RefreshData;
import io.openjob.server.cluster.util.ClusterUtil;
import io.openjob.server.common.ClusterContext;
@@ -32,7 +32,7 @@ public class ClusterService {
private final RefreshData refreshData;
private final Scheduler scheduler;
private final ClusterProperties clusterProperties;
- private final FailManager failManager;
+ private final FailCommon failCommon;
/**
* Refresh status.
@@ -41,11 +41,11 @@ public class ClusterService {
private final AtomicBoolean nodeRunning = new AtomicBoolean(false);
@Autowired
- public ClusterService(RefreshData refreshData, Scheduler scheduler, ClusterProperties clusterProperties, FailManager failManager) {
+ public ClusterService(RefreshData refreshData, Scheduler scheduler, ClusterProperties clusterProperties, FailCommon failCommon) {
this.refreshData = refreshData;
this.scheduler = scheduler;
this.clusterProperties = clusterProperties;
- this.failManager = failManager;
+ this.failCommon = failCommon;
}
/**
@@ -161,7 +161,7 @@ public void receiveNodeShutdown(NodeShutdownDTO shutdown) {
stopNode.setAkkaAddress(shutdown.getAkkaAddress());
stopNode.setIp(shutdown.getIp());
stopNode.setServerId(shutdown.getServerId());
- this.failManager.fail(stopNode);
+ this.failCommon.fail(stopNode);
}
/**
diff --git a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/service/HealthService.java b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/service/HealthService.java
index 36e44f03..696437e3 100644
--- a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/service/HealthService.java
+++ b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/service/HealthService.java
@@ -10,8 +10,8 @@
import io.openjob.server.cluster.autoconfigure.ClusterProperties;
import io.openjob.server.cluster.dto.NodePingDTO;
import io.openjob.server.cluster.dto.NodePongDTO;
-import io.openjob.server.cluster.manager.FailManager;
-import io.openjob.server.cluster.manager.JoinManager;
+import io.openjob.server.cluster.common.FailCommon;
+import io.openjob.server.cluster.common.JoinCommon;
import io.openjob.server.cluster.util.ClusterUtil;
import io.openjob.server.common.ClusterContext;
import io.openjob.server.common.constant.AkkaConfigConstant;
@@ -38,21 +38,21 @@
@Log4j2
@Service
public class HealthService {
- private final FailManager failManager;
+ private final FailCommon failCommon;
private final ServerReportsDAO serverReportsDAO;
private final ClusterProperties clusterProperties;
private final JobSlotsDAO jobSlotsDAO;
- private final JoinManager joinManager;
+ private final JoinCommon joinCommon;
private final ActorSystem actorSystem;
@Autowired
- public HealthService(ServerReportsDAO serverReportsDAO, FailManager failManager, ClusterProperties clusterProperties, JobSlotsDAO jobSlotsDAO, JoinManager joinManager, ActorSystem actorSystem) {
+ public HealthService(ServerReportsDAO serverReportsDAO, FailCommon failCommon, ClusterProperties clusterProperties, JobSlotsDAO jobSlotsDAO, JoinCommon joinCommon, ActorSystem actorSystem) {
this.serverReportsDAO = serverReportsDAO;
- this.failManager = failManager;
+ this.failCommon = failCommon;
this.clusterProperties = clusterProperties;
this.jobSlotsDAO = jobSlotsDAO;
- this.joinManager = joinManager;
+ this.joinCommon = joinCommon;
this.actorSystem = actorSystem;
}
@@ -123,7 +123,7 @@ public void checkFailReports(Long failServerId, Node failNode) {
// Offline
if (reportsCount > this.clusterProperties.getNodeFailTimes()) {
- this.failManager.fail(failNode);
+ this.failCommon.fail(failNode);
}
}
@@ -155,7 +155,7 @@ public void checkOnline(Node reportNode) {
Config config = this.actorSystem.settings().config();
Integer bindPort = config.getInt(AkkaConfigConstant.AKKA_CANONICAL_PORT);
String bindHostname = config.getString(AkkaConfigConstant.AKKA_CANONICAL_HOSTNAME);
- this.joinManager.join(bindHostname, bindPort);
+ this.joinCommon.join(bindHostname, bindPort);
}
}
}
\ No newline at end of file
diff --git a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/service/JobInstanceService.java b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/service/JobInstanceService.java
index dc355135..0f0341e9 100644
--- a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/service/JobInstanceService.java
+++ b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/service/JobInstanceService.java
@@ -1,29 +1,14 @@
package io.openjob.server.cluster.service;
-import io.openjob.common.constant.CommonConstant;
-import io.openjob.common.constant.FailStatusEnum;
-import io.openjob.common.constant.InstanceStatusEnum;
import io.openjob.common.request.WorkerJobInstanceStatusRequest;
import io.openjob.common.request.WorkerJobInstanceTaskBatchRequest;
-import io.openjob.server.alarm.constant.AlarmEventEnum;
-import io.openjob.server.alarm.dto.AlarmEventDTO;
-import io.openjob.server.alarm.event.AlarmEvent;
-import io.openjob.server.alarm.event.AlarmEventPublisher;
-import io.openjob.server.cluster.executor.WorkerJobInstanceExecutor;
-import io.openjob.server.cluster.executor.WorkerJobInstanceTaskExecutor;
-import io.openjob.server.repository.dao.JobInstanceDAO;
-import io.openjob.server.repository.dao.JobInstanceTaskDAO;
-import io.openjob.server.repository.entity.JobInstanceTask;
+import io.openjob.server.cluster.dto.WorkerJobInstanceStatusReqDTO;
+import io.openjob.server.cluster.dto.WorkerJobInstanceTaskBatchReqDTO;
+import io.openjob.server.cluster.manager.JobInstanceManager;
+import io.openjob.server.common.util.BeanMapperUtil;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.stereotype.Service;
-import org.springframework.transaction.UnexpectedRollbackException;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Optional;
/**
* @author stelin swoft@qq.com
@@ -32,96 +17,19 @@
@Service
@Log4j2
public class JobInstanceService {
- private final JobInstanceTaskDAO jobInstanceTaskDAO;
- private final JobInstanceDAO jobInstanceDAO;
- private final WorkerJobInstanceExecutor workerJobInstanceExecutor;
- private final WorkerJobInstanceTaskExecutor workerJobInstanceTaskExecutor;
+ private final JobInstanceManager jobInstanceManager;
@Autowired
- public JobInstanceService(JobInstanceTaskDAO jobInstanceTaskDAO,
- JobInstanceDAO jobInstanceDAO,
- WorkerJobInstanceExecutor workerJobInstanceExecutor,
- WorkerJobInstanceTaskExecutor workerJobInstanceTaskExecutor) {
- this.jobInstanceTaskDAO = jobInstanceTaskDAO;
- this.jobInstanceDAO = jobInstanceDAO;
- this.workerJobInstanceExecutor = workerJobInstanceExecutor;
- this.workerJobInstanceTaskExecutor = workerJobInstanceTaskExecutor;
+ public JobInstanceService(JobInstanceManager jobInstanceManager) {
+ this.jobInstanceManager = jobInstanceManager;
}
- @Transactional(rollbackFor = Exception.class, timeout = 1)
public void handleInstanceStatus(WorkerJobInstanceStatusRequest statusRequest) {
- this.workerJobInstanceExecutor.submit(statusRequest);
+ this.jobInstanceManager.handleInstanceStatus(BeanMapperUtil.map(statusRequest, WorkerJobInstanceStatusReqDTO.class));
}
- /**
- * Handle instance status.
- *
- * @param statusList status request.
- */
- @Transactional(rollbackFor = Exception.class)
- public void handleConsumerInstanceStatus(List statusList) {
- // Update status
- statusList.forEach(s -> {
- this.jobInstanceDAO.updateStatusById(s.getJobInstanceId(), s.getStatus(), s.getFailStatus());
- this.addAlarmEvent(s);
- });
- }
- @Transactional(rollbackFor = Exception.class, timeout = 1)
public void handleInstanceTasks(WorkerJobInstanceTaskBatchRequest taskBatchRequest) {
- this.workerJobInstanceTaskExecutor.submit(taskBatchRequest);
- }
-
- /**
- * Handle instance status.
- *
- * @param taskList task list
- */
- @Transactional(rollbackFor = Exception.class)
- public void handleConsumerInstanceTasks(List taskList) {
- List saveList = new ArrayList<>();
- taskList.forEach(l -> l.getTaskRequestList().forEach(t -> {
- JobInstanceTask jobInstanceTask = new JobInstanceTask();
- jobInstanceTask.setJobId(t.getJobId());
- jobInstanceTask.setJobInstanceId(t.getJobInstanceId());
- jobInstanceTask.setDispatchVersion(t.getDispatchVersion());
- jobInstanceTask.setCircleId(t.getCircleId());
- jobInstanceTask.setTaskId(t.getTaskId());
- jobInstanceTask.setParentTaskId(t.getParentTaskId());
- jobInstanceTask.setTaskName(t.getTaskName());
- jobInstanceTask.setStatus(t.getStatus());
- jobInstanceTask.setResult(t.getResult());
- jobInstanceTask.setWorkerAddress(t.getWorkerAddress());
- jobInstanceTask.setDeleted(CommonConstant.NO);
- jobInstanceTask.setDeleteTime(0L);
- jobInstanceTask.setCreateTime(t.getCreateTime());
- jobInstanceTask.setUpdateTime(t.getUpdateTime());
- saveList.add(jobInstanceTask);
- }));
-
- try {
- this.jobInstanceTaskDAO.batchSave(saveList);
- } catch (DataIntegrityViolationException | UnexpectedRollbackException exception) {
- log.warn("Data has been saved! {}", taskList);
- }
- }
-
- protected void addAlarmEvent(WorkerJobInstanceStatusRequest statusRequest) {
- if (InstanceStatusEnum.isFailed(statusRequest.getStatus())) {
- AlarmEventDTO alarmEventDTO = new AlarmEventDTO();
- alarmEventDTO.setJobUniqueId(String.valueOf(statusRequest.getJobId()));
- alarmEventDTO.setInstanceId(String.valueOf(statusRequest.getJobInstanceId()));
-
- // Fail status
- if (FailStatusEnum.isExecuteTimeout(statusRequest.getFailStatus())) {
- alarmEventDTO.setName(AlarmEventEnum.JOB_EXECUTE_TIMEOUT.getEvent());
- } else {
- alarmEventDTO.setName(AlarmEventEnum.JOB_EXECUTE_FAIL.getEvent());
- }
-
- // Event message
- alarmEventDTO.setMessage(Optional.ofNullable(statusRequest.getResult()).orElse(""));
- AlarmEventPublisher.publishEvent(new AlarmEvent(alarmEventDTO));
- }
+ this.jobInstanceManager.handleInstanceTasks(BeanMapperUtil.map(taskBatchRequest, WorkerJobInstanceTaskBatchReqDTO.class));
}
}
diff --git a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/service/JobInstanceTaskLogService.java b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/service/JobInstanceTaskLogService.java
index 89773bd2..783ca8e7 100644
--- a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/service/JobInstanceTaskLogService.java
+++ b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/service/JobInstanceTaskLogService.java
@@ -1,23 +1,13 @@
package io.openjob.server.cluster.service;
-import com.google.common.collect.Lists;
-import io.openjob.common.constant.LogFieldConstant;
-import io.openjob.common.request.WorkerJobInstanceTaskLogFieldRequest;
import io.openjob.common.request.WorkerJobInstanceTaskLogRequest;
-import io.openjob.server.cluster.executor.WorkerTaskLogExecutor;
+import io.openjob.server.cluster.dto.WorkerJobInstanceTaskLogReqDTO;
+import io.openjob.server.cluster.manager.JobInstanceTaskLogManager;
import io.openjob.server.common.util.BeanMapperUtil;
-import io.openjob.server.log.dao.LogDAO;
-import io.openjob.server.log.dto.ProcessorLogDTO;
-import io.openjob.server.log.dto.ProcessorLogFieldDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.stream.Collectors;
-
/**
* @author stelin swoft@qq.com
* @since 1.0.0
@@ -25,60 +15,20 @@
@Slf4j
@Service
public class JobInstanceTaskLogService {
- private final LogDAO logDAO;
- private final WorkerTaskLogExecutor executor;
+ private final JobInstanceTaskLogManager jobInstanceTaskLogManager;
@Autowired
- public JobInstanceTaskLogService(LogDAO logDAO, WorkerTaskLogExecutor executor) {
- this.logDAO = logDAO;
- this.executor = executor;
+ public JobInstanceTaskLogService(JobInstanceTaskLogManager jobInstanceTaskLogManager) {
+ this.jobInstanceTaskLogManager = jobInstanceTaskLogManager;
}
+
/**
* Handle instance log.
*
* @param logReq log request.
*/
public void handleInstanceTaskLog(WorkerJobInstanceTaskLogRequest logReq) {
- this.executor.submit(logReq);
- }
-
- /**
- * Batch instance log
- *
- * @param requests requests
- */
- public void batchInstanceTaskLog(List requests) {
- List processorLogList = requests.stream().flatMap(r -> r.getFieldList().stream().map(fields -> {
- // Field map.
- Map> fieldMap = fields.stream()
- .collect(Collectors.groupingBy(WorkerJobInstanceTaskLogFieldRequest::getName));
-
- // Task id.
- String taskId = Optional.ofNullable(fieldMap.get(LogFieldConstant.TASK_ID))
- .orElseGet(() -> Lists.newArrayList(new WorkerJobInstanceTaskLogFieldRequest())).get(0).getValue();
-
- // Worker address.
- String workerAddress = Optional.ofNullable(fieldMap.get(LogFieldConstant.WORKER_ADDRESS))
- .orElseGet(() -> Lists.newArrayList(new WorkerJobInstanceTaskLogFieldRequest())).get(0).getValue();
-
- // Time
- String timeStamp = Optional.ofNullable(fieldMap.get(LogFieldConstant.TIME_STAMP))
- .orElseGet(() -> Lists.newArrayList(new WorkerJobInstanceTaskLogFieldRequest())).get(0).getValue();
-
- ProcessorLogDTO processorLog = new ProcessorLogDTO();
- processorLog.setTaskId(taskId);
- processorLog.setWorkerAddress(workerAddress);
- processorLog.setTime(Long.valueOf(timeStamp));
- processorLog.setFields(BeanMapperUtil.mapList(fields, WorkerJobInstanceTaskLogFieldRequest.class, ProcessorLogFieldDTO.class));
- return processorLog;
- })).collect(Collectors.toList());
-
- try {
- logDAO.batchAdd(processorLogList);
- } catch (Exception e) {
- log.error("Batch add task log failed!", e);
- throw new RuntimeException(e);
- }
+ this.jobInstanceTaskLogManager.handleInstanceTaskLog(BeanMapperUtil.map(logReq, WorkerJobInstanceTaskLogReqDTO.class));
}
}
diff --git a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/service/JoinService.java b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/service/JoinService.java
index 4347a0fb..efea1bb3 100644
--- a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/service/JoinService.java
+++ b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/service/JoinService.java
@@ -1,6 +1,6 @@
package io.openjob.server.cluster.service;
-import io.openjob.server.cluster.manager.JoinManager;
+import io.openjob.server.cluster.common.JoinCommon;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -12,11 +12,11 @@
@Slf4j
@Service
public class JoinService {
- private final JoinManager joinManager;
+ private final JoinCommon joinCommon;
@Autowired
- public JoinService(JoinManager joinManager) {
- this.joinManager = joinManager;
+ public JoinService(JoinCommon joinCommon) {
+ this.joinCommon = joinCommon;
}
/**
@@ -26,6 +26,6 @@ public JoinService(JoinManager joinManager) {
* @param port port
*/
public void join(String hostname, Integer port) {
- this.joinManager.join(hostname, port);
+ this.joinCommon.join(hostname, port);
}
}
diff --git a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/service/WorkerHeartbeatService.java b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/service/WorkerHeartbeatService.java
index d4b74dd8..318ec501 100644
--- a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/service/WorkerHeartbeatService.java
+++ b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/service/WorkerHeartbeatService.java
@@ -3,23 +3,13 @@
import io.openjob.common.request.WorkerHeartbeatRequest;
import io.openjob.common.response.ServerHeartbeatResponse;
import io.openjob.common.response.ServerHeartbeatSystemResponse;
-import io.openjob.common.util.DateUtil;
-import io.openjob.server.cluster.executor.WorkerHeartbeatExecutor;
-import io.openjob.server.cluster.util.ClusterUtil;
-import io.openjob.server.common.ClusterContext;
-import io.openjob.server.common.dto.SystemDTO;
-import io.openjob.server.repository.dao.JobInstanceDAO;
-import io.openjob.server.repository.dao.WorkerDAO;
+import io.openjob.server.cluster.dto.WorkerHeartbeatReqDTO;
+import io.openjob.server.cluster.dto.WorkerHeartbeatRespDTO;
+import io.openjob.server.cluster.manager.WorkerHeartbeatManager;
+import io.openjob.server.common.util.BeanMapperUtil;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
/**
* @author stelin swoft@qq.com
@@ -28,17 +18,11 @@
@Service
@Log4j2
public class WorkerHeartbeatService {
- private final WorkerDAO workerDAO;
- private final JobInstanceDAO jobInstanceDAO;
- private final WorkerHeartbeatExecutor workerHeartbeatExecutor;
+ private final WorkerHeartbeatManager workerHeartbeatManager;
@Autowired
- public WorkerHeartbeatService(WorkerDAO workerDAO,
- JobInstanceDAO jobInstanceDAO,
- WorkerHeartbeatExecutor workerHeartbeatExecutor) {
- this.workerDAO = workerDAO;
- this.jobInstanceDAO = jobInstanceDAO;
- this.workerHeartbeatExecutor = workerHeartbeatExecutor;
+ public WorkerHeartbeatService(WorkerHeartbeatManager workerHeartbeatManager) {
+ this.workerHeartbeatManager = workerHeartbeatManager;
}
/**
@@ -47,51 +31,17 @@ public WorkerHeartbeatService(WorkerDAO workerDAO,
* @param heartbeatReq heartbeat request.
*/
public ServerHeartbeatResponse workerHeartbeat(WorkerHeartbeatRequest heartbeatReq) {
- //Submit request
- this.workerHeartbeatExecutor.submit(heartbeatReq);
+ WorkerHeartbeatRespDTO workerHeartbeatRespDTO = this.workerHeartbeatManager.workerHeartbeat(BeanMapperUtil.map(heartbeatReq, WorkerHeartbeatReqDTO.class));
- ServerHeartbeatResponse response = new ServerHeartbeatResponse();
+ // System response
ServerHeartbeatSystemResponse systemResponse = new ServerHeartbeatSystemResponse();
-
- // System information.
- SystemDTO system = ClusterContext.getSystem();
- systemResponse.setClusterVersion(system.getClusterVersion());
- systemResponse.setClusterDelayVersion(system.getClusterDelayVersion());
- response.setSystemResponse(systemResponse);
-
- // Online workers and exclude start worker.
- Set onlineWorkers = ClusterUtil.getOnlineWorkers(heartbeatReq.getAppId());
- response.setWorkerAddressList(onlineWorkers);
- return response;
- }
-
- /**
- * Batch heartbeat
- *
- * @param requests requests
- */
- @Transactional(rollbackFor = Exception.class)
- public void batchHeartbeat(List requests) {
- Long timestamp = DateUtil.timestamp();
- Set addressList = new HashSet<>();
- Set instanceIds = new HashSet<>();
-
- // Merge requests
- requests.forEach(r -> {
- addressList.add(r.getAddress());
- if (!CollectionUtils.isEmpty(r.getRunningJobInstanceIds())) {
- instanceIds.addAll(r.getRunningJobInstanceIds());
- }
- });
-
- // Worker heartbeat
- if (!CollectionUtils.isEmpty(addressList)) {
- this.workerDAO.updateLastHeartbeatTimeByAddresses(new ArrayList<>(addressList), timestamp);
- }
-
- // Instance last report time.
- if (!CollectionUtils.isEmpty(instanceIds)) {
- this.jobInstanceDAO.updateLastReportTimeByIds(new ArrayList<>(instanceIds), timestamp);
- }
+ systemResponse.setClusterDelayVersion(workerHeartbeatRespDTO.getClusterDelayVersion());
+ systemResponse.setClusterVersion(workerHeartbeatRespDTO.getClusterVersion());
+
+ // Response
+ ServerHeartbeatResponse serverHeartbeatResponse = new ServerHeartbeatResponse();
+ serverHeartbeatResponse.setWorkerAddressList(workerHeartbeatRespDTO.getWorkerAddressList());
+ serverHeartbeatResponse.setSystemResponse(systemResponse);
+ return serverHeartbeatResponse;
}
}
diff --git a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/service/WorkerService.java b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/service/WorkerService.java
index 1afaa412..f04a9bbf 100644
--- a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/service/WorkerService.java
+++ b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/service/WorkerService.java
@@ -1,37 +1,29 @@
package io.openjob.server.cluster.service;
import com.google.common.collect.Lists;
-import io.openjob.common.OpenjobSpringContext;
-import io.openjob.common.constant.CommonConstant;
import io.openjob.common.request.WorkerStartRequest;
import io.openjob.common.request.WorkerStopRequest;
import io.openjob.common.response.ServerWorkerStartResponse;
import io.openjob.common.util.DateUtil;
import io.openjob.server.cluster.autoconfigure.ClusterProperties;
-import io.openjob.server.cluster.dto.WorkerFailDTO;
-import io.openjob.server.cluster.dto.WorkerJoinDTO;
-import io.openjob.server.cluster.data.RefreshData;
-import io.openjob.server.cluster.util.ClusterUtil;
+import io.openjob.server.cluster.dto.WorkerStartReqDTO;
+import io.openjob.server.cluster.dto.WorkerStartRespDTO;
+import io.openjob.server.cluster.dto.WorkerStopReqDTO;
+import io.openjob.server.cluster.manager.WorkerManager;
import io.openjob.server.common.ClusterContext;
-import io.openjob.server.common.util.SlotsUtil;
+import io.openjob.server.common.util.BeanMapperUtil;
import io.openjob.server.repository.constant.WorkerStatusEnum;
-import io.openjob.server.repository.dao.AppDAO;
import io.openjob.server.repository.dao.WorkerDAO;
-import io.openjob.server.repository.entity.App;
import io.openjob.server.repository.entity.Worker;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
-import java.util.HashSet;
import java.util.List;
import java.util.Map;
-import java.util.Objects;
import java.util.Optional;
import java.util.Set;
-import java.util.UUID;
import java.util.stream.Collectors;
/**
@@ -42,16 +34,14 @@
@Log4j2
public class WorkerService {
private final WorkerDAO workerDAO;
- private final AppDAO appDAO;
private final ClusterProperties clusterProperties;
- private final RefreshData refreshManager;
+ private final WorkerManager workerManager;
@Autowired
- public WorkerService(WorkerDAO workerDAO, AppDAO appDAO, ClusterProperties clusterProperties, RefreshData refreshManager) {
+ public WorkerService(WorkerDAO workerDAO, ClusterProperties clusterProperties, WorkerManager workerManager) {
this.workerDAO = workerDAO;
- this.appDAO = appDAO;
this.clusterProperties = clusterProperties;
- this.refreshManager = refreshManager;
+ this.workerManager = workerManager;
}
/**
@@ -60,44 +50,9 @@ public WorkerService(WorkerDAO workerDAO, AppDAO appDAO, ClusterProperties clust
* @param startRequest start request.
*/
public ServerWorkerStartResponse workerStart(WorkerStartRequest startRequest) {
- // Check app name.
- App app = this.checkAppName(startRequest.getAppName());
-
- // Do worker start.
- OpenjobSpringContext.getBean(this.getClass()).doWorkerStart(startRequest, app);
-
- // Akka message for worker start.
- WorkerJoinDTO workerJoinDTO = new WorkerJoinDTO();
- workerJoinDTO.setClusterVersion(ClusterContext.getSystem().getClusterVersion());
- ClusterUtil.sendMessage(workerJoinDTO, ClusterContext.getCurrentNode(), this.clusterProperties.getSpreadSize(), new HashSet<>());
-
- // Online workers and exclude start worker.
- Set onlineWorkers = ClusterUtil.getOnlineWorkers(app.getId());
-
- // Response
- ServerWorkerStartResponse response = new ServerWorkerStartResponse();
- response.setAppId(app.getId());
- response.setAppName(app.getName());
- response.setWorkerAddressList(onlineWorkers);
- return response;
- }
-
- /**
- * Do worker start.
- *
- * @param workerStartRequest workerStartRequest
- */
- @Transactional(rollbackFor = Exception.class)
- public void doWorkerStart(WorkerStartRequest workerStartRequest, App app) {
- // Refresh system.
- // Lock system cluster version.
- this.refreshManager.refreshSystem(true);
-
- // Update worker status.
- this.updateWorkerForStart(workerStartRequest, app);
-
- // Refresh cluster context.
- refreshClusterContext();
+ WorkerStartReqDTO reqDTO = BeanMapperUtil.map(startRequest, WorkerStartReqDTO.class);
+ WorkerStartRespDTO workerStartRespDTO = this.workerManager.workerStart(reqDTO);
+ return BeanMapperUtil.map(workerStartRespDTO, ServerWorkerStartResponse.class);
}
/**
@@ -106,45 +61,9 @@ public void doWorkerStart(WorkerStartRequest workerStartRequest, App app) {
* @param stopReq stop request.
*/
public void workerStop(WorkerStopRequest stopReq) {
- // Check app name.
- this.checkAppName(stopReq.getAppName());
-
- // Do worker stop.
- OpenjobSpringContext.getBean(this.getClass()).doWorkerStop(stopReq);
-
- // Akka message for worker start.
- WorkerFailDTO workerFailDTO = new WorkerFailDTO();
- workerFailDTO.setClusterVersion(ClusterContext.getSystem().getClusterVersion());
- ClusterUtil.sendMessage(workerFailDTO, ClusterContext.getCurrentNode(), this.clusterProperties.getSpreadSize(), new HashSet<>());
+ this.workerManager.workerStop(BeanMapperUtil.map(stopReq, WorkerStopReqDTO.class));
}
- /**
- * Do worker stop.
- *
- * @param stopReq stopReq
- */
- @Transactional(rollbackFor = Exception.class)
- public void doWorkerStop(WorkerStopRequest stopReq) {
- // Refresh system.
- // Lock system cluster version.
- this.refreshManager.refreshSystem(true);
-
- Worker worker = workerDAO.getByAddress(stopReq.getAddress());
- if (Objects.isNull(worker)) {
- log.error("worker({}) do not exist!", stopReq.getAddress());
- return;
- }
-
- // Update worker
- worker.setStatus(WorkerStatusEnum.OFFLINE.getStatus());
- worker.setUpdateTime(DateUtil.timestamp());
- workerDAO.save(worker);
-
- // Refresh cluster context.
- this.refreshClusterContext();
- }
-
-
/**
* Worker check
*/
@@ -198,68 +117,4 @@ public void workerCheck() {
}
});
}
-
- private void refreshClusterContext() {
- List workers = workerDAO.listOnlineWorkers();
- ClusterUtil.refreshAppWorkers(workers);
-
- log.info("Refresh app workers={}", workers.stream().map(Worker::getAddress).collect(Collectors.toList()));
- }
-
- /**
- * Check app name.
- *
- * @param appName app name.
- * @return App
- */
- private App checkAppName(String appName) {
- App app = appDAO.getAppByName(appName);
- if (Objects.isNull(app)) {
- throw new RuntimeException(String.format("Register application(%s) do not exist!", appName));
- }
- return app;
- }
-
- private void updateWorkerForStart(WorkerStartRequest startReq, App app) {
- // Update worker.
- long now = DateUtil.timestamp();
- Worker worker = workerDAO.getByAddress(startReq.getAddress());
- if (Objects.nonNull(worker)) {
- worker.setWorkerKey(worker.getWorkerKey());
- worker.setStatus(WorkerStatusEnum.ONLINE.getStatus());
-
- //Must update last heartbeat time.
- worker.setLastHeartbeatTime(now);
- worker.setUpdateTime(now);
-
- // Update latest app name
- worker.setAppName(startReq.getAppName());
- worker.setNamespaceId(app.getNamespaceId());
- worker.setAppId(app.getId());
- worker.setProtocolType(startReq.getProtocolType());
- workerDAO.save(worker);
- return;
- }
-
- // save
- Worker saveWorker = new Worker();
- saveWorker.setUpdateTime(now);
- saveWorker.setCreateTime(now);
- saveWorker.setWorkerKey(startReq.getWorkerKey());
- saveWorker.setAddress(startReq.getAddress());
- saveWorker.setSlotsId(SlotsUtil.getWorkerSupervisorSlotsId(UUID.randomUUID().toString()));
- saveWorker.setStatus(WorkerStatusEnum.ONLINE.getStatus());
- saveWorker.setAppId(app.getId());
- saveWorker.setAppName(startReq.getAppName());
- saveWorker.setLastHeartbeatTime(now);
- saveWorker.setNamespaceId(app.getNamespaceId());
- saveWorker.setProtocolType(startReq.getProtocolType());
- saveWorker.setVersion(startReq.getVersion());
- saveWorker.setMetric("");
- saveWorker.setVersion("");
- saveWorker.setWorkerKey("");
- saveWorker.setDeleteTime(0L);
- saveWorker.setDeleted(CommonConstant.NO);
- workerDAO.save(saveWorker);
- }
}
diff --git a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/task/WorkerHeartConsumer.java b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/task/WorkerHeartConsumer.java
index e2cee9cd..624900d0 100644
--- a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/task/WorkerHeartConsumer.java
+++ b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/task/WorkerHeartConsumer.java
@@ -1,10 +1,10 @@
package io.openjob.server.cluster.task;
import io.openjob.common.OpenjobSpringContext;
-import io.openjob.common.request.WorkerHeartbeatRequest;
import io.openjob.common.task.BaseConsumer;
import io.openjob.common.task.TaskQueue;
-import io.openjob.server.cluster.service.WorkerHeartbeatService;
+import io.openjob.server.cluster.dto.WorkerHeartbeatReqDTO;
+import io.openjob.server.cluster.manager.WorkerHeartbeatManager;
import lombok.extern.slf4j.Slf4j;
import java.util.List;
@@ -14,7 +14,7 @@
* @since 1.0.3
*/
@Slf4j
-public class WorkerHeartConsumer extends BaseConsumer {
+public class WorkerHeartConsumer extends BaseConsumer {
public WorkerHeartConsumer(Long id,
Integer consumerCoreThreadNum,
@@ -22,12 +22,12 @@ public WorkerHeartConsumer(Long id,
String consumerThreadName,
Integer pollSize,
String pollThreadName,
- TaskQueue queues) {
+ TaskQueue queues) {
super(id, consumerCoreThreadNum, consumerMaxThreadNum, consumerThreadName, pollSize, pollThreadName, queues, 2000L, 1000L);
}
@Override
- public void consume(Long id, List tasks) {
+ public void consume(Long id, List tasks) {
this.consumerExecutor.submit(new WorkerHeartbeatConsumerRunnable(tasks));
}
@@ -35,16 +35,16 @@ public void consume(Long id, List tasks) {
* Worker heartbeat runnable
*/
private static class WorkerHeartbeatConsumerRunnable implements Runnable {
- private final List tasks;
+ private final List tasks;
- private WorkerHeartbeatConsumerRunnable(List tasks) {
+ private WorkerHeartbeatConsumerRunnable(List tasks) {
this.tasks = tasks;
}
@Override
public void run() {
try {
- OpenjobSpringContext.getBean(WorkerHeartbeatService.class).batchHeartbeat(this.tasks);
+ OpenjobSpringContext.getBean(WorkerHeartbeatManager.class).batchHeartbeat(this.tasks);
} catch (Throwable throwable) {
log.error("Worker heartbeat failed!", throwable);
}
diff --git a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/task/WorkerJobInstanceConsumer.java b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/task/WorkerJobInstanceConsumer.java
index ae4a9dc4..08183e5d 100644
--- a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/task/WorkerJobInstanceConsumer.java
+++ b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/task/WorkerJobInstanceConsumer.java
@@ -1,10 +1,10 @@
package io.openjob.server.cluster.task;
import io.openjob.common.OpenjobSpringContext;
-import io.openjob.common.request.WorkerJobInstanceStatusRequest;
import io.openjob.common.task.BaseConsumer;
import io.openjob.common.task.TaskQueue;
-import io.openjob.server.cluster.service.JobInstanceService;
+import io.openjob.server.cluster.dto.WorkerJobInstanceStatusReqDTO;
+import io.openjob.server.cluster.manager.JobInstanceManager;
import lombok.extern.slf4j.Slf4j;
import java.util.List;
@@ -14,33 +14,33 @@
* @since 1.0.6
*/
@Slf4j
-public class WorkerJobInstanceConsumer extends BaseConsumer {
+public class WorkerJobInstanceConsumer extends BaseConsumer {
public WorkerJobInstanceConsumer(Long id,
Integer consumerCoreThreadNum,
Integer consumerMaxThreadNum,
String consumerThreadName,
Integer pollSize,
String pollThreadName,
- TaskQueue queues) {
+ TaskQueue queues) {
super(id, consumerCoreThreadNum, consumerMaxThreadNum, consumerThreadName, pollSize, pollThreadName, queues, 1000L, 1000L);
}
@Override
- public void consume(Long id, List tasks) {
+ public void consume(Long id, List tasks) {
this.consumerExecutor.submit(new WorkerJobInstanceConsumerRunnable(tasks));
}
private static class WorkerJobInstanceConsumerRunnable implements Runnable {
- private final List tasks;
+ private final List tasks;
- private WorkerJobInstanceConsumerRunnable(List tasks) {
+ private WorkerJobInstanceConsumerRunnable(List tasks) {
this.tasks = tasks;
}
@Override
public void run() {
try {
- OpenjobSpringContext.getBean(JobInstanceService.class).handleConsumerInstanceStatus(tasks);
+ OpenjobSpringContext.getBean(JobInstanceManager.class).handleConsumerInstanceStatus(tasks);
} catch (Throwable throwable) {
log.error("Handler consumer instance status failed!", throwable);
}
diff --git a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/task/WorkerJobInstanceTaskConsumer.java b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/task/WorkerJobInstanceTaskConsumer.java
index 1f46ac45..cf21c063 100644
--- a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/task/WorkerJobInstanceTaskConsumer.java
+++ b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/task/WorkerJobInstanceTaskConsumer.java
@@ -1,10 +1,10 @@
package io.openjob.server.cluster.task;
import io.openjob.common.OpenjobSpringContext;
-import io.openjob.common.request.WorkerJobInstanceTaskBatchRequest;
import io.openjob.common.task.BaseConsumer;
import io.openjob.common.task.TaskQueue;
-import io.openjob.server.cluster.service.JobInstanceService;
+import io.openjob.server.cluster.dto.WorkerJobInstanceTaskBatchReqDTO;
+import io.openjob.server.cluster.manager.JobInstanceManager;
import lombok.extern.slf4j.Slf4j;
import java.util.List;
@@ -14,33 +14,33 @@
* @since 1.0.6
*/
@Slf4j
-public class WorkerJobInstanceTaskConsumer extends BaseConsumer {
+public class WorkerJobInstanceTaskConsumer extends BaseConsumer {
public WorkerJobInstanceTaskConsumer(Long id,
Integer consumerCoreThreadNum,
Integer consumerMaxThreadNum,
String consumerThreadName,
Integer pollSize,
String pollThreadName,
- TaskQueue queues) {
+ TaskQueue queues) {
super(id, consumerCoreThreadNum, consumerMaxThreadNum, consumerThreadName, pollSize, pollThreadName, queues, 1000L, 1000L);
}
@Override
- public void consume(Long id, List tasks) {
+ public void consume(Long id, List tasks) {
this.consumerExecutor.submit(new WorkerJobInstanceTaskConsumerRunnable(tasks));
}
private static class WorkerJobInstanceTaskConsumerRunnable implements Runnable {
- private final List tasks;
+ private final List tasks;
- private WorkerJobInstanceTaskConsumerRunnable(List tasks) {
+ private WorkerJobInstanceTaskConsumerRunnable(List tasks) {
this.tasks = tasks;
}
@Override
public void run() {
try {
- OpenjobSpringContext.getBean(JobInstanceService.class).handleConsumerInstanceTasks(tasks);
+ OpenjobSpringContext.getBean(JobInstanceManager.class).handleConsumerInstanceTasks(tasks);
} catch (Throwable throwable) {
log.error("Handler consumer instance status failed!", throwable);
}
diff --git a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/task/WorkerTaskLogConsumer.java b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/task/WorkerTaskLogConsumer.java
index fa611969..135fc1b2 100644
--- a/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/task/WorkerTaskLogConsumer.java
+++ b/openjob-server/openjob-server-cluster/src/main/java/io/openjob/server/cluster/task/WorkerTaskLogConsumer.java
@@ -1,9 +1,10 @@
package io.openjob.server.cluster.task;
import io.openjob.common.OpenjobSpringContext;
-import io.openjob.common.request.WorkerJobInstanceTaskLogRequest;
import io.openjob.common.task.BaseConsumer;
import io.openjob.common.task.TaskQueue;
+import io.openjob.server.cluster.dto.WorkerJobInstanceTaskLogReqDTO;
+import io.openjob.server.cluster.manager.JobInstanceTaskLogManager;
import io.openjob.server.cluster.service.JobInstanceTaskLogService;
import lombok.extern.slf4j.Slf4j;
@@ -14,7 +15,7 @@
* @since 1.0.3
*/
@Slf4j
-public class WorkerTaskLogConsumer extends BaseConsumer {
+public class WorkerTaskLogConsumer extends BaseConsumer {
public WorkerTaskLogConsumer(Long id,
Integer consumerCoreThreadNum,
@@ -22,26 +23,26 @@ public WorkerTaskLogConsumer(Long id,
String consumerThreadName,
Integer pollSize,
String pollThreadName,
- TaskQueue queues) {
+ TaskQueue queues) {
super(id, consumerCoreThreadNum, consumerMaxThreadNum, consumerThreadName, pollSize, pollThreadName, queues, 1000L, 1000L);
}
@Override
- public void consume(Long id, List tasks) {
+ public void consume(Long id, List tasks) {
this.consumerExecutor.submit(new WorkerTaskLogRunnable(tasks));
}
private static class WorkerTaskLogRunnable implements Runnable {
- private final List tasks;
+ private final List tasks;
- private WorkerTaskLogRunnable(List tasks) {
+ private WorkerTaskLogRunnable(List tasks) {
this.tasks = tasks;
}
@Override
public void run() {
try {
- OpenjobSpringContext.getBean(JobInstanceTaskLogService.class).batchInstanceTaskLog(this.tasks);
+ OpenjobSpringContext.getBean(JobInstanceTaskLogManager.class).batchInstanceTaskLog(this.tasks);
} catch (Throwable throwable) {
log.error("Job instance log failed!", throwable);
}
diff --git a/openjob-server/openjob-server-common/pom.xml b/openjob-server/openjob-server-common/pom.xml
index db90d985..e4a4ef95 100644
--- a/openjob-server/openjob-server-common/pom.xml
+++ b/openjob-server/openjob-server-common/pom.xml
@@ -5,7 +5,7 @@
openjob-server
io.openjob
- 1.0.7
+ 1.0.8
4.0.0
openjob-server-common
diff --git a/openjob-server/openjob-server-dispatcher/pom.xml b/openjob-server/openjob-server-dispatcher/pom.xml
index 095a11fb..2e9bbccb 100644
--- a/openjob-server/openjob-server-dispatcher/pom.xml
+++ b/openjob-server/openjob-server-dispatcher/pom.xml
@@ -5,7 +5,7 @@
openjob-server
io.openjob
- 1.0.7
+ 1.0.8
4.0.0
diff --git a/openjob-server/openjob-server-log/pom.xml b/openjob-server/openjob-server-log/pom.xml
index 0675a884..b4e8494a 100644
--- a/openjob-server/openjob-server-log/pom.xml
+++ b/openjob-server/openjob-server-log/pom.xml
@@ -5,7 +5,7 @@
openjob-server
io.openjob
- 1.0.7
+ 1.0.8
4.0.0
openjob-server-log
diff --git a/openjob-server/openjob-server-openapi/pom.xml b/openjob-server/openjob-server-openapi/pom.xml
index 2a090fda..5f74a184 100644
--- a/openjob-server/openjob-server-openapi/pom.xml
+++ b/openjob-server/openjob-server-openapi/pom.xml
@@ -5,12 +5,17 @@
openjob-server
io.openjob
- 1.0.7
+ 1.0.8
4.0.0
openjob-server-openapi
+
+ io.openjob
+ openjob-server-cluster
+
+
io.openjob
openjob-server-repository
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/controller/OpenClusterController.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/controller/OpenClusterController.java
index 88a91a65..f0af24aa 100644
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/controller/OpenClusterController.java
+++ b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/controller/OpenClusterController.java
@@ -2,7 +2,7 @@
import io.openjob.common.response.Result;
import io.openjob.server.openapi.request.ClusterOnlineRequest;
-import io.openjob.server.openapi.service.ClusterService;
+import io.openjob.server.openapi.service.OpenClusterService;
import io.openjob.server.openapi.vo.ClusterOnlineVO;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
@@ -21,15 +21,15 @@
@Api(value = "Cluster", tags = "Cluster")
@RequestMapping("/openapi/cluster")
public class OpenClusterController {
- private final ClusterService clusterService;
+ private final OpenClusterService openClusterService;
@Autowired
- public OpenClusterController(ClusterService clusterService) {
- this.clusterService = clusterService;
+ public OpenClusterController(OpenClusterService openClusterService) {
+ this.openClusterService = openClusterService;
}
@GetMapping("/online")
public Result add(@Valid @ModelAttribute ClusterOnlineRequest clusterOnlineRequest) {
- return Result.success(this.clusterService.online(clusterOnlineRequest));
+ return Result.success(this.openClusterService.online(clusterOnlineRequest));
}
}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/controller/OpenJobInstanceController.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/controller/OpenJobInstanceController.java
index 7ebe6766..11174cc3 100644
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/controller/OpenJobInstanceController.java
+++ b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/controller/OpenJobInstanceController.java
@@ -2,16 +2,20 @@
import io.openjob.common.response.Result;
import io.openjob.server.openapi.request.WorkerJobInstanceStatusRequest;
-import io.openjob.server.openapi.vo.WorkerJobVO;
+import io.openjob.server.openapi.request.WorkerJobInstanceTaskBatchRequest;
+import io.openjob.server.openapi.service.OpenJobInstanceService;
+import io.openjob.server.openapi.vo.WorkerJobInstanceStatusVO;
+import io.openjob.server.openapi.vo.WorkerJobInstanceTaskBatchVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
- * @author zhenghongyang
+ * @author zhenghongyang sakuraovq@gmail.com
* @since 1.0.0
*/
@RestController
@@ -20,14 +24,22 @@
@Slf4j
public class OpenJobInstanceController {
- /**
- * When a client completes a task, batch reporting is used to report the task status.
- *
- * @param statusRequest status request.
- */
- @ApiOperation("update status")
- @PostMapping("/update-status")
- public Result handleStatus(WorkerJobInstanceStatusRequest statusRequest) {
- return Result.success(new WorkerJobVO());
+ private final OpenJobInstanceService openJobInstanceService;
+
+ @Autowired
+ public OpenJobInstanceController(OpenJobInstanceService openJobInstanceService) {
+ this.openJobInstanceService = openJobInstanceService;
+ }
+
+ @ApiOperation("Handle status")
+ @PostMapping("/handle-status")
+ public Result handleStatus(WorkerJobInstanceStatusRequest statusRequest) {
+ return Result.success(this.openJobInstanceService.handleStatus(statusRequest));
+ }
+
+ @ApiOperation("Handle tasks")
+ @PostMapping("/handle-tasks")
+ public Result handleTasks(WorkerJobInstanceTaskBatchRequest batchRequest) {
+ return Result.success(this.openJobInstanceService.handleTasks(batchRequest));
}
}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/controller/OpenTaskLogController.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/controller/OpenTaskLogController.java
index 36795bf4..f1df6a00 100644
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/controller/OpenTaskLogController.java
+++ b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/controller/OpenTaskLogController.java
@@ -2,15 +2,17 @@
import io.openjob.common.response.Result;
import io.openjob.server.openapi.request.WorkerJobInstanceTaskLogRequest;
-import io.openjob.server.openapi.vo.OpenTaskLogVO;
+import io.openjob.server.openapi.service.OpenTaskLogService;
+import io.openjob.server.openapi.vo.WorkerJobInstanceTaskLogVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
- * @author zhenghongyang
+ * @author zhenghongyang sakuraovq@gmail.com
* @since 1.0.0
*/
@RestController
@@ -18,6 +20,13 @@
@RequestMapping("/openapi/task-log")
public class OpenTaskLogController {
+ private final OpenTaskLogService openTaskLogService;
+
+ @Autowired
+ public OpenTaskLogController(OpenTaskLogService openTaskLogService) {
+ this.openTaskLogService = openTaskLogService;
+ }
+
/**
* During the execution of a task on the client, there is periodic real-time batch reporting of task logs.
*
@@ -25,7 +34,7 @@ public class OpenTaskLogController {
*/
@ApiOperation("batch add")
@PostMapping("/batch-add")
- public Result batchAdd(WorkerJobInstanceTaskLogRequest logRequest) {
- return Result.success(new OpenTaskLogVO());
+ public Result batchAdd(WorkerJobInstanceTaskLogRequest logRequest) {
+ return Result.success(this.openTaskLogService.batchAdd(logRequest));
}
}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/controller/OpenWorkerController.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/controller/OpenWorkerController.java
index a7d5fec6..cb94346c 100644
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/controller/OpenWorkerController.java
+++ b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/controller/OpenWorkerController.java
@@ -4,7 +4,7 @@
import io.openjob.server.openapi.request.WorkerHeartbeatRequest;
import io.openjob.server.openapi.request.WorkerStartRequest;
import io.openjob.server.openapi.request.WorkerStopRequest;
-import io.openjob.server.openapi.service.OpenapiWorkerService;
+import io.openjob.server.openapi.service.OpenWorkerService;
import io.openjob.server.openapi.vo.ServerHeartbeatVO;
import io.openjob.server.openapi.vo.ServerWorkerStartVO;
import io.openjob.server.openapi.vo.ServerWorkerStopVO;
@@ -19,7 +19,7 @@
import javax.validation.Valid;
/**
- * @author zhenghongyang
+ * @author zhenghongyang sakuraovq@gmail.com
* @since 1.0.0
*/
@RestController
@@ -28,10 +28,10 @@
@Slf4j
public class OpenWorkerController {
- private final OpenapiWorkerService workerService;
+ private final OpenWorkerService openWorkerService;
- public OpenWorkerController(OpenapiWorkerService workerService) {
- this.workerService = workerService;
+ public OpenWorkerController(OpenWorkerService openWorkerService) {
+ this.openWorkerService = openWorkerService;
}
/**
@@ -43,8 +43,7 @@ public OpenWorkerController(OpenapiWorkerService workerService) {
@ApiOperation("Worker start")
@PostMapping("/start")
public Result workerStart(@Valid @RequestBody WorkerStartRequest workerStartRequest) {
- ServerWorkerStartVO result = this.workerService.workerStart(workerStartRequest);
-
+ ServerWorkerStartVO result = this.openWorkerService.workerStart(workerStartRequest);
log.info("Worker register success! address={}", workerStartRequest.getAddress());
return Result.success(result);
}
@@ -58,8 +57,7 @@ public Result workerStart(@Valid @RequestBody WorkerStartRe
@ApiOperation("Worker stop")
@PostMapping("/stop")
public Result workerStop(@Valid @RequestBody WorkerStopRequest workerStopRequest) {
- ServerWorkerStopVO result = this.workerService.workerStop(workerStopRequest);
-
+ ServerWorkerStopVO result = this.openWorkerService.workerStop(workerStopRequest);
log.info("Worker stop success! address={}", workerStopRequest.getAddress());
return Result.success(result);
}
@@ -67,7 +65,7 @@ public Result workerStop(@Valid @RequestBody WorkerStopReque
@ApiOperation("worker heartbeat")
@PostMapping("/heartbeat")
public Result heartbeat(@Valid @RequestBody WorkerHeartbeatRequest workerHeartbeatRequest) {
- ServerHeartbeatVO result = this.workerService.workerHeartbeat(workerHeartbeatRequest);
+ ServerHeartbeatVO result = this.openWorkerService.workerHeartbeat(workerHeartbeatRequest);
return Result.success(result);
}
}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/controller/TaskMasterController.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/controller/TaskMasterController.java
deleted file mode 100644
index da670ea4..00000000
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/controller/TaskMasterController.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package io.openjob.server.openapi.controller;
-
-import io.openjob.common.request.ServerCheckTaskMasterRequest;
-import io.openjob.common.response.Result;
-import io.openjob.common.response.WorkerResponse;
-import io.openjob.server.openapi.request.ServerStopJobInstanceRequest;
-import io.openjob.server.openapi.request.ServerSubmitJobInstanceRequest;
-import io.openjob.server.openapi.vo.JobInstanceVO;
-import io.openjob.server.openapi.vo.ServerSubmitJobInstanceVO;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.validation.Valid;
-
-/**
- * @author zhenghongyang
- * @since 1.0.0
- */
-@RestController
-@Api(value = "task-master", tags = "task-master")
-@RequestMapping("/openapi/task-master")
-public class TaskMasterController {
-
- /**
- * When a scheduled task is triggered, the server will notify the client in real-time.
- *
- * @param request Server submit job instance request
- * @return Result
- */
- @ApiOperation("add")
- @PostMapping("/add")
- public Result submitJobInstance(@Valid @RequestBody ServerSubmitJobInstanceRequest request) {
- return Result.success(new ServerSubmitJobInstanceVO());
- }
-
- @ApiOperation("stop-job-instance")
- @PostMapping("/stop-job-instance")
- public Result stopJobInstance(ServerStopJobInstanceRequest stopReq) {
- return Result.success(new JobInstanceVO());
- }
-
- /**
- * In certain specific scenarios,
- * the server needs to check if the client's task instances are still active.
- * This may involve performing certain operations or checks
- * on the server side to ensure that the connection with the client is active and valid.
- *
- * @param checkRequest check request
- */
- @ApiOperation("check-job-instance")
- @PostMapping("/check-job-instance")
- public void checkJobInstance(ServerCheckTaskMasterRequest checkRequest) {
-
- }
-}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/dto/NodeFailDTO.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/dto/NodeFailDTO.java
deleted file mode 100644
index 4a2d9b5b..00000000
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/dto/NodeFailDTO.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package io.openjob.server.openapi.dto;
-
-import lombok.Data;
-
-import java.io.Serializable;
-
-/**
- * @author stelin swoft@qq.com
- * @since 1.0.0
- */
-@Data
-public class NodeFailDTO implements Serializable {
-
- /**
- * Cluster version.
- */
- private Long clusterVersion;
-
- /**
- * Fail server id.
- */
- private Long serverId;
-
- /**
- * Fail server ip.
- */
- private String ip;
-
- /**
- * Fail server akka address.
- */
- private String akkaAddress;
-}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/dto/NodeJoinDTO.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/dto/NodeJoinDTO.java
deleted file mode 100644
index a56b8818..00000000
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/dto/NodeJoinDTO.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package io.openjob.server.openapi.dto;
-
-import lombok.Data;
-
-import java.io.Serializable;
-
-/**
- * @author stelin swoft@qq.com
- * @since 1.0.0
- */
-@Data
-public class NodeJoinDTO implements Serializable {
-
- /**
- * Cluster version.
- */
- private Long clusterVersion;
-
- /**
- * Join server id.
- */
- private Long serverId;
-
- /**
- * Join server ip.
- */
- private String ip;
-
- /**
- * Join server akka address
- */
- private String akkaAddress;
-}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/dto/NodePingDTO.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/dto/NodePingDTO.java
deleted file mode 100644
index f4a17887..00000000
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/dto/NodePingDTO.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package io.openjob.server.openapi.dto;
-
-import lombok.Data;
-
-import java.io.Serializable;
-
-/**
- * @author stelin swoft@qq.com
- * @since 1.0.0
- */
-@Data
-public class NodePingDTO implements Serializable {
-
- /**
- * Cluster version.
- */
- private Long clusterVersion;
-
- /**
- * Server id.
- */
- private Long serverId;
-}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/dto/NodePongDTO.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/dto/NodePongDTO.java
deleted file mode 100644
index 55317900..00000000
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/dto/NodePongDTO.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package io.openjob.server.openapi.dto;
-
-import lombok.Data;
-
-import java.io.Serializable;
-
-/**
- * @author stelin swoft@qq.com
- * @since 1.0.0
- */
-@Data
-public class NodePongDTO implements Serializable {
-
- /**
- * Cluster version.
- */
- private Long clusterVersion;
-
- /**
- * Response server id.
- */
- private Long serverId;
-
- /**
- * Whether ping server is know.
- */
- private Boolean knowServer;
-}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/dto/NodeResponseDTO.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/dto/NodeResponseDTO.java
deleted file mode 100644
index c0ad1005..00000000
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/dto/NodeResponseDTO.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package io.openjob.server.openapi.dto;
-
-import lombok.Data;
-
-import java.io.Serializable;
-
-/**
- * @author stelin swoft@qq.com
- * @since 1.0.0
- */
-@Data
-public class NodeResponseDTO implements Serializable {
-
- /**
- * Join server id.
- */
- private Long serverId;
-
- /**
- * Join server ip.
- */
- private String ip;
-
- /**
- * Join server akka address
- */
- private String akkaAddress;
-}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/dto/NodeShutdownDTO.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/dto/NodeShutdownDTO.java
deleted file mode 100644
index ed02c2c7..00000000
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/dto/NodeShutdownDTO.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package io.openjob.server.openapi.dto;
-
-import lombok.Data;
-
-import java.io.Serializable;
-
-/**
- * @author stelin swoft@qq.com
- * @since 1.0.0
- */
-@Data
-public class NodeShutdownDTO implements Serializable {
- /**
- * Cluster version.
- */
- private Long clusterVersion;
-
- /**
- * Fail server id.
- */
- private Long serverId;
-
- /**
- * Fail server ip.
- */
- private String ip;
-
- /**
- * Fail server akka address.
- */
- private String akkaAddress;
-}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/dto/WorkerFailDTO.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/dto/WorkerFailDTO.java
deleted file mode 100644
index 50b2e3f9..00000000
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/dto/WorkerFailDTO.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package io.openjob.server.openapi.dto;
-
-import lombok.Data;
-
-import java.io.Serializable;
-
-/**
- * @author stelin swoft@qq.com
- * @since 1.0.0
- */
-@Data
-public class WorkerFailDTO implements Serializable {
-
- /**
- * Cluster version.
- */
- private Long clusterVersion;
-}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/dto/WorkerJoinDTO.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/dto/WorkerJoinDTO.java
deleted file mode 100644
index e9e7ab2e..00000000
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/dto/WorkerJoinDTO.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package io.openjob.server.openapi.dto;
-
-import lombok.Data;
-
-import java.io.Serializable;
-
-/**
- * @author stelin swoft@qq.com
- * @since 1.0.0
- */
-@Data
-public class WorkerJoinDTO implements Serializable {
-
- /**
- * Cluster version.
- */
- private Long clusterVersion;
-}
\ No newline at end of file
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/executor/OpenapiWorkerHeartbeatExecutor.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/executor/OpenapiWorkerHeartbeatExecutor.java
deleted file mode 100644
index 8b243e30..00000000
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/executor/OpenapiWorkerHeartbeatExecutor.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package io.openjob.server.openapi.executor;
-
-import io.openjob.common.task.TaskQueue;
-import io.openjob.server.openapi.request.WorkerHeartbeatRequest;
-import io.openjob.server.openapi.task.WorkerHeartConsumer;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
-
-/**
- * @author stelin swoft@qq.com
- * @since 1.0.3
- */
-@Slf4j
-@Component
-public class OpenapiWorkerHeartbeatExecutor {
- private final TaskQueue queue;
-
- /**
- * New
- */
- public OpenapiWorkerHeartbeatExecutor() {
- this.queue = new TaskQueue<>(0L, 64);
-
- //Consumer
- WorkerHeartConsumer consumer = new WorkerHeartConsumer(
- 0L,
- 1,
- 16,
- "Openjob-heartbeat-executor",
- 50,
- "Openjob-heartbeat-consumer",
- this.queue
- );
- consumer.start();
- }
-
- /**
- * Submit request
- *
- * @param request request
- */
- public void submit(WorkerHeartbeatRequest request) {
- try {
- this.queue.submit(request);
- } catch (InterruptedException e) {
- log.error("Worker heartbeat submit failed!", e);
- }
- }
-}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/manager/OpenapiFailManager.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/manager/OpenapiFailManager.java
deleted file mode 100644
index 95120508..00000000
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/manager/OpenapiFailManager.java
+++ /dev/null
@@ -1,199 +0,0 @@
-package io.openjob.server.openapi.manager;
-
-import com.google.common.collect.Maps;
-import io.openjob.common.OpenjobSpringContext;
-import io.openjob.common.context.Node;
-import io.openjob.server.common.ClusterContext;
-import io.openjob.server.openapi.autoconfigure.ClusterProperties;
-import io.openjob.server.openapi.dto.NodeFailDTO;
-import io.openjob.server.openapi.dto.NodeShutdownDTO;
-import io.openjob.server.openapi.util.ClusterUtil;
-import io.openjob.server.repository.constant.ServerStatusEnum;
-import io.openjob.server.repository.dao.JobSlotsDAO;
-import io.openjob.server.repository.dao.ServerDAO;
-import io.openjob.server.repository.entity.JobSlots;
-import io.openjob.server.repository.entity.Server;
-import io.openjob.server.scheduler.Scheduler;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * @author stelin swoft@qq.com
- * @since 1.0.0
- */
-@Slf4j
-@Component
-public class OpenapiFailManager {
- private final ServerDAO serverDAO;
- private final JobSlotsDAO jobSlotsDAO;
- private final ClusterProperties clusterProperties;
- private final OpenapiRefreshManager refreshManager;
- private final Scheduler scheduler;
-
- @Autowired
- public OpenapiFailManager(ServerDAO serverDAO, JobSlotsDAO jobSlotsDAO, ClusterProperties clusterProperties, OpenapiRefreshManager refreshManager, Scheduler scheduler) {
- this.serverDAO = serverDAO;
- this.jobSlotsDAO = jobSlotsDAO;
- this.clusterProperties = clusterProperties;
- this.refreshManager = refreshManager;
- this.scheduler = scheduler;
- }
-
- /**
- * Do fail.
- *
- * @param stopNode stopNode
- */
- public void fail(Node stopNode) {
- try {
- // Do node fail.
- boolean result = ClusterUtil.clusterNodeOperate(
- this.clusterProperties.getSpreadRetryTimes(),
- () -> OpenjobSpringContext.getBean(this.getClass()).doFail(stopNode));
-
- // Success to send cluster message.
- if (result) {
- // Akka message for stop.
- NodeFailDTO failDTO = new NodeFailDTO();
- failDTO.setClusterVersion(ClusterContext.getSystem().getClusterVersion());
- failDTO.setIp(stopNode.getIp());
- failDTO.setServerId(stopNode.getServerId());
- failDTO.setAkkaAddress(stopNode.getAkkaAddress());
-
- // Akka message for fail.
- this.sendClusterStopMessage(failDTO, stopNode);
- }
- } catch (InterruptedException interruptedException) {
- log.info("Node fail error!", interruptedException);
- }
- }
-
- /**
- * Do node fail.
- *
- * @param stopNode stopNode
- */
- @Transactional(rollbackFor = Exception.class)
- public Boolean doFail(Node stopNode) {
- // Refresh system.
- // Lock system cluster version.
- this.refreshManager.refreshSystem(true);
-
- // Update server status.
- Integer effectRows = this.serverDAO.update(stopNode.getServerId(), ServerStatusEnum.FAIL.getStatus(), ServerStatusEnum.OK.getStatus());
- if (effectRows <= 0) {
- log.info("Node has failed! {}", stopNode);
- return false;
- }
-
- log.info("Update server to fail status {}", stopNode.getServerId());
-
- // Migrate slots.
- this.migrateSlots(stopNode);
-
- // Not shutdown.
- // Refresh nodes.
- this.refreshManager.refreshClusterNodes();
-
- // Refresh slots.
- this.refreshManager.refreshCurrentSlots();
-
- // Refresh scheduler.
- this.scheduler.refresh(Collections.emptySet());
- return true;
- }
-
- /**
- * Shutdown node.
- *
- * @param stopNode stop node.
- */
- public void shutdown(Node stopNode) {
- NodeShutdownDTO shutdown = new NodeShutdownDTO();
- shutdown.setClusterVersion(ClusterContext.getSystem().getClusterVersion());
- shutdown.setIp(stopNode.getIp());
- shutdown.setServerId(stopNode.getServerId());
- shutdown.setAkkaAddress(stopNode.getAkkaAddress());
-
- // Akka message for stop.
- this.sendClusterStopMessage(shutdown, stopNode);
- }
-
- /**
- * Migrate slots.
- *
- * @param stopNode stopNode
- */
- private void migrateSlots(Node stopNode) {
- List currentJobSlots = this.jobSlotsDAO.listJobSlotsByServerId(stopNode.getServerId());
- List servers = this.serverDAO.listServers(ServerStatusEnum.OK.getStatus())
- .stream().filter(s -> !s.getId().equals(stopNode.getServerId()))
- .collect(Collectors.toList());
-
- // Exclude current server.
- int serverCount = servers.size();
-
- // Only one server.
- if (serverCount == 0) {
- jobSlotsDAO.updateByServerId(0L);
- log.info("Migrate slots to 0");
- return;
- }
-
- int index = 0;
- int slotsSize = (int) Math.floor((double) currentJobSlots.size() / serverCount);
-
- Map> migrationSlots = Maps.newHashMap();
- for (int i = 0; i < servers.size(); i++) {
- Server s = servers.get(i);
-
- // Last server.
- if (i + 1 == servers.size()) {
- List lastSlotsId = currentJobSlots.subList(index, currentJobSlots.size())
- .stream()
- .map(JobSlots::getId)
- .collect(Collectors.toList());
- migrationSlots.put(s.getId(), lastSlotsId);
- break;
- }
-
- int segmentSize = (i + 1) * slotsSize;
- List slotIds = currentJobSlots.subList(index, segmentSize)
- .stream()
- .map(JobSlots::getId)
- .collect(Collectors.toList());
-
- index = segmentSize;
- migrationSlots.put(s.getId(), slotIds);
- }
-
- migrationSlots.forEach(this.jobSlotsDAO::updateByServerId);
- log.info("Migration slots {}", migrationSlots);
- }
-
- /**
- * Send cluster stop message.
- *
- * @param message message
- * @param stopNode stop node.
- */
- private void sendClusterStopMessage(Object message, Node stopNode) {
- // Exclude current node.
- Set excludeNodes = new HashSet<>();
- excludeNodes.add(stopNode.getServerId());
-
- Boolean result = ClusterUtil.sendMessage(message, ClusterContext.getCurrentNode(), this.clusterProperties.getSpreadSize(), excludeNodes);
- if (!result) {
- log.info("Send message result is success! {} {}", message, stopNode);
- }
- }
-}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/manager/OpenapiJoinManager.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/manager/OpenapiJoinManager.java
deleted file mode 100644
index 7c576c2a..00000000
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/manager/OpenapiJoinManager.java
+++ /dev/null
@@ -1,197 +0,0 @@
-package io.openjob.server.openapi.manager;
-
-import com.google.common.collect.Maps;
-import io.openjob.common.OpenjobSpringContext;
-import io.openjob.common.context.Node;
-import io.openjob.server.common.ClusterContext;
-import io.openjob.server.openapi.autoconfigure.ClusterProperties;
-import io.openjob.server.openapi.dto.NodeJoinDTO;
-import io.openjob.server.openapi.util.ClusterUtil;
-import io.openjob.server.repository.constant.ServerStatusEnum;
-import io.openjob.server.repository.dao.JobSlotsDAO;
-import io.openjob.server.repository.dao.ServerDAO;
-import io.openjob.server.repository.entity.Server;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-
-/**
- * @author stelin swoft@qq.com
- * @since 1.0.0
- */
-@Slf4j
-@Component
-public class OpenapiJoinManager {
- private final ServerDAO serverDAO;
- private final JobSlotsDAO jobSlotsDAO;
- private final OpenapiRefreshManager refreshManager;
- private final ClusterProperties clusterProperties;
-
- /**
- * Refresh status.
- */
- @Autowired
- public OpenapiJoinManager(ServerDAO serverDAO, JobSlotsDAO jobSlotsDAO, OpenapiRefreshManager refreshManager, ClusterProperties clusterProperties) {
- this.serverDAO = serverDAO;
- this.jobSlotsDAO = jobSlotsDAO;
- this.refreshManager = refreshManager;
- this.clusterProperties = clusterProperties;
- }
-
- /**
- * Cluster node start.
- *
- * @param hostname hostname
- * @param port port
- */
- public void join(String hostname, Integer port) {
- try {
- // Do node join.
- boolean result = ClusterUtil.clusterNodeOperate(
- this.clusterProperties.getSpreadRetryTimes(),
- () -> OpenjobSpringContext.getBean(this.getClass()).doJoin(hostname, port));
-
- // Success to send cluster message.
- if (result) {
- // Akka message for join.
- this.sendClusterStartMessage();
- }
- } catch (InterruptedException interruptedException) {
- log.info("Node fail error!", interruptedException);
- }
- }
-
- /**
- * Cluster node do join.
- *
- * @param hostname hostname
- * @param port port
- */
- @Transactional(rollbackFor = Exception.class)
- public Boolean doJoin(String hostname, Integer port) {
- // Refresh system.
- // Lock system cluster version.
- this.refreshManager.refreshSystem(true);
-
- // Register server.
- Server currentServer = this.registerOrUpdateServer(hostname, port);
-
- // Migrate slots.
- List servers = this.migrateSlots(currentServer);
-
- // Set current node.
- this.setCurrentNode(currentServer);
-
- // Refresh nodes.
- ClusterUtil.refreshNodes(servers);
-
- // Refresh current slots.
- this.refreshManager.refreshCurrentSlots();
-
- // Refresh app workers;
- this.refreshManager.refreshAppWorkers();
- return true;
- }
-
- /**
- * Register server.
- * If server is exists to update.
- *
- * @param hostname server hostname.
- * @param port server port.
- * @return Server
- */
- private Server registerOrUpdateServer(String hostname, Integer port) {
- // Has been registered
- String akkaAddress = String.format("%s:%d", hostname, port);
- Optional optionalServer = serverDAO.getOne(akkaAddress);
- if (optionalServer.isPresent()) {
- // Update status
- Server server = optionalServer.get();
- Long id = server.getId();
- serverDAO.update(id, ServerStatusEnum.OK.getStatus());
- return server;
- }
-
- // First register server
- Server server = new Server();
- server.setIp(hostname);
- server.setAkkaAddress(akkaAddress);
- Long id = serverDAO.save(server);
- server.setId(id);
- return server;
- }
-
- /**
- * Calculate remove slots.
- *
- * @return slots map.
- */
- private List migrateSlots(Server currentServer) {
- Map> serverIdToSlots = Maps.newHashMap();
- jobSlotsDAO.listJobSlots().forEach(taskSlots -> {
- if (taskSlots.getServerId() > 0) {
- List slots = serverIdToSlots.computeIfAbsent(taskSlots.getServerId(), m -> new ArrayList<>());
- slots.add(taskSlots.getId());
- serverIdToSlots.put(taskSlots.getServerId(), slots);
- }
- });
-
- // Remove server slots.
- List servers = serverDAO.listServers(ServerStatusEnum.OK.getStatus());
- int slotsServerCount = servers.size() - 1;
- List migratedList = new ArrayList<>();
- serverIdToSlots.forEach((id, slots) -> {
- int migratedSize = (int) Math.floor(slots.size() * (1.0 / (slotsServerCount + 1)));
- List migratedIds = slots.subList(0, migratedSize);
- migratedList.addAll(migratedIds);
- });
-
-
- // First server node.
- if (migratedList.isEmpty()) {
- jobSlotsDAO.updateByServerId(currentServer.getId());
- return servers;
- }
-
- jobSlotsDAO.updateByServerId(currentServer.getId(), migratedList);
- return servers;
- }
-
- /**
- * Set current node.
- *
- * @param server server
- */
- private void setCurrentNode(Server server) {
- Node currentNode = new Node();
- currentNode.setServerId(server.getId());
- currentNode.setIp(server.getIp());
- currentNode.setAkkaAddress(server.getAkkaAddress());
- currentNode.setStatus(server.getStatus());
- ClusterContext.setCurrentNode(currentNode);
-
- log.info(String.format("Current node %s", server));
- }
-
- /**
- * Send start message.
- */
- private void sendClusterStartMessage() {
- Node currentNode = ClusterContext.getCurrentNode();
- NodeJoinDTO nodeJoinDTO = new NodeJoinDTO();
- nodeJoinDTO.setIp(currentNode.getIp());
- nodeJoinDTO.setClusterVersion(ClusterContext.getSystem().getClusterVersion());
- nodeJoinDTO.setServerId(currentNode.getServerId());
- nodeJoinDTO.setAkkaAddress(currentNode.getAkkaAddress());
-
- ClusterUtil.sendMessage(nodeJoinDTO, currentNode, this.clusterProperties.getSpreadSize(), new HashSet<>());
- }
-}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/manager/OpenapiRefreshManager.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/manager/OpenapiRefreshManager.java
deleted file mode 100644
index b5c1ae95..00000000
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/manager/OpenapiRefreshManager.java
+++ /dev/null
@@ -1,125 +0,0 @@
-package io.openjob.server.openapi.manager;
-
-import io.openjob.common.context.Node;
-import io.openjob.server.common.ClusterContext;
-import io.openjob.server.common.dto.SystemDTO;
-import io.openjob.server.openapi.exception.ClusterNodeOperatingException;
-import io.openjob.server.openapi.util.ClusterUtil;
-import io.openjob.server.repository.constant.ServerStatusEnum;
-import io.openjob.server.repository.dao.JobSlotsDAO;
-import io.openjob.server.repository.dao.ServerDAO;
-import io.openjob.server.repository.dao.SystemDAO;
-import io.openjob.server.repository.dao.WorkerDAO;
-import io.openjob.server.repository.entity.JobSlots;
-import io.openjob.server.repository.entity.Server;
-import io.openjob.server.repository.entity.System;
-import io.openjob.server.repository.entity.Worker;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * @author stelin swoft@qq.com
- * @since 1.0.0
- */
-@Slf4j
-@Component
-public class OpenapiRefreshManager {
-
- private final SystemDAO systemDAO;
- private final ServerDAO serverDAO;
- private final JobSlotsDAO jobSlotsDAO;
- private final WorkerDAO workerDAO;
-
- @Autowired
- public OpenapiRefreshManager(SystemDAO systemDAO, ServerDAO serverDAO, JobSlotsDAO jobSlotsDAO, WorkerDAO workerDAO) {
- this.systemDAO = systemDAO;
- this.serverDAO = serverDAO;
- this.jobSlotsDAO = jobSlotsDAO;
- this.workerDAO = workerDAO;
- }
-
- /**
- * Refresh system.
- *
- * @param isUpdateClusterVersion whether to update cluster version.
- */
- public void refreshSystem(Boolean isUpdateClusterVersion) {
- System currentSystem = this.systemDAO.getOne();
- Long currentVersion = currentSystem.getClusterVersion();
-
- // Update cluster version.
- if (isUpdateClusterVersion) {
- Integer effectRows = this.systemDAO.updateClusterVersion(currentSystem.getClusterVersion());
- // Lock cluster version fail.
- if (effectRows <= 0) {
- throw new ClusterNodeOperatingException("Node join or fail is running!");
- }
-
- // Not query db to fix repeatable read.
- currentVersion++;
- }
-
- // Refresh system.
- SystemDTO systemDTO = new SystemDTO();
- systemDTO.setMaxSlot(currentSystem.getMaxSlot());
- systemDTO.setWorkerSupervisorSlot(currentSystem.getWorkerSupervisorSlot());
- systemDTO.setDelayZsetSlot(currentSystem.getDelayZsetSlot());
- systemDTO.setDelayFailZsetSlot(currentSystem.getDelayFailZsetSlot());
- systemDTO.setDelayAddListSlot(currentSystem.getDelayAddListSlot());
- systemDTO.setDelayStatusListSlot(currentSystem.getDelayStatusListSlot());
- systemDTO.setDelayDeleteListSlot(currentSystem.getDelayDeleteListSlot());
- systemDTO.setClusterDelayVersion(currentSystem.getClusterDelayVersion());
- systemDTO.setJobKeepDays(currentSystem.getJobKeepDays());
- systemDTO.setDelayKeepDays(currentSystem.getDelayKeepDays());
- systemDTO.setServerKeepDays(currentSystem.getServerKeepDays());
- systemDTO.setWorkerKeepDays(currentSystem.getWorkerKeepDays());
- systemDTO.setClusterVersion(currentVersion);
-
- ClusterContext.refreshSystem(systemDTO);
- log.info("Refresh cluster version({}) {} ", currentSystem.getClusterVersion(), systemDTO);
- }
-
- /**
- * Refresh cluster nodes.
- */
- public void refreshClusterNodes() {
- List servers = serverDAO.listServers(ServerStatusEnum.OK.getStatus());
- ClusterUtil.refreshNodes(servers);
- log.info("Refresh nodes {}", servers);
- }
-
- /**
- * Refresh app workers.
- */
- public void refreshAppWorkers() {
- List workers = workerDAO.listOnlineWorkers();
- ClusterUtil.refreshAppWorkers(workers);
- log.info("Refresh workers {}", workers.stream().map(Worker::getAddress).collect(Collectors.toList()));
- }
-
- /**
- * Refresh current slots.
- *
- * @return remove slots.
- */
- public Set refreshCurrentSlots() {
- // Node remove slots.
- Set removeSlots = new HashSet<>(ClusterContext.getCurrentSlots());
-
- // New current slots.
- Node currentNode = ClusterContext.getCurrentNode();
- List jobSlots = jobSlotsDAO.listJobSlotsByServerId(currentNode.getServerId());
- Set newCurrentSlots = jobSlots.stream().map(JobSlots::getId).collect(Collectors.toSet());
- ClusterContext.refreshCurrentSlots(newCurrentSlots);
-
- log.info(String.format("Refresh slots %s", newCurrentSlots));
- removeSlots.removeAll(newCurrentSlots);
- return removeSlots;
- }
-}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/DelayInstanceStatusRequest.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/DelayInstanceStatusRequest.java
new file mode 100644
index 00000000..f4827727
--- /dev/null
+++ b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/DelayInstanceStatusRequest.java
@@ -0,0 +1,66 @@
+package io.openjob.server.openapi.request;
+
+import io.openjob.common.constant.FailStatusEnum;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author stelin swoft@qq.com
+ * @since 1.0.8
+ */
+@Data
+public class DelayInstanceStatusRequest {
+
+ private List list;
+
+ @Data
+ public static class DelayInstanceTaskRequest {
+ /**
+ * Topic
+ */
+ private String topic;
+
+ /**
+ * Delay id.
+ */
+ private Long delayId;
+
+ /**
+ * Delay pid
+ */
+ private Long delayPid;
+
+ /**
+ * Task id.
+ */
+ private String taskId;
+
+ /**
+ * Task status.
+ */
+ private Integer status;
+
+ /**
+ * Fail status
+ *
+ * @see FailStatusEnum#getStatus()
+ */
+ private Integer failStatus;
+
+ /**
+ * Task result.
+ */
+ private String result;
+
+ /**
+ * Worker address
+ */
+ private String workerAddress;
+
+ /**
+ * Complete time
+ */
+ private Long completeTime;
+ }
+}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/DelayPullInstanceRequest.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/DelayPullInstanceRequest.java
new file mode 100644
index 00000000..4ac5250f
--- /dev/null
+++ b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/DelayPullInstanceRequest.java
@@ -0,0 +1,21 @@
+package io.openjob.server.openapi.request;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author stelin swoft@qq.com
+ * @since 1.0.8
+ */
+@Data
+public class DelayPullInstanceRequest {
+ private String workerAddress;
+ private List list;
+
+ @Data
+ public static class DelayPullTopicItemRequest {
+ private String topic;
+ private Integer size;
+ }
+}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/DelayPullTopicRequest.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/DelayPullTopicRequest.java
new file mode 100644
index 00000000..58a77036
--- /dev/null
+++ b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/DelayPullTopicRequest.java
@@ -0,0 +1,12 @@
+package io.openjob.server.openapi.request;
+
+import lombok.Data;
+
+/**
+ * @author stelin swoft@qq.com
+ * @since 1.0.8
+ */
+@Data
+public class DelayPullTopicRequest {
+ private String appName;
+}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/ServerStopJobInstanceRequest.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/ServerStopJobInstanceRequest.java
deleted file mode 100644
index b89d9053..00000000
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/ServerStopJobInstanceRequest.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package io.openjob.server.openapi.request;
-
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import javax.validation.constraints.NotNull;
-
-/**
- * @author zhenghongyang
- * @since 1.0.0
- */
-@Data
-public class ServerStopJobInstanceRequest {
-
- @NotNull
- @ApiModelProperty(value = "Job ID", required = true)
- private Long jobId;
-
- @NotNull
- @ApiModelProperty(value = "Job Instance ID", required = true)
- private Long jobInstanceId;
-}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/ServerSubmitJobInstanceRequest.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/ServerSubmitJobInstanceRequest.java
deleted file mode 100644
index c7925c03..00000000
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/ServerSubmitJobInstanceRequest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package io.openjob.server.openapi.request;
-
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
-
-/**
- * @author stelin swoft@qq.com
- * @since 1.0.0
- */
-@Data
-public class ServerSubmitJobInstanceRequest {
-
- @NotNull
- @ApiModelProperty(value = "Job ID", required = true)
- private Long jobId;
-
- @NotNull
- @ApiModelProperty(value = "Job InstanceId ID", required = true)
- private Long jobInstanceId;
-
- @NotBlank
- @ApiModelProperty(value = "Job Param Type", required = true)
- private String jobParamType;
-
- @NotBlank
- @ApiModelProperty(value = "Job Params", required = true)
- private String jobParams;
-
- @NotBlank
- @ApiModelProperty(value = "Job Extend Params Type", required = true)
- private String jobExtendParamsType;
-
- @NotBlank
- @ApiModelProperty(value = "Job Extend Params", required = true)
- private String jobExtendParams;
-
- @ApiModelProperty(value = "Workflow Id", required = true)
- private Long workflowId;
-
- @NotBlank
- @ApiModelProperty(value = "Job process type: bean/shell/python, default(bean)", required = true)
- private String processorType;
-
- @NotBlank
- @ApiModelProperty(value = "Processor Info", required = true)
- private String processorInfo;
-
- @NotBlank
- @ApiModelProperty(value = "Execute type: standalone, broadcast, MR", required = true)
- private String executeType;
-
- @NotNull
- @ApiModelProperty(value = "Job execute fail retry times", required = true)
- private Integer failRetryTimes;
-
- @NotNull
- @ApiModelProperty(value = "Job execute fail retry interval", required = true)
- private Integer failRetryInterval;
-
- @NotNull
- @ApiModelProperty(value = "Job execute timeout", required = true)
- private Integer executeTimeout;
-
- @NotNull
- @ApiModelProperty(value = "Job execute concurrency, default(1)", required = true)
- private Integer concurrency;
-
- @NotBlank
- @ApiModelProperty(value = "Job type cron/second/delay, default(cron)", required = true)
- private String timeExpressionType;
-
- @ApiModelProperty(value = "Job cron express")
- private String timeExpression;
-}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/WorkerHeartbeatRequest.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/WorkerHeartbeatRequest.java
index ab1f21ba..e82cbd8b 100644
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/WorkerHeartbeatRequest.java
+++ b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/WorkerHeartbeatRequest.java
@@ -5,10 +5,11 @@
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
import java.util.List;
/**
- * @author zhenghongyang
+ * @author zhenghongyang sakuraovq@gmail.com
* @since 1.0.0
*/
@Data
@@ -23,7 +24,8 @@ public class WorkerHeartbeatRequest {
private String appName;
@NotBlank
- @ApiModelProperty("Worker internet address")
+ @Pattern(regexp = "^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}:\\d{1,5}$", message = "must be in format 'IP:PORT'")
+ @ApiModelProperty("Worker address.")
private String address;
@NotBlank
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/WorkerJobInstanceStatusRequest.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/WorkerJobInstanceStatusRequest.java
index 186fa032..4e5dd6cf 100644
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/WorkerJobInstanceStatusRequest.java
+++ b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/WorkerJobInstanceStatusRequest.java
@@ -1,49 +1,46 @@
package io.openjob.server.openapi.request;
+import io.openjob.common.constant.FailStatusEnum;
+import io.openjob.common.constant.InstanceStatusEnum;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
-import java.util.List;
/**
- * @author zhenghongyang
+ * @author zhenghongyang sakuraovq@gmail.com
* @since 1.0.0
*/
@Data
public class WorkerJobInstanceStatusRequest {
@NotNull
- @ApiModelProperty(value = "Job id.", required = true)
+ @ApiModelProperty("Job id.")
private Long jobId;
@NotNull
- @ApiModelProperty(value = "Job instance id.", required = true)
+ @ApiModelProperty("Job instance id.")
private Long jobInstanceId;
- @NotNull
- @ApiModelProperty(value = "Current circleId. Only for second delay task.", required = true)
- private Long circleId;
+ @ApiModelProperty("Current circleId. Only for second delay task.")
+ private Long circleId = 0L;
+ /**
+ * @see InstanceStatusEnum
+ */
@NotNull
- @ApiModelProperty(value = "Job instance status.", required = true)
+ @ApiModelProperty("Job instance status.")
private Integer status;
+ /**
+ * @see FailStatusEnum#getStatus()
+ */
@NotNull
- @ApiModelProperty(value = "Fail status", required = true)
+ @ApiModelProperty("Fail status")
private Integer failStatus;
- @NotNull
- @ApiModelProperty(value = "Delivery id.", required = true)
- private Long deliveryId;
-
- @NotNull
- @ApiModelProperty(value = "Current page.", required = true)
- private Long page;
-
- @Valid
- @NotNull
- @ApiModelProperty(value = "Job instance task list. Aggregation many circle task, if second delay task.", required = true)
- private List taskRequestList;
+ @NotBlank
+ @ApiModelProperty("Result")
+ private String result;
}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/WorkerJobInstanceTaskBatchRequest.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/WorkerJobInstanceTaskBatchRequest.java
new file mode 100644
index 00000000..361246c5
--- /dev/null
+++ b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/WorkerJobInstanceTaskBatchRequest.java
@@ -0,0 +1,72 @@
+package io.openjob.server.openapi.request;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author stelin swoft@qq.com
+ * @since 1.0.8
+ */
+@Data
+public class WorkerJobInstanceTaskBatchRequest {
+
+ @ApiModelProperty("Job instance task list.Aggregation many circle task, if second delay task.")
+ private List taskRequestList;
+
+ @Data
+ public static class WorkerJobInstanceTaskRequest implements Serializable {
+
+ @NotNull
+ @ApiModelProperty("Job id.")
+ private Long jobId;
+
+ @NotNull
+ @ApiModelProperty("Job instance id.")
+ private Long jobInstanceId;
+
+ @NotNull
+ @ApiModelProperty("Dispatch version")
+ private Long dispatchVersion;
+
+ @NotNull
+ @ApiModelProperty("Only for second delay task.")
+ private Long circleId;
+
+ @NotBlank
+ @ApiModelProperty("Task unique id.")
+ private String taskId;
+
+ @NotBlank
+ @ApiModelProperty("Task parent unique id.")
+ private String parentTaskId;
+
+ @NotBlank
+ @ApiModelProperty("Task name.")
+ private String taskName;
+
+ @NotNull
+ @ApiModelProperty("Task status.")
+ private Integer status;
+
+ @NotBlank
+ @ApiModelProperty("Task result.")
+ private String result;
+
+ @NotBlank
+ @ApiModelProperty("Task worker address")
+ private String workerAddress;
+
+ @NotNull
+ @ApiModelProperty("Task create time.")
+ private Long createTime;
+
+ @NotNull
+ @ApiModelProperty("Task update time.")
+ private Long updateTime;
+ }
+}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/WorkerJobInstanceTaskLogFieldRequest.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/WorkerJobInstanceTaskLogFieldRequest.java
deleted file mode 100644
index c3b920bd..00000000
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/WorkerJobInstanceTaskLogFieldRequest.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package io.openjob.server.openapi.request;
-
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import javax.validation.constraints.NotBlank;
-
-/**
- * @author zhenghongyang
- * @since 1.0.0
- */
-@Data
-public class WorkerJobInstanceTaskLogFieldRequest {
-
- @NotBlank
- @ApiModelProperty(value = "name", required = true)
- private String name;
-
- @NotBlank
- @ApiModelProperty(value = "value", required = true)
- private String value;
-}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/WorkerJobInstanceTaskLogRequest.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/WorkerJobInstanceTaskLogRequest.java
index dc05f181..5d816632 100644
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/WorkerJobInstanceTaskLogRequest.java
+++ b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/WorkerJobInstanceTaskLogRequest.java
@@ -3,18 +3,30 @@
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
+import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
import java.util.List;
/**
- * @author zhenghongyang
+ * @author zhenghongyang sakuraovq@gmail.com
* @since 1.0.0
*/
@Data
public class WorkerJobInstanceTaskLogRequest {
@NotNull
- @ApiModelProperty(value = "field list", required = true)
+ @ApiModelProperty(value = "Field list", required = true)
private List> fieldList;
+
+ @Data
+ public static class WorkerJobInstanceTaskLogFieldRequest {
+
+ @NotBlank
+ @ApiModelProperty(value = "name", required = true)
+ private String name;
+
+ @NotBlank
+ @ApiModelProperty(value = "value", required = true)
+ private String value;
+ }
}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/WorkerJobInstanceTaskRequest.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/WorkerJobInstanceTaskRequest.java
deleted file mode 100644
index 33a35118..00000000
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/WorkerJobInstanceTaskRequest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package io.openjob.server.openapi.request;
-
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
-
-/**
- * @author zhenghongyang
- * @since 1.0.0
- */
-@Data
-public class WorkerJobInstanceTaskRequest {
-
- @NotNull
- @ApiModelProperty(value = "Job id.", required = true)
- private Long jobId;
-
- @NotNull
- @ApiModelProperty(value = "Job instance id.", required = true)
- private Long jobInstanceId;
-
- @NotNull
- @ApiModelProperty(value = "Only for second delay task.", required = true)
- private Long circleId;
-
- @NotBlank
- @ApiModelProperty(value = "Task unique id. like 'jobId_instanceId_taskId_circleId'", required = true)
- private String taskId;
-
- @NotBlank
- @ApiModelProperty(value = "Task parent unique id. like 'jobId_instanceId_taskId_circleId'", required = true)
- private String parentTaskId;
-
- @NotBlank
- @ApiModelProperty(value = "Task name. Only for map reduce task.", required = true)
- private String taskName;
-
- @NotNull
- @ApiModelProperty(value = "Task status.", required = true)
- private Integer status;
-
- @NotBlank
- @ApiModelProperty(value = "Task result.", required = true)
- private String result;
-
- @NotBlank
- @ApiModelProperty(value = "Task worker address", required = true)
- private String workerAddress;
-
- @NotNull
- @ApiModelProperty(value = "Task create time.", required = true)
- private Long createTime;
-
- @NotNull
- @ApiModelProperty(value = "Task update time.", required = true)
- private Long updateTime;
-}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/WorkerStartRequest.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/WorkerStartRequest.java
index e2ceb1da..89ca45b9 100644
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/WorkerStartRequest.java
+++ b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/WorkerStartRequest.java
@@ -1,19 +1,21 @@
package io.openjob.server.openapi.request;
+import io.openjob.common.constant.ProtocolTypeEnum;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Pattern;
/**
- * @author zhenghongyang
+ * @author zhenghongyang sakuraovq@gmail.com
* @since 1.0.0
*/
@Data
public class WorkerStartRequest {
@NotBlank
- @ApiModelProperty("Worker key")
+ @ApiModelProperty("Worker unique id.")
private String workerKey;
@NotBlank
@@ -21,6 +23,7 @@ public class WorkerStartRequest {
private String appName;
@NotBlank
+ @Pattern(regexp = "^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}:\\d{1,5}$", message = "must be in format 'IP:PORT'")
@ApiModelProperty("Worker address")
private String address;
@@ -28,9 +31,8 @@ public class WorkerStartRequest {
@ApiModelProperty("Worker agent version")
private String version;
- @NotBlank
- @ApiModelProperty("Worker current protocol type")
- private String protocolType;
+ @ApiModelProperty("Worker current protocol type, http is default.")
+ private String protocolType = ProtocolTypeEnum.HTTP.getType();
@ApiModelProperty("metric")
private Metric metric;
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/WorkerStopRequest.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/WorkerStopRequest.java
index 07baf399..a2030698 100644
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/WorkerStopRequest.java
+++ b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/request/WorkerStopRequest.java
@@ -4,16 +4,17 @@
import lombok.Data;
import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Pattern;
/**
- * @author zhenghongyang
+ * @author zhenghongyang sakuraovq@gmail.com
* @since 1.0.0
*/
@Data
public class WorkerStopRequest {
@NotBlank
- @ApiModelProperty("Worker key")
+ @ApiModelProperty("Worker unique id.")
private String workerKey;
@NotBlank
@@ -21,6 +22,7 @@ public class WorkerStopRequest {
private String appName;
@NotBlank
+ @Pattern(regexp = "^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}:\\d{1,5}$", message = "must be in format 'IP:PORT'")
@ApiModelProperty("worker address")
private String address;
}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/service/ClusterService.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/service/OpenClusterService.java
similarity index 91%
rename from openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/service/ClusterService.java
rename to openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/service/OpenClusterService.java
index 22a5b455..9953b666 100644
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/service/ClusterService.java
+++ b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/service/OpenClusterService.java
@@ -7,7 +7,7 @@
* @author stelin swoft@qq.com
* @since 1.0.3
*/
-public interface ClusterService {
+public interface OpenClusterService {
/**
* online
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/service/OpenJobInstanceService.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/service/OpenJobInstanceService.java
new file mode 100644
index 00000000..1f18de27
--- /dev/null
+++ b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/service/OpenJobInstanceService.java
@@ -0,0 +1,29 @@
+package io.openjob.server.openapi.service;
+
+import io.openjob.server.openapi.request.WorkerJobInstanceStatusRequest;
+import io.openjob.server.openapi.request.WorkerJobInstanceTaskBatchRequest;
+import io.openjob.server.openapi.vo.WorkerJobInstanceStatusVO;
+import io.openjob.server.openapi.vo.WorkerJobInstanceTaskBatchVO;
+
+/**
+ * @author stelin swoft@qq.com
+ * @since 1.0.8
+ */
+public interface OpenJobInstanceService {
+
+ /**
+ * Handle status
+ *
+ * @param statusRequest statusRequest
+ * @return WorkerJobInstanceStatusVO
+ */
+ WorkerJobInstanceStatusVO handleStatus(WorkerJobInstanceStatusRequest statusRequest);
+
+ /**
+ * Handle tasks
+ *
+ * @param batchRequest batchRequest
+ * @return WorkerJobInstanceTaskBatchVO
+ */
+ WorkerJobInstanceTaskBatchVO handleTasks(WorkerJobInstanceTaskBatchRequest batchRequest);
+}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/service/OpenTaskLogService.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/service/OpenTaskLogService.java
new file mode 100644
index 00000000..5a5edadb
--- /dev/null
+++ b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/service/OpenTaskLogService.java
@@ -0,0 +1,19 @@
+package io.openjob.server.openapi.service;
+
+import io.openjob.server.openapi.request.WorkerJobInstanceTaskLogRequest;
+import io.openjob.server.openapi.vo.WorkerJobInstanceTaskLogVO;
+
+/**
+ * @author stelin swoft@qq.com
+ * @since 1.0.8
+ */
+public interface OpenTaskLogService {
+
+ /**
+ * Batch add
+ *
+ * @param logRequest logRequest
+ * @return WorkerJobInstanceTaskLogVO
+ */
+ WorkerJobInstanceTaskLogVO batchAdd(WorkerJobInstanceTaskLogRequest logRequest);
+}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/service/OpenapiWorkerService.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/service/OpenWorkerService.java
similarity index 80%
rename from openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/service/OpenapiWorkerService.java
rename to openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/service/OpenWorkerService.java
index c999e364..a3346ceb 100644
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/service/OpenapiWorkerService.java
+++ b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/service/OpenWorkerService.java
@@ -7,13 +7,11 @@
import io.openjob.server.openapi.vo.ServerWorkerStartVO;
import io.openjob.server.openapi.vo.ServerWorkerStopVO;
-import java.util.List;
-
/**
- * @author zhenghongyang
+ * @author zhenghongyang sakuraovq@gmail.com
* @since 1.0.0
*/
-public interface OpenapiWorkerService {
+public interface OpenWorkerService {
/**
* Worker start
@@ -38,11 +36,4 @@ public interface OpenapiWorkerService {
* @return Current server all worker address
*/
ServerHeartbeatVO workerHeartbeat(WorkerHeartbeatRequest workerHeartbeatRequest);
-
- /**
- * Batch save heartbeats
- *
- * @param requests requests
- */
- void batchHeartbeat(List requests);
}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/service/impl/ClusterServiceImpl.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/service/impl/OpenClusterServiceImpl.java
similarity index 86%
rename from openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/service/impl/ClusterServiceImpl.java
rename to openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/service/impl/OpenClusterServiceImpl.java
index bb4738f1..8eb2426f 100644
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/service/impl/ClusterServiceImpl.java
+++ b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/service/impl/OpenClusterServiceImpl.java
@@ -3,7 +3,7 @@
import io.openjob.common.context.Node;
import io.openjob.server.common.ClusterContext;
import io.openjob.server.openapi.request.ClusterOnlineRequest;
-import io.openjob.server.openapi.service.ClusterService;
+import io.openjob.server.openapi.service.OpenClusterService;
import io.openjob.server.openapi.vo.ClusterOnlineVO;
import org.springframework.stereotype.Service;
@@ -15,7 +15,7 @@
* @since 1.0.3
*/
@Service
-public class ClusterServiceImpl implements ClusterService {
+public class OpenClusterServiceImpl implements OpenClusterService {
@Override
public ClusterOnlineVO online(ClusterOnlineRequest clusterOnlineRequest) {
ClusterOnlineVO clusterOnlineVO = new ClusterOnlineVO();
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/service/impl/OpenJobInstanceServiceImpl.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/service/impl/OpenJobInstanceServiceImpl.java
new file mode 100644
index 00000000..d49ba526
--- /dev/null
+++ b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/service/impl/OpenJobInstanceServiceImpl.java
@@ -0,0 +1,42 @@
+package io.openjob.server.openapi.service.impl;
+
+import io.openjob.server.cluster.dto.WorkerJobInstanceStatusReqDTO;
+import io.openjob.server.cluster.dto.WorkerJobInstanceStatusRespDTO;
+import io.openjob.server.cluster.dto.WorkerJobInstanceTaskBatchReqDTO;
+import io.openjob.server.cluster.dto.WorkerJobInstanceTaskBatchRespDTO;
+import io.openjob.server.cluster.manager.JobInstanceManager;
+import io.openjob.server.common.util.BeanMapperUtil;
+import io.openjob.server.openapi.request.WorkerJobInstanceStatusRequest;
+import io.openjob.server.openapi.request.WorkerJobInstanceTaskBatchRequest;
+import io.openjob.server.openapi.service.OpenJobInstanceService;
+import io.openjob.server.openapi.vo.WorkerJobInstanceStatusVO;
+import io.openjob.server.openapi.vo.WorkerJobInstanceTaskBatchVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author stelin swoft@qq.com
+ * @since 1.0.8
+ */
+@Service
+public class OpenJobInstanceServiceImpl implements OpenJobInstanceService {
+
+ private final JobInstanceManager jobInstanceManager;
+
+ @Autowired
+ public OpenJobInstanceServiceImpl(JobInstanceManager jobInstanceManager) {
+ this.jobInstanceManager = jobInstanceManager;
+ }
+
+ @Override
+ public WorkerJobInstanceStatusVO handleStatus(WorkerJobInstanceStatusRequest statusRequest) {
+ WorkerJobInstanceStatusRespDTO respDTO = this.jobInstanceManager.handleInstanceStatus(BeanMapperUtil.map(statusRequest, WorkerJobInstanceStatusReqDTO.class));
+ return BeanMapperUtil.map(respDTO, WorkerJobInstanceStatusVO.class);
+ }
+
+ @Override
+ public WorkerJobInstanceTaskBatchVO handleTasks(WorkerJobInstanceTaskBatchRequest batchRequest) {
+ WorkerJobInstanceTaskBatchRespDTO respDTO = this.jobInstanceManager.handleInstanceTasks(BeanMapperUtil.map(batchRequest, WorkerJobInstanceTaskBatchReqDTO.class));
+ return BeanMapperUtil.map(respDTO, WorkerJobInstanceTaskBatchVO.class);
+ }
+}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/service/impl/OpenTaskLogServiceImpl.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/service/impl/OpenTaskLogServiceImpl.java
new file mode 100644
index 00000000..ad630f8d
--- /dev/null
+++ b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/service/impl/OpenTaskLogServiceImpl.java
@@ -0,0 +1,32 @@
+package io.openjob.server.openapi.service.impl;
+
+import io.openjob.server.cluster.dto.WorkerJobInstanceTaskLogReqDTO;
+import io.openjob.server.cluster.dto.WorkerJobInstanceTaskLogRespDTO;
+import io.openjob.server.cluster.manager.JobInstanceTaskLogManager;
+import io.openjob.server.common.util.BeanMapperUtil;
+import io.openjob.server.openapi.request.WorkerJobInstanceTaskLogRequest;
+import io.openjob.server.openapi.service.OpenTaskLogService;
+import io.openjob.server.openapi.vo.WorkerJobInstanceTaskLogVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author stelin swoft@qq.com
+ * @since 1.0.8
+ */
+@Service
+public class OpenTaskLogServiceImpl implements OpenTaskLogService {
+
+ private final JobInstanceTaskLogManager jobInstanceTaskLogManager;
+
+ @Autowired
+ public OpenTaskLogServiceImpl(JobInstanceTaskLogManager jobInstanceTaskLogManager) {
+ this.jobInstanceTaskLogManager = jobInstanceTaskLogManager;
+ }
+
+ @Override
+ public WorkerJobInstanceTaskLogVO batchAdd(WorkerJobInstanceTaskLogRequest logRequest) {
+ WorkerJobInstanceTaskLogRespDTO respDTO = this.jobInstanceTaskLogManager.handleInstanceTaskLog(BeanMapperUtil.map(logRequest, WorkerJobInstanceTaskLogReqDTO.class));
+ return BeanMapperUtil.map(respDTO, WorkerJobInstanceTaskLogVO.class);
+ }
+}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/service/impl/OpenWorkerServiceImpl.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/service/impl/OpenWorkerServiceImpl.java
new file mode 100644
index 00000000..ae988f00
--- /dev/null
+++ b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/service/impl/OpenWorkerServiceImpl.java
@@ -0,0 +1,58 @@
+package io.openjob.server.openapi.service.impl;
+
+import io.openjob.server.cluster.dto.WorkerHeartbeatReqDTO;
+import io.openjob.server.cluster.dto.WorkerHeartbeatRespDTO;
+import io.openjob.server.cluster.dto.WorkerStartReqDTO;
+import io.openjob.server.cluster.dto.WorkerStartRespDTO;
+import io.openjob.server.cluster.dto.WorkerStopReqDTO;
+import io.openjob.server.cluster.dto.WorkerStopRespDTO;
+import io.openjob.server.cluster.manager.WorkerHeartbeatManager;
+import io.openjob.server.cluster.manager.WorkerManager;
+import io.openjob.server.common.util.BeanMapperUtil;
+import io.openjob.server.openapi.request.WorkerHeartbeatRequest;
+import io.openjob.server.openapi.request.WorkerStartRequest;
+import io.openjob.server.openapi.request.WorkerStopRequest;
+import io.openjob.server.openapi.service.OpenWorkerService;
+import io.openjob.server.openapi.vo.ServerHeartbeatVO;
+import io.openjob.server.openapi.vo.ServerWorkerStartVO;
+import io.openjob.server.openapi.vo.ServerWorkerStopVO;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author zhenghongyang sakuraovq@gmail.com
+ * @since 1.0.0
+ */
+@Service
+@Log4j2
+public class OpenWorkerServiceImpl implements OpenWorkerService {
+ private final WorkerManager workerManager;
+ private final WorkerHeartbeatManager workerHeartbeatManager;
+
+ @Autowired
+ public OpenWorkerServiceImpl(WorkerManager workerManager, WorkerHeartbeatManager workerHeartbeatManager) {
+ this.workerManager = workerManager;
+ this.workerHeartbeatManager = workerHeartbeatManager;
+ }
+
+ @Override
+ public ServerWorkerStartVO workerStart(WorkerStartRequest startRequest) {
+ WorkerStartReqDTO reqDTO = BeanMapperUtil.map(startRequest, WorkerStartReqDTO.class);
+ WorkerStartRespDTO workerStartRespDTO = this.workerManager.workerStart(reqDTO);
+ return BeanMapperUtil.map(workerStartRespDTO, ServerWorkerStartVO.class);
+ }
+
+ @Override
+ public ServerWorkerStopVO workerStop(WorkerStopRequest stopReq) {
+ WorkerStopReqDTO reqDTO = BeanMapperUtil.map(stopReq, WorkerStopReqDTO.class);
+ WorkerStopRespDTO workerStopRespDTO = this.workerManager.workerStop(reqDTO);
+ return BeanMapperUtil.map(workerStopRespDTO, ServerWorkerStopVO.class);
+ }
+
+ @Override
+ public ServerHeartbeatVO workerHeartbeat(WorkerHeartbeatRequest workerHeartbeatRequest) {
+ WorkerHeartbeatRespDTO workerHeartbeatRespDTO = this.workerHeartbeatManager.workerHeartbeat(BeanMapperUtil.map(workerHeartbeatRequest, WorkerHeartbeatReqDTO.class));
+ return BeanMapperUtil.map(workerHeartbeatRespDTO, ServerHeartbeatVO.class);
+ }
+}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/task/WorkerHeartConsumer.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/task/WorkerHeartConsumer.java
deleted file mode 100644
index e2cf2e9b..00000000
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/task/WorkerHeartConsumer.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package io.openjob.server.openapi.task;
-
-import io.openjob.common.OpenjobSpringContext;
-import io.openjob.common.task.BaseConsumer;
-import io.openjob.common.task.TaskQueue;
-import io.openjob.server.openapi.request.WorkerHeartbeatRequest;
-import io.openjob.server.openapi.service.OpenapiWorkerService;
-import lombok.extern.slf4j.Slf4j;
-
-import java.util.List;
-
-/**
- * @author stelin swoft@qq.com
- * @since 1.0.3
- */
-@Slf4j
-public class WorkerHeartConsumer extends BaseConsumer {
-
- public WorkerHeartConsumer(Long id,
- Integer consumerCoreThreadNum,
- Integer consumerMaxThreadNum,
- String consumerThreadName,
- Integer pollSize,
- String pollThreadName,
- TaskQueue queues) {
- super(id, consumerCoreThreadNum, consumerMaxThreadNum, consumerThreadName, pollSize, pollThreadName, queues, 2000L, 1000L);
- }
-
- @Override
- public void consume(Long id, List tasks) {
- this.consumerExecutor.submit(new WorkerHeartbeatConsumerRunnable(tasks));
- }
-
- /**
- * Worker heartbeat runnable
- */
- private static class WorkerHeartbeatConsumerRunnable implements Runnable {
- private final List tasks;
-
- private WorkerHeartbeatConsumerRunnable(List tasks) {
- this.tasks = tasks;
- }
-
- @Override
- public void run() {
- try {
- OpenjobSpringContext.getBean(OpenapiWorkerService.class).batchHeartbeat(this.tasks);
- } catch (Throwable throwable) {
- log.error("Worker heartbeat failed!", throwable);
- }
- }
- }
-}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/util/ClusterUtil.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/util/ClusterUtil.java
deleted file mode 100644
index 889d9ba1..00000000
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/util/ClusterUtil.java
+++ /dev/null
@@ -1,184 +0,0 @@
-package io.openjob.server.openapi.util;
-
-import akka.actor.ActorRef;
-import io.openjob.common.context.Node;
-import io.openjob.common.util.FutureUtil;
-import io.openjob.server.common.ClusterContext;
-import io.openjob.server.common.dto.WorkerDTO;
-import io.openjob.server.common.util.ServerUtil;
-import io.openjob.server.openapi.dto.NodeResponseDTO;
-import io.openjob.server.openapi.exception.ClusterNodeOperatingException;
-import io.openjob.server.repository.entity.Server;
-import io.openjob.server.repository.entity.Worker;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.util.CollectionUtils;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.function.Supplier;
-import java.util.stream.Collectors;
-
-/**
- * @author stelin swoft@qq.com
- * @since 1.0.0
- */
-@Slf4j
-public class ClusterUtil {
-
- /**
- * Refresh nodes.
- *
- * @param servers servers
- */
- public static void refreshNodes(List servers) {
- Map nodes = servers.stream().collect(Collectors.toMap(Server::getId, (s) -> {
- Node node = new Node();
- node.setServerId(s.getId());
- node.setIp(s.getIp());
- node.setAkkaAddress(s.getAkkaAddress());
- return node;
- }));
-
- ClusterContext.refreshNodeList(nodes);
-
- log.info(String.format("Refresh servers %s", servers));
- }
-
- /**
- * Refresh app workers.
- *
- * @param workers refresh workers.
- */
- public static void refreshAppWorkers(List workers) {
- Map> appWorkers = workers.stream()
- .map(w -> {
- WorkerDTO workerDTO = new WorkerDTO();
- workerDTO.setNamespaceId(w.getNamespaceId());
- workerDTO.setAppId(w.getAppId());
- workerDTO.setWorkerKey(w.getWorkerKey());
- workerDTO.setAddress(w.getAddress());
- workerDTO.setProtocolType(w.getProtocolType());
- workerDTO.setAppName(w.getAppName());
- return workerDTO;
- })
- .collect(Collectors.groupingBy(WorkerDTO::getAppId));
-
- ClusterContext.refreshAppWorkers(appWorkers);
- log.info("Refresh app workers {}", appWorkers);
- }
-
- /**
- * Online workers.
- *
- * @param appId appId
- * @return Set
- */
- public static Set getOnlineWorkers(Long appId) {
- return ClusterContext.getWorkersByAppId(appId)
- .stream()
- .map(WorkerDTO::getAddress)
- .collect(Collectors.toSet());
- }
-
- /**
- * Get know servers.
- *
- * @param nodesMap nodesMap
- * @param currentNode currentNode
- * @param spreadSize spreadSize
- * @return List
- */
- public static List getKnowServers(Map nodesMap, Node currentNode, Integer spreadSize) {
- ArrayList serverIds = new ArrayList<>(nodesMap.keySet());
- Collections.sort(serverIds);
- int serverSize = serverIds.size();
-
- // Server size is less than spread size.
- if (serverSize <= spreadSize) {
- return serverIds.stream().filter(c -> !c.equals(currentNode.getServerId())).collect(Collectors.toList());
- }
-
- // Current index and sub size from tail
- int currentIndex = serverIds.indexOf(currentNode.getServerId());
- int subSize = serverSize - currentIndex - 1;
- if (subSize > spreadSize) {
- subSize = spreadSize;
- }
-
- // Sub from tail by size.
- List fixedList = new ArrayList<>(serverIds.subList(currentIndex + 1, currentIndex + 1 + subSize));
- int pingSize = fixedList.size();
- int needPingSize = spreadSize - pingSize;
-
- // Sub from head by size.
- if (needPingSize > 0) {
- fixedList.addAll(serverIds.subList(0, needPingSize));
- }
-
- Collections.sort(fixedList);
- return fixedList;
- }
-
- /**
- * Send message
- *
- * @param message message
- * @param currentNode currentNode
- * @param spreadSize spreadSize
- * @param excludeNodes exclude nodes.
- * @return Boolean
- */
- public static Boolean sendMessage(Object message, Node currentNode, Integer spreadSize, Set excludeNodes) {
- Map nodesList = ClusterContext.getNodesMap();
- List knowServers = ClusterUtil.getKnowServers(nodesList, currentNode, spreadSize);
- List sendServers = knowServers.stream().filter(i -> !excludeNodes.contains(i)).collect(Collectors.toList());
-
- // Empty send servers.
- if (CollectionUtils.isEmpty(sendServers)) {
- return true;
- }
-
- // Loop to send message.
- AtomicInteger successCounter = new AtomicInteger(0);
- sendServers.forEach(knowId -> {
- try {
- String akkaAddress = nodesList.get(knowId).getAkkaAddress();
- ServerUtil.getServerClusterActor(akkaAddress).tell(message, ActorRef.noSender());
- NodeResponseDTO nodeResponse = FutureUtil.mustAsk(ServerUtil.getServerClusterActor(akkaAddress), message, NodeResponseDTO.class, 3000L);
-
- // Counter
- successCounter.incrementAndGet();
-
- log.info("Cluster message success! akkaAddress={}, message={} response={}", akkaAddress, message, nodeResponse);
- } catch (Throwable e) {
- log.warn("Akka cluster message error!", e);
- }
- });
-
- int half = (int) Math.ceil((double) sendServers.size() / 2);
- return successCounter.get() >= half;
- }
-
- /**
- * Cluster node operate.
- *
- * @param supplier supplier
- * @return Boolean
- * @throws InterruptedException exception
- */
- public static Boolean clusterNodeOperate(Integer retryTimes, Supplier supplier) throws InterruptedException {
- for (int i = 0; i < retryTimes; i++) {
- try {
- return supplier.get();
- } catch (ClusterNodeOperatingException exception) {
- log.warn("Cluster node is operating! {}", exception.getMessage());
- Thread.sleep((i + 1) * 1000L);
- }
- }
- return false;
- }
-}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/DelayInstanceStatusVO.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/DelayInstanceStatusVO.java
new file mode 100644
index 00000000..534bfe8c
--- /dev/null
+++ b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/DelayInstanceStatusVO.java
@@ -0,0 +1,8 @@
+package io.openjob.server.openapi.vo;
+
+/**
+ * @author stelin swoft@qq.com
+ * @since 1.0.8
+ */
+public class DelayInstanceStatusVO {
+}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/DelayPullInstanceVO.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/DelayPullInstanceVO.java
new file mode 100644
index 00000000..27238f8e
--- /dev/null
+++ b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/DelayPullInstanceVO.java
@@ -0,0 +1,32 @@
+package io.openjob.server.openapi.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author stelin swoft@qq.com
+ * @since 1.0.8
+ */
+@Data
+public class DelayPullInstanceVO {
+ private List list;
+
+ @Data
+ public static class DelayPullInstanceItemVO {
+ private String topic;
+ private String taskId;
+ private Long delayId;
+ private Long delayPid;
+ private String delayParams;
+ private String delayExtra;
+ private String processorInfo;
+ private Integer failRetryTimes;
+ private Integer failRetryInterval;
+ private Integer executeTimeout;
+ private Integer blockingSize;
+ private Integer concurrency;
+ private Integer failTopicEnable;
+ private Integer failTopicConcurrency;
+ }
+}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/DelayPullTopicVO.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/DelayPullTopicVO.java
new file mode 100644
index 00000000..a002ddd8
--- /dev/null
+++ b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/DelayPullTopicVO.java
@@ -0,0 +1,28 @@
+package io.openjob.server.openapi.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author stelin swoft@qq.com
+ * @since 1.0.8
+ */
+@Data
+public class DelayPullTopicVO {
+ private List topicList;
+
+ @Data
+ public static class DelayTopicVO {
+ private Long id;
+ private Long pid;
+ private String topic;
+ private String processorInfo;
+ private Integer failRetryTimes;
+ private Integer failRetryInterval;
+ private Integer executeTimeout;
+ private Integer concurrency;
+ private Integer failTopicEnable;
+ private Integer failTopicConcurrency;
+ }
+}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/JobInstanceVO.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/JobInstanceVO.java
index 176661e9..4480a042 100644
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/JobInstanceVO.java
+++ b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/JobInstanceVO.java
@@ -4,7 +4,7 @@
import lombok.Data;
/**
- * @author zhenghongyang
+ * @author zhenghongyang sakuraovq@gmail.com
* @since 1.0.0
*/
@Data
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/ServerHeartbeatVO.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/ServerHeartbeatVO.java
index ed01d15d..65cb8cbe 100644
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/ServerHeartbeatVO.java
+++ b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/ServerHeartbeatVO.java
@@ -6,7 +6,7 @@
import java.util.Set;
/**
- * @author zhenghongyang
+ * @author zhenghongyang sakuraovq@gmail.com
* @since 1.0.0
*/
@Data
@@ -15,16 +15,9 @@ public class ServerHeartbeatVO {
@ApiModelProperty("Worker address list.")
private Set workerAddressList;
- @ApiModelProperty("Server system info")
- private HeartbeatSystemVO systemResponse;
+ @ApiModelProperty("Cluster version")
+ private Long clusterVersion;
- @Data
- public static class HeartbeatSystemVO {
-
- @ApiModelProperty("Cluster version")
- private Long clusterVersion;
-
- @ApiModelProperty("Cluster delay version")
- private Long clusterDelayVersion;
- }
+ @ApiModelProperty("Cluster delay version")
+ private Long clusterDelayVersion;
}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/ServerWorkerStartVO.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/ServerWorkerStartVO.java
index 5a7d5dbd..1e4005b0 100644
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/ServerWorkerStartVO.java
+++ b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/ServerWorkerStartVO.java
@@ -6,7 +6,7 @@
import java.util.Set;
/**
- * @author zhenghongyang
+ * @author zhenghongyang sakuraovq@gmail.com
* @since 1.0.0
*/
@Data
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/ServerWorkerStopVO.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/ServerWorkerStopVO.java
index 48412e6f..cf7ad924 100644
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/ServerWorkerStopVO.java
+++ b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/ServerWorkerStopVO.java
@@ -3,7 +3,7 @@
import lombok.Data;
/**
- * @author zhenghongyang
+ * @author zhenghongyang sakuraovq@gmail.com
* @since 1.0.0
*/
@Data
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/WorkerJobInstanceStatusVO.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/WorkerJobInstanceStatusVO.java
new file mode 100644
index 00000000..03f7c2a7
--- /dev/null
+++ b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/WorkerJobInstanceStatusVO.java
@@ -0,0 +1,11 @@
+package io.openjob.server.openapi.vo;
+
+import lombok.Data;
+
+/**
+ * @author stelin swoft@qq.com
+ * @since 1.0.8
+ */
+@Data
+public class WorkerJobInstanceStatusVO {
+}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/WorkerJobInstanceTaskBatchVO.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/WorkerJobInstanceTaskBatchVO.java
new file mode 100644
index 00000000..cfd039c1
--- /dev/null
+++ b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/WorkerJobInstanceTaskBatchVO.java
@@ -0,0 +1,11 @@
+package io.openjob.server.openapi.vo;
+
+import lombok.Data;
+
+/**
+ * @author stelin swoft@qq.com
+ * @since 1.0.8
+ */
+@Data
+public class WorkerJobInstanceTaskBatchVO {
+}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/OpenTaskLogVO.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/WorkerJobInstanceTaskLogVO.java
similarity index 51%
rename from openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/OpenTaskLogVO.java
rename to openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/WorkerJobInstanceTaskLogVO.java
index 0e887b71..28282687 100644
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/OpenTaskLogVO.java
+++ b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/WorkerJobInstanceTaskLogVO.java
@@ -3,9 +3,9 @@
import lombok.Data;
/**
- * @author zhenghongyang
+ * @author zhenghongyang sakuraovq@gmail.com
* @since 1.0.0
*/
@Data
-public class OpenTaskLogVO {
+public class WorkerJobInstanceTaskLogVO {
}
diff --git a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/WorkerJobVO.java b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/WorkerJobVO.java
index 60843f22..034276e5 100644
--- a/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/WorkerJobVO.java
+++ b/openjob-server/openjob-server-openapi/src/main/java/io/openjob/server/openapi/vo/WorkerJobVO.java
@@ -4,7 +4,7 @@
import lombok.Data;
/**
- * @author zhenghongyang
+ * @author zhenghongyang sakuraovq@gmail.com
* @since 1.0.0
*/
@Data
diff --git a/openjob-server/openjob-server-openapi/src/test/httptest/worker.http b/openjob-server/openjob-server-openapi/src/test/httptest/worker.http
new file mode 100644
index 00000000..441cc311
--- /dev/null
+++ b/openjob-server/openjob-server-openapi/src/test/httptest/worker.http
@@ -0,0 +1,35 @@
+### Worker start
+POST http://localhost:8080/openapi/worker/start
+Content-Type: application/json
+
+{
+ "address": "127.0.0.2:8088",
+ "appName": "openjob",
+ "metric": {},
+ "version": "1.0.6",
+ "workerKey": "SZ2C7FNQRkktQdv"
+}
+
+### Worker start
+POST http://localhost:8080/openapi/worker/stop
+Content-Type: application/json
+
+{
+ "address": "127.0.0.2:8088",
+ "appName": "openjob",
+ "workerKey": "SZ2C7FNQRkktQdv"
+}
+
+
+### Worker heartbeat
+POST http://localhost:8080/openapi/worker/heartbeat
+Content-Type: application/json
+
+{
+ "address": "127.0.0.2:8088",
+ "appId": 1,
+ "appName": "openjob",
+ "runningJobInstanceIds": [
+ ],
+ "version": "1.0.6"
+}
\ No newline at end of file
diff --git a/openjob-server/openjob-server-repository/pom.xml b/openjob-server/openjob-server-repository/pom.xml
index e04dddd1..3823f476 100644
--- a/openjob-server/openjob-server-repository/pom.xml
+++ b/openjob-server/openjob-server-repository/pom.xml
@@ -5,7 +5,7 @@
openjob-server
io.openjob
- 1.0.7
+ 1.0.8
4.0.0
openjob-server-repository
diff --git a/openjob-server/openjob-server-scheduler/pom.xml b/openjob-server/openjob-server-scheduler/pom.xml
index c09c9833..fef9e9bf 100644
--- a/openjob-server/openjob-server-scheduler/pom.xml
+++ b/openjob-server/openjob-server-scheduler/pom.xml
@@ -5,7 +5,7 @@
openjob-server
io.openjob
- 1.0.7
+ 1.0.8
4.0.0
diff --git a/openjob-server/openjob-server-scheduler/src/main/java/io/openjob/server/scheduler/dto/WorkerDelayInstanceStatusDTO.java b/openjob-server/openjob-server-scheduler/src/main/java/io/openjob/server/scheduler/dto/WorkerDelayInstanceStatusDTO.java
new file mode 100644
index 00000000..4321fe59
--- /dev/null
+++ b/openjob-server/openjob-server-scheduler/src/main/java/io/openjob/server/scheduler/dto/WorkerDelayInstanceStatusDTO.java
@@ -0,0 +1,66 @@
+package io.openjob.server.scheduler.dto;
+
+import io.openjob.common.constant.FailStatusEnum;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author stelin swoft@qq.com
+ * @since 1.0.8
+ */
+@Data
+public class WorkerDelayInstanceStatusDTO {
+
+ private List taskList;
+
+ @Data
+ public static class WorkerDelayInstanceTaskDTO {
+ /**
+ * Topic
+ */
+ private String topic;
+
+ /**
+ * Delay id.
+ */
+ private Long delayId;
+
+ /**
+ * Delay pid
+ */
+ private Long delayPid;
+
+ /**
+ * Task id.
+ */
+ private String taskId;
+
+ /**
+ * Task status.
+ */
+ private Integer status;
+
+ /**
+ * Fail status
+ *
+ * @see FailStatusEnum#getStatus()
+ */
+ private Integer failStatus;
+
+ /**
+ * Task result.
+ */
+ private String result;
+
+ /**
+ * Worker address
+ */
+ private String workerAddress;
+
+ /**
+ * Complete time
+ */
+ private Long completeTime;
+ }
+}
diff --git a/openjob-server/openjob-server-scheduler/src/main/java/io/openjob/server/scheduler/service/SchedulerTimerService.java b/openjob-server/openjob-server-scheduler/src/main/java/io/openjob/server/scheduler/service/SchedulerTimerService.java
index 9cfc41a8..034c66dd 100644
--- a/openjob-server/openjob-server-scheduler/src/main/java/io/openjob/server/scheduler/service/SchedulerTimerService.java
+++ b/openjob-server/openjob-server-scheduler/src/main/java/io/openjob/server/scheduler/service/SchedulerTimerService.java
@@ -79,26 +79,7 @@ public void run(SchedulerTimerTask task) {
*/
public void doRun(SchedulerTimerTask task, Set failoverList) {
Long dispatchVersion = DateUtil.milliLongTime();
- ServerSubmitJobInstanceRequest submitReq = new ServerSubmitJobInstanceRequest();
- submitReq.setJobId(task.getJobId());
- submitReq.setJobInstanceId(task.getTaskId());
- submitReq.setCircleId(task.getCircleId());
- submitReq.setDispatchVersion(dispatchVersion);
- submitReq.setJobParamType(task.getJobParamType());
- submitReq.setJobParams(task.getJobParams());
- submitReq.setJobExtendParamsType(task.getJobExtendParamsType());
- submitReq.setJobExtendParams(task.getJobExtendParams());
- submitReq.setWorkflowId(task.getWorkflowId());
- submitReq.setProcessorType(task.getProcessorType());
- submitReq.setProcessorInfo(task.getProcessorInfo());
- submitReq.setExecuteType(task.getExecuteType());
- submitReq.setFailRetryTimes(task.getFailRetryTimes());
- submitReq.setFailRetryInterval(task.getFailRetryInterval());
- submitReq.setConcurrency(task.getConcurrency());
- submitReq.setTimeExpressionType(task.getTimeExpressionType());
- submitReq.setTimeExpression(task.getTimeExpression());
- submitReq.setExecuteTimeout(task.getExecuteTimeout());
- submitReq.setExecuteOnce(Optional.ofNullable(task.getExecuteOnce()).orElse(CommonConstant.NO));
+ ServerSubmitJobInstanceRequest submitReq = this.getServerSubmitJobInstanceRequest(task, dispatchVersion);
WorkerDTO workerDTO = WorkerUtil.selectWorkerByAppId(task.getAppid(), failoverList);
if (Objects.isNull(workerDTO)) {
@@ -202,4 +183,28 @@ private void addInstanceLog(Long jobId, Long instanceId, String message) {
jobInstanceLog.setUpdateTime(timestamp);
this.jobInstanceLogDAO.save(jobInstanceLog);
}
+
+ private ServerSubmitJobInstanceRequest getServerSubmitJobInstanceRequest(SchedulerTimerTask task, Long dispatchVersion) {
+ ServerSubmitJobInstanceRequest submitReq = new ServerSubmitJobInstanceRequest();
+ submitReq.setJobId(task.getJobId());
+ submitReq.setJobInstanceId(task.getTaskId());
+ submitReq.setCircleId(task.getCircleId());
+ submitReq.setDispatchVersion(dispatchVersion);
+ submitReq.setJobParamType(task.getJobParamType());
+ submitReq.setJobParams(task.getJobParams());
+ submitReq.setJobExtendParamsType(task.getJobExtendParamsType());
+ submitReq.setJobExtendParams(task.getJobExtendParams());
+ submitReq.setWorkflowId(task.getWorkflowId());
+ submitReq.setProcessorType(task.getProcessorType());
+ submitReq.setProcessorInfo(task.getProcessorInfo());
+ submitReq.setExecuteType(task.getExecuteType());
+ submitReq.setFailRetryTimes(task.getFailRetryTimes());
+ submitReq.setFailRetryInterval(task.getFailRetryInterval());
+ submitReq.setConcurrency(task.getConcurrency());
+ submitReq.setTimeExpressionType(task.getTimeExpressionType());
+ submitReq.setTimeExpression(task.getTimeExpression());
+ submitReq.setExecuteTimeout(task.getExecuteTimeout());
+ submitReq.setExecuteOnce(Optional.ofNullable(task.getExecuteOnce()).orElse(CommonConstant.NO));
+ return submitReq;
+ }
}
diff --git a/openjob-server/openjob-server-starter/pom.xml b/openjob-server/openjob-server-starter/pom.xml
index 3f751870..ea0c105c 100644
--- a/openjob-server/openjob-server-starter/pom.xml
+++ b/openjob-server/openjob-server-starter/pom.xml
@@ -5,7 +5,7 @@
openjob-server
io.openjob
- 1.0.7
+ 1.0.8
4.0.0
diff --git a/openjob-server/openjob-server-starter/src/main/resources/application.properties b/openjob-server/openjob-server-starter/src/main/resources/application.properties
index 4798332d..0f4ad9ea 100644
--- a/openjob-server/openjob-server-starter/src/main/resources/application.properties
+++ b/openjob-server/openjob-server-starter/src/main/resources/application.properties
@@ -1,5 +1,5 @@
server.port=${SERVER_PORT:8080}
-#spring.profiles.active=mysql
+spring.profiles.active=mysql
#spring.profiles.active=pgsql
#spring.profiles.active=oracle
#spring.profiles.active=tidb
diff --git a/openjob-server/openjob-server-starter/src/main/resources/banner.txt b/openjob-server/openjob-server-starter/src/main/resources/banner.txt
index b1595b74..59988370 100644
--- a/openjob-server/openjob-server-starter/src/main/resources/banner.txt
+++ b/openjob-server/openjob-server-starter/src/main/resources/banner.txt
@@ -5,7 +5,7 @@ ${AnsiColor.GREEN}
| |_| | | |_) | | __/ | | | | | | | (_) | | |_) |
\___/ | .__/ \___| |_| |_| _/ | \___/ |_.__/
|_| |__/
- :: Version :: Openjob Server(v1.0.7) Spring Boot(v${spring-boot.version}) Akka(v2.6.19)
+ :: Version :: Openjob Server(v1.0.8) Spring Boot(v${spring-boot.version}) Akka(v2.6.19)
:: Website :: https://openjob.io
:: Author :: https://github.com/stelin
:: Github :: https://github.com/open-job/openjob
diff --git a/openjob-server/pom.xml b/openjob-server/pom.xml
index 2387748a..130341dd 100644
--- a/openjob-server/pom.xml
+++ b/openjob-server/pom.xml
@@ -5,7 +5,7 @@
openjob
io.openjob
- 1.0.7
+ 1.0.8
4.0.0
openjob-server
diff --git a/openjob-worker/openjob-worker-core/pom.xml b/openjob-worker/openjob-worker-core/pom.xml
index f5c8249a..8b88c4fd 100644
--- a/openjob-worker/openjob-worker-core/pom.xml
+++ b/openjob-worker/openjob-worker-core/pom.xml
@@ -5,7 +5,7 @@
openjob-worker
io.openjob.worker
- 1.0.7
+ 1.0.8
4.0.0
diff --git a/openjob-worker/openjob-worker-core/src/main/java/io/openjob/worker/processor/TaskResult.java b/openjob-worker/openjob-worker-core/src/main/java/io/openjob/worker/processor/TaskResult.java
index 9b7b52f5..d9406987 100644
--- a/openjob-worker/openjob-worker-core/src/main/java/io/openjob/worker/processor/TaskResult.java
+++ b/openjob-worker/openjob-worker-core/src/main/java/io/openjob/worker/processor/TaskResult.java
@@ -1,6 +1,5 @@
package io.openjob.worker.processor;
-import io.openjob.common.constant.TaskStatusEnum;
import lombok.Data;
/**
diff --git a/openjob-worker/openjob-worker-spring-boot-starter/pom.xml b/openjob-worker/openjob-worker-spring-boot-starter/pom.xml
index 450f4205..80d61519 100644
--- a/openjob-worker/openjob-worker-spring-boot-starter/pom.xml
+++ b/openjob-worker/openjob-worker-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
openjob-worker
io.openjob.worker
- 1.0.7
+ 1.0.8
4.0.0
diff --git a/openjob-worker/openjob-worker-spring-boot-starter/src/main/java/io/openjob/worker/spring/boot/autoconfigure/OpenjobWorkerAutoConfiguration.java b/openjob-worker/openjob-worker-spring-boot-starter/src/main/java/io/openjob/worker/spring/boot/autoconfigure/OpenjobWorkerAutoConfiguration.java
index a5d8c797..c2b89005 100644
--- a/openjob-worker/openjob-worker-spring-boot-starter/src/main/java/io/openjob/worker/spring/boot/autoconfigure/OpenjobWorkerAutoConfiguration.java
+++ b/openjob-worker/openjob-worker-spring-boot-starter/src/main/java/io/openjob/worker/spring/boot/autoconfigure/OpenjobWorkerAutoConfiguration.java
@@ -6,6 +6,7 @@
import io.openjob.worker.delay.OpenjobDelayTemplate;
import io.openjob.worker.spring.boot.OpenjobSpringWorker;
import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -13,7 +14,6 @@
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
-import javax.annotation.PostConstruct;
import java.util.Objects;
/**
@@ -22,7 +22,8 @@
*/
@Configuration
@EnableConfigurationProperties(value = {OpenjobWorkerProperties.class})
-public class OpenjobWorkerAutoConfiguration {
+public class OpenjobWorkerAutoConfiguration implements InitializingBean {
+
private final OpenjobWorkerProperties properties;
@Autowired
@@ -30,11 +31,8 @@ public OpenjobWorkerAutoConfiguration(OpenjobWorkerProperties properties) {
this.properties = properties;
}
- /**
- * Init
- */
- @PostConstruct
- public void init() {
+ @Override
+ public void afterPropertiesSet() throws Exception {
// Server address
if (StringUtils.isEmpty(System.getProperty(WorkerConstant.SERVER_ADDRESS))
&& Objects.nonNull(this.properties.getServer().getAddress())) {
diff --git a/openjob-worker/openjob-worker-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/openjob-worker/openjob-worker-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
new file mode 100644
index 00000000..27f65048
--- /dev/null
+++ b/openjob-worker/openjob-worker-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -0,0 +1 @@
+io.openjob.worker.spring.boot.autoconfigure.OpenjobWorkerAutoConfiguration
\ No newline at end of file
diff --git a/openjob-worker/pom.xml b/openjob-worker/pom.xml
index 2f73ed56..48552fdf 100644
--- a/openjob-worker/pom.xml
+++ b/openjob-worker/pom.xml
@@ -5,7 +5,7 @@
openjob
io.openjob
- 1.0.7
+ 1.0.8
4.0.0
@@ -25,7 +25,7 @@
io.openjob.worker
openjob-worker-core
- 1.0.7
+ 1.0.8
diff --git a/pom.xml b/pom.xml
index 7370ecb1..302ced1c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -13,7 +13,7 @@
io.openjob
openjob
pom
- 1.0.7
+ 1.0.8
Openjob Build ${version}
Openjob build with Maven