From 56993335e3cf05425f10359b047969cccfb90e9d Mon Sep 17 00:00:00 2001 From: Echo009 Date: Mon, 25 Jan 2021 17:09:40 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E5=AE=9E=E4=BD=93?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E4=BB=A5=E5=8F=8A=20DAG=20=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../powerjob/client/test/TestWorkflow.java | 4 +- .../powerjob/common/model/PEWorkflowDAG.java | 34 ++++++-- .../server/common/utils/WorkflowDAGUtils.java | 7 +- .../powerjob/server/model/WorkflowDAG.java | 49 +++++++++-- .../persistence/core/model/AppInfoDO.java | 5 +- .../core/model/ContainerInfoDO.java | 25 ++++-- .../core/model/InstanceInfoDO.java | 57 ++++++++---- .../persistence/core/model/JobInfoDO.java | 86 ++++++++++++++----- .../persistence/core/model/OmsLockDO.java | 7 +- .../persistence/core/model/ServerInfoDO.java | 2 +- .../persistence/core/model/UserInfoDO.java | 20 +++-- .../core/model/WorkflowInfoDO.java | 35 ++++++-- .../core/model/WorkflowInstanceInfoDO.java | 40 ++++++--- .../core/model/WorkflowNodeInfoDO.java | 73 ++++++++++++++++ .../kfcfans/powerjob/server/test/DAGTest.java | 20 ++--- 15 files changed, 359 insertions(+), 105 deletions(-) create mode 100644 powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/WorkflowNodeInfoDO.java diff --git a/powerjob-client/src/test/java/com/github/kfcfans/powerjob/client/test/TestWorkflow.java b/powerjob-client/src/test/java/com/github/kfcfans/powerjob/client/test/TestWorkflow.java index 2552eae7..5c273d30 100644 --- a/powerjob-client/src/test/java/com/github/kfcfans/powerjob/client/test/TestWorkflow.java +++ b/powerjob-client/src/test/java/com/github/kfcfans/powerjob/client/test/TestWorkflow.java @@ -46,8 +46,8 @@ class TestWorkflow extends ClientInitializer { List nodes = Lists.newLinkedList(); List edges = Lists.newLinkedList(); - nodes.add(new PEWorkflowDAG.Node(1L, "DAG-Node-1")); - nodes.add(new PEWorkflowDAG.Node(2L, "DAG-Node-2")); + nodes.add(new PEWorkflowDAG.Node(1L, 1L, "DAG-Node-1")); + nodes.add(new PEWorkflowDAG.Node(2L, 2L, "DAG-Node-2")); edges.add(new PEWorkflowDAG.Edge(1L, 2L)); diff --git a/powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/model/PEWorkflowDAG.java b/powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/model/PEWorkflowDAG.java index f49bcacc..5a730c07 100644 --- a/powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/model/PEWorkflowDAG.java +++ b/powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/model/PEWorkflowDAG.java @@ -38,25 +38,45 @@ public class PEWorkflowDAG implements Serializable { @NoArgsConstructor @AllArgsConstructor public static class Node implements Serializable { + /** + * node id + * @since 20210128 + */ + private Long nodeId; + private Long jobId; + /** + * job alias or job name + */ private String jobName; - /** - * Instance running param, which is not required by DAG. - */ + /* Instance running param, which is not required by DAG. */ + @JsonSerialize(using= ToStringSerializer.class) private Long instanceId; - private Integer status; - private String result; - public Node(Long jobId, String jobName) { + private String jobParams; + + private Integer status; + + private String result; + /** + * instanceId will be null if disable . + */ + private Boolean enable; + + private Boolean skipWhenFailed; + + + public Node(Long nodeId,Long jobId, String jobName) { + this.nodeId = nodeId; this.jobId = jobId; this.jobName = jobName; } } /** - * Edge formed by two job ids. + * Edge formed by two node ids. */ @Data @NoArgsConstructor diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/common/utils/WorkflowDAGUtils.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/common/utils/WorkflowDAGUtils.java index 2a98e9f9..d1504db8 100644 --- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/common/utils/WorkflowDAGUtils.java +++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/common/utils/WorkflowDAGUtils.java @@ -23,6 +23,7 @@ public class WorkflowDAGUtils { /** * 获取所有根节点 + * * @param peWorkflowDAG 点线表示法的DAG图 * @return 根节点列表 */ @@ -37,6 +38,7 @@ public class WorkflowDAGUtils { /** * 校验 DAG 是否有效 + * * @param peWorkflowDAG 点线表示法的 DAG 图 * @return true/false */ @@ -61,13 +63,14 @@ public class WorkflowDAGUtils { } } return true; - }catch (Exception ignore) { + } catch (Exception ignore) { } return false; } /** * 将点线表示法的DAG图转化为引用表达法的DAG图 + * * @param PEWorkflowDAG 点线表示法的DAG图 * @return 引用表示法的DAG图 */ @@ -82,7 +85,7 @@ public class WorkflowDAGUtils { // 创建节点 PEWorkflowDAG.getNodes().forEach(node -> { Long jobId = node.getJobId(); - WorkflowDAG.Node n = new WorkflowDAG.Node(Lists.newLinkedList(), jobId, node.getJobName(), null, InstanceStatus.WAITING_DISPATCH.getV(), null); + WorkflowDAG.Node n = new WorkflowDAG.Node(Lists.newLinkedList(), node.getNodeId(), jobId, node.getJobName(), InstanceStatus.WAITING_DISPATCH.getV()); id2Node.put(jobId, n); // 初始阶段,每一个点都设为顶点 diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/model/WorkflowDAG.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/model/WorkflowDAG.java index c4819d29..3671d3b4 100644 --- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/model/WorkflowDAG.java +++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/model/WorkflowDAG.java @@ -18,21 +18,52 @@ import java.util.List; @AllArgsConstructor public class WorkflowDAG { - // DAG允许存在多个顶点 + /** + * DAG允许存在多个顶点 + */ private List roots; @Data @NoArgsConstructor - @AllArgsConstructor public static final class Node { - // 后继者,子节点 - private List successors; - private Long jobId; - private String jobName; - // 运行时参数 - private Long instanceId; // 任务实例ID - private int status; // 状态 WAITING_DISPATCH -> RUNNING -> SUCCEED/FAILED/STOPPED + public Node(List successors, Long nodeId, Long jobId, String jobName, int status) { + this.successors = successors; + this.nodeId = nodeId; + this.jobId = jobId; + this.jobName = jobName; + this.status = status; + } + + /** + * 后继者,子节点 + */ + private List successors; + /** + * node id + * + * @since 20210128 + */ + private Long nodeId; + + private Long jobId; + + private String jobName; + /** + * 运行时信息 + */ + private Long instanceId; + /** + * 状态 WAITING_DISPATCH -> RUNNING -> SUCCEED/FAILED/STOPPED + */ + private int status; + private String result; + /** + * instanceId will be null if disable . + */ + private Boolean enable; + + private Boolean skipWhenFailed; } } diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/AppInfoDO.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/AppInfoDO.java index c33387e3..e3016aaf 100644 --- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/AppInfoDO.java +++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/AppInfoDO.java @@ -23,7 +23,9 @@ public class AppInfoDO { private Long id; private String appName; - // 应用分组密码 + /** + * 应用分组密码 + */ private String password; /** @@ -34,5 +36,6 @@ public class AppInfoDO { private String currentServer; private Date gmtCreate; + private Date gmtModified; } diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/ContainerInfoDO.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/ContainerInfoDO.java index 93a64195..04a5b42f 100644 --- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/ContainerInfoDO.java +++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/ContainerInfoDO.java @@ -22,25 +22,38 @@ public class ContainerInfoDO { @GenericGenerator(name = "native", strategy = "native") private Long id; - // 所属的应用ID + /** + * 所属的应用ID + */ private Long appId; private String containerName; - // 容器类型,枚举值为 ContainerSourceType + /** + * 容器类型,枚举值为 ContainerSourceType + */ private Integer sourceType; - // 由 sourceType 决定,JarFile -> String,存储文件名称;Git -> JSON,包括 URL,branch,username,password + /** + * 由 sourceType 决定,JarFile -> String,存储文件名称;Git -> JSON,包括 URL,branch,username,password + */ private String sourceInfo; - // 版本 (Jar包使用md5,Git使用commitId,前者32位,后者40位,不会产生碰撞) + /** + * 版本 (Jar包使用md5,Git使用commitId,前者32位,后者40位,不会产生碰撞) + */ private String version; - // 状态,枚举值为 ContainerStatus + /** + * 状态,枚举值为 ContainerStatus + */ private Integer status; - // 上一次部署时间 + /** + * 上一次部署时间 + */ private Date lastDeployTime; private Date gmtCreate; + private Date gmtModified; } diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/InstanceInfoDO.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/InstanceInfoDO.java index 5af69945..061dd1de 100644 --- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/InstanceInfoDO.java +++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/InstanceInfoDO.java @@ -26,45 +26,70 @@ public class InstanceInfoDO { @GeneratedValue(strategy = GenerationType.AUTO, generator = "native") @GenericGenerator(name = "native", strategy = "native") private Long id; - - // 任务ID + /** + * 任务ID + */ private Long jobId; - // 任务所属应用的ID,冗余提高查询效率 + /** + * 任务所属应用的ID,冗余提高查询效率 + */ private Long appId; - // 任务实例ID + /** + * 任务所属应用的ID,冗余提高查询效率 + */ private Long instanceId; - // 任务实例参数 + /** + * 任务实例参数(动态) + */ @Lob @Column private String instanceParams; - - // 该任务实例的类型,普通/工作流(InstanceType) + /** + * 该任务实例的类型,普通/工作流(InstanceType) + */ private Integer type; - // 该任务实例所属的 workflow ID,仅 workflow 任务存在 + /** + * 该任务实例所属的 workflow ID,仅 workflow 任务存在 + */ private Long wfInstanceId; /** * 任务状态 {@link InstanceStatus} */ private Integer status; - // 执行结果(允许存储稍大的结果) + /** + * 执行结果(允许存储稍大的结果) + */ @Lob @Column private String result; - // 预计触发时间 + /** + * 预计触发时间 + */ private Long expectedTriggerTime; - // 实际触发时间 + /** + * 实际触发时间 + */ private Long actualTriggerTime; - // 结束时间 + /** + * 结束时间 + */ private Long finishedTime; - // 最后上报时间 + /** + * 最后上报时间 + */ private Long lastReportTime; - // TaskTracker地址 + /** + * TaskTracker 地址 + */ private String taskTrackerAddress; - - // 总共执行的次数(用于重试判断) + /** + * 总共执行的次数(用于重试判断) + */ private Long runningTimes; + private Date gmtCreate; + private Date gmtModified; } diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/JobInfoDO.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/JobInfoDO.java index b5d2b171..63aafe78 100644 --- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/JobInfoDO.java +++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/JobInfoDO.java @@ -29,66 +29,106 @@ public class JobInfoDO { private Long id; /* ************************** 任务基本信息 ************************** */ - // 任务名称 + /** + * 任务名称 + */ private String jobName; - // 任务描述 + /** + * 任务描述 + */ private String jobDescription; - // 任务所属的应用ID + /** + * 任务所属的应用ID + */ private Long appId; - // 任务自带的参数 + /** + * 任务自带的参数 + */ private String jobParams; /* ************************** 定时参数 ************************** */ - // 时间表达式类型(CRON/API/FIX_RATE/FIX_DELAY) + /** + * 时间表达式类型(CRON/API/FIX_RATE/FIX_DELAY) + */ private Integer timeExpressionType; - // 时间表达式,CRON/NULL/LONG/LONG + /** + * 时间表达式,CRON/NULL/LONG/LONG + */ private String timeExpression; /* ************************** 执行方式 ************************** */ - // 执行类型,单机/广播/MR + /** + * 执行类型,单机/广播/MR + */ private Integer executeType; - // 执行器类型,Java/Shell + /** + * 执行器类型,Java/Shell + */ private Integer processorType; - // 执行器信息(可能需要存储整个脚本文件) + /** + * 执行器信息(可能需要存储整个脚本文件) + */ @Lob @Column private String processorInfo; /* ************************** 运行时配置 ************************** */ - // 最大同时运行任务数,默认 1 + /** + * 最大同时运行任务数,默认 1 + */ private Integer maxInstanceNum; - // 并发度,同时执行某个任务的最大线程数量 + /** + * 并发度,同时执行某个任务的最大线程数量 + */ private Integer concurrency; - // 任务整体超时时间 + /** + * 任务整体超时时间 + */ private Long instanceTimeLimit; /* ************************** 重试配置 ************************** */ + private Integer instanceRetryNum; + private Integer taskRetryNum; - // 1 正常运行,2 停止(不再调度) + /** + * 1 正常运行,2 停止(不再调度) + */ private Integer status; - // 下一次调度时间 + /** + * 下一次调度时间 + */ private Long nextTriggerTime; - /* ************************** 繁忙机器配置 ************************** */ - // 最低CPU核心数量,0代表不限 + /** + * 最低CPU核心数量,0代表不限 + */ private double minCpuCores; - // 最低内存空间,单位 GB,0代表不限 + /** + * 最低内存空间,单位 GB,0代表不限 + */ private double minMemorySpace; - // 最低磁盘空间,单位 GB,0代表不限 + /** + * 最低磁盘空间,单位 GB,0代表不限 + */ private double minDiskSpace; - /* ************************** 集群配置 ************************** */ - // 指定机器运行,空代表不限,非空则只会使用其中的机器运行(多值逗号分割) + /** + * 指定机器运行,空代表不限,非空则只会使用其中的机器运行(多值逗号分割) + */ private String designatedWorkers; - // 最大机器数量 + /** + * 最大机器数量 + */ private Integer maxWorkerCount; - - // 报警用户ID列表,多值逗号分隔 + /** + * 报警用户ID列表,多值逗号分隔 + */ private String notifyUserIds; private Date gmtCreate; + private Date gmtModified; } diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/OmsLockDO.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/OmsLockDO.java index db0f1644..ee96d342 100644 --- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/OmsLockDO.java +++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/OmsLockDO.java @@ -25,12 +25,15 @@ public class OmsLockDO { private Long id; private String lockName; - private String ownerIP; - // 最长持有锁的时间 + private String ownerIP; + /** + * 最长持有锁的时间 + */ private Long maxLockTime; private Date gmtCreate; + private Date gmtModified; public OmsLockDO(String lockName, String ownerIP, Long maxLockTime) { diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/ServerInfoDO.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/ServerInfoDO.java index 683b1cb1..5e200f2a 100644 --- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/ServerInfoDO.java +++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/ServerInfoDO.java @@ -23,13 +23,13 @@ public class ServerInfoDO { @GeneratedValue(strategy = GenerationType.AUTO, generator = "native") @GenericGenerator(name = "native", strategy = "native") private Long id; - /** * 服务器IP地址 */ private String ip; private Date gmtCreate; + private Date gmtModified; public ServerInfoDO(String ip) { diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/UserInfoDO.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/UserInfoDO.java index 4eeda952..1a74e9ed 100644 --- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/UserInfoDO.java +++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/UserInfoDO.java @@ -23,18 +23,26 @@ public class UserInfoDO { private Long id; private String username; + private String password; - - // 手机号 + /** + * 手机号 + */ private String phone; - // 邮箱地址 + /** + * 邮箱地址 + */ private String email; - // webHook + /** + * webHook + */ private String webHook; - - // 扩展字段 + /** + * 扩展字段 + */ private String extra; private Date gmtCreate; + private Date gmtModified; } diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/WorkflowInfoDO.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/WorkflowInfoDO.java index f3c5d560..97da366f 100644 --- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/WorkflowInfoDO.java +++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/WorkflowInfoDO.java @@ -27,33 +27,50 @@ public class WorkflowInfoDO { private Long id; private String wfName; + private String wfDescription; - // 所属应用ID + /** + * 所属应用ID + */ private Long appId; - // 工作流的DAG图信息(点线式DAG的json) + /** + * 工作流的DAG图信息(点线式DAG的json) + */ @Lob @Column private String peDAG; /* ************************** 定时参数 ************************** */ - // 时间表达式类型(CRON/API/FIX_RATE/FIX_DELAY) + /** + * 时间表达式类型(CRON/API/FIX_RATE/FIX_DELAY) + */ private Integer timeExpressionType; - // 时间表达式,CRON/NULL/LONG/LONG + /** + * 时间表达式,CRON/NULL/LONG/LONG + */ private String timeExpression; - // 最大同时运行的工作流个数,默认 1 + /** + * 最大同时运行的工作流个数,默认 1 + */ private Integer maxWfInstanceNum; - // 1 正常运行,2 停止(不再调度) + /** + * 1 正常运行,2 停止(不再调度) + */ private Integer status; - // 下一次调度时间 + /** + * 下一次调度时间 + */ private Long nextTriggerTime; - - // 工作流整体失败的报警 + /** + * 工作流整体失败的报警 + */ private String notifyUserIds; private Date gmtCreate; + private Date gmtModified; } diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/WorkflowInstanceInfoDO.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/WorkflowInstanceInfoDO.java index e6f483c4..23fe0af8 100644 --- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/WorkflowInstanceInfoDO.java +++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/WorkflowInstanceInfoDO.java @@ -25,36 +25,54 @@ public class WorkflowInstanceInfoDO { @GeneratedValue(strategy = GenerationType.AUTO, generator = "native") @GenericGenerator(name = "native", strategy = "native") private Long id; - // 任务所属应用的ID,冗余提高查询效率 + /** + * 任务所属应用的ID,冗余提高查询效率 + */ private Long appId; - - // workflowInstanceId(任务实例表都使用单独的ID作为主键以支持潜在的分表需求) + /** + * workflowInstanceId(任务实例表都使用单独的ID作为主键以支持潜在的分表需求) + */ private Long wfInstanceId; private Long workflowId; - - // workflow 状态(WorkflowInstanceStatus) + /** + * workflow 状态(WorkflowInstanceStatus) + */ private Integer status; - - // 工作流启动参数 + /** + * 工作流启动参数 + */ @Lob @Column private String wfInitParams; + /** + * 工作流上下文 + */ + @Lob + @Column + private String wfContext; @Lob @Column private String dag; + @Lob @Column private String result; - - // 预计触发时间 + /** + * 预计触发时间 + */ private Long expectedTriggerTime; - // 实际触发时间 + /** + * 实际触发时间 + */ private Long actualTriggerTime; - // 结束时间 + /** + * 结束时间 + */ private Long finishedTime; private Date gmtCreate; + private Date gmtModified; } diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/WorkflowNodeInfoDO.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/WorkflowNodeInfoDO.java new file mode 100644 index 00000000..d278eebc --- /dev/null +++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/core/model/WorkflowNodeInfoDO.java @@ -0,0 +1,73 @@ +package com.github.kfcfans.powerjob.server.persistence.core.model; + + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.GenericGenerator; + +import javax.persistence.*; +import java.util.Date; + +/** + * 工作流节点信息 + * 记录了工作流中的任务节点个性化的配置信息 + * + * @author Echo009 + * @since 2021/1/23 + */ +@Data +@Entity +@NoArgsConstructor +@AllArgsConstructor +@Table(indexes = {@Index(columnList = "appId"), @Index(columnList = "workflowId")}) +public class WorkflowNodeInfoDO { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO, generator = "native") + @GenericGenerator(name = "native", strategy = "native") + private Long id; + + @Column(nullable = false) + private Long appId; + + @Column(nullable = false) + private Long workflowId; + /** + * 任务 ID + */ + @Column(nullable = false) + private Long jobId; + /** + * 节点别名,默认为对应的任务名称 + */ + @Column(nullable = false) + private String nodeAlias; + /** + * 节点参数 + */ + @Lob + private String nodeParams; + /** + * 是否启用 + */ + @Column(nullable = false) + private Boolean enable; + /** + * 是否允许失败跳过 + */ + @Column(nullable = false) + private Boolean skipWhenFailed; + /** + * 创建时间 + */ + @Column(nullable = false) + private Date gmtCreate; + /** + * 更新时间 + */ + @Column(nullable = false) + private Date gmtModified; + + +} diff --git a/powerjob-server/src/test/java/com/github/kfcfans/powerjob/server/test/DAGTest.java b/powerjob-server/src/test/java/com/github/kfcfans/powerjob/server/test/DAGTest.java index 0dd76a11..08a0dbc5 100644 --- a/powerjob-server/src/test/java/com/github/kfcfans/powerjob/server/test/DAGTest.java +++ b/powerjob-server/src/test/java/com/github/kfcfans/powerjob/server/test/DAGTest.java @@ -25,8 +25,8 @@ public class DAGTest { List edges = Lists.newLinkedList(); // 图1: 1 -> 2 -> 1,理论上报错 - nodes.add(new PEWorkflowDAG.Node(1L, "1")); - nodes.add(new PEWorkflowDAG.Node(2L, "2")); + nodes.add(new PEWorkflowDAG.Node(1L, 1L, "1")); + nodes.add(new PEWorkflowDAG.Node(2L, 2L, "2")); edges.add(new PEWorkflowDAG.Edge(1L, 2L)); edges.add(new PEWorkflowDAG.Edge(2L, 1L)); System.out.println(WorkflowDAGUtils.valid(new PEWorkflowDAG(nodes, edges))); @@ -35,10 +35,10 @@ public class DAGTest { List nodes2 = Lists.newLinkedList(); List edges2 = Lists.newLinkedList(); - nodes2.add(new PEWorkflowDAG.Node(1L, "1")); - nodes2.add(new PEWorkflowDAG.Node(2L, "2")); - nodes2.add(new PEWorkflowDAG.Node(3L, "3")); - nodes2.add(new PEWorkflowDAG.Node(4L, "4")); + nodes2.add(new PEWorkflowDAG.Node(1L, 1L, "1")); + nodes2.add(new PEWorkflowDAG.Node(2L, 2L, "2")); + nodes2.add(new PEWorkflowDAG.Node(3L, 3L, "3")); + nodes2.add(new PEWorkflowDAG.Node(4L, 4L, "4")); edges2.add(new PEWorkflowDAG.Edge(1L, 2L)); edges2.add(new PEWorkflowDAG.Edge(1L, 3L)); edges2.add(new PEWorkflowDAG.Edge(2L, 4L)); @@ -66,10 +66,10 @@ public class DAGTest { List nodes3 = Lists.newLinkedList(); List edges3 = Lists.newLinkedList(); - nodes3.add(new PEWorkflowDAG.Node(1L, "1")); - nodes3.add(new PEWorkflowDAG.Node(2L, "2")); - nodes3.add(new PEWorkflowDAG.Node(3L, "3")); - nodes3.add(new PEWorkflowDAG.Node(4L, "4")); + nodes3.add(new PEWorkflowDAG.Node(1L, 1L, "1")); + nodes3.add(new PEWorkflowDAG.Node(2L, 2L, "2")); + nodes3.add(new PEWorkflowDAG.Node(3L, 3L, "3")); + nodes3.add(new PEWorkflowDAG.Node(4L, 4L, "4")); edges3.add(new PEWorkflowDAG.Edge(1L, 3L)); edges3.add(new PEWorkflowDAG.Edge(2L, 4L));