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