diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/LiteFlowChainBuilder.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/LiteFlowChainBuilder.java index ed904adcd..81d4d2cf7 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/LiteFlowChainBuilder.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/LiteFlowChainBuilder.java @@ -1,16 +1,22 @@ package com.yomahub.liteflow.builder; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.google.common.collect.Lists; import com.yomahub.liteflow.enums.ConditionTypeEnum; import com.yomahub.liteflow.flow.FlowBus; import com.yomahub.liteflow.flow.element.Chain; -import com.yomahub.liteflow.flow.element.condition.*; +import com.yomahub.liteflow.flow.element.condition.Condition; +import com.yomahub.liteflow.flow.element.condition.ThenCondition; +import com.yomahub.liteflow.flow.element.condition.WhenCondition; import java.util.ArrayList; import java.util.List; /** * Chain基于代码形式的组装器 + * * @author Bryan.Zhang * @since 2.6.8 */ @@ -30,11 +36,11 @@ public class LiteFlowChainBuilder { //后置处理Condition,用来区别主体的Condition private final List finallyConditionList; - public static LiteFlowChainBuilder createChain(){ + public static LiteFlowChainBuilder createChain() { return new LiteFlowChainBuilder(); } - public LiteFlowChainBuilder(){ + public LiteFlowChainBuilder() { chain = new Chain(); conditionList = new ArrayList<>(); preConditionList = new ArrayList<>(); @@ -44,35 +50,54 @@ public class LiteFlowChainBuilder { //在parser中chain的build是2段式的,因为涉及到依赖问题,以前是递归parser //2.6.8之后取消了递归的模式,两段式组装,先把带有chainName的chain对象放进去,第二段再组装chain里面的condition //所以这里setChainName的时候需要判断下 - public LiteFlowChainBuilder setChainName(String chainName){ - if (FlowBus.containChain(chainName)){ + public LiteFlowChainBuilder setChainName(String chainName) { + if (FlowBus.containChain(chainName)) { this.chain = FlowBus.getChain(chainName); - }else{ + } else { this.chain.setChainName(chainName); } return this; } - public LiteFlowChainBuilder setCondition(Condition condition){ + public LiteFlowChainBuilder setCondition(Condition condition) { //这里把condition组装进conditionList, buildConditions(condition); return this; } - public void build(){ + public void build() { this.chain.setConditionList(this.conditionList); this.chain.setPreConditionList(this.preConditionList); this.chain.setFinallyConditionList(this.finallyConditionList); + + checkBuild(); + FlowBus.addChain(this.chain); } + /** + * build 前简单校验 + */ + private void checkBuild() { + List errorList = Lists.newArrayList(); + if (StrUtil.isBlank(this.chain.getChainName())) { + errorList.add("name is blank"); + } + if (CollUtil.isEmpty(this.chain.getConditionList())) { + errorList.add("conditionList is empty"); + } + if (CollUtil.isNotEmpty(errorList)) { + throw new RuntimeException(CollUtil.join(errorList, ",", "[", "]")); + } + } + private void buildConditions(Condition condition) { //这里进行合并逻辑 //对于then来说,相邻的2个then会合并成一个condition //对于when来说,相同组的when会合并成一个condition,不同组的when还是会拆开 if (condition.getConditionType().equals(ConditionTypeEnum.TYPE_PRE)) { this.preConditionList.add(condition); - }else if(condition.getConditionType().equals(ConditionTypeEnum.TYPE_FINALLY)) { + } else if (condition.getConditionType().equals(ConditionTypeEnum.TYPE_FINALLY)) { this.finallyConditionList.add(condition); } else if (condition.getConditionType().equals(ConditionTypeEnum.TYPE_THEN)) { if (this.conditionList.size() >= 1 && diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/LiteFlowNodeBuilder.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/LiteFlowNodeBuilder.java index f4fc745ae..369cdf619 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/LiteFlowNodeBuilder.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/LiteFlowNodeBuilder.java @@ -1,18 +1,23 @@ package com.yomahub.liteflow.builder; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.resource.ResourceUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import com.google.common.collect.Lists; import com.yomahub.liteflow.core.NodeComponent; -import com.yomahub.liteflow.flow.element.Node; import com.yomahub.liteflow.enums.NodeTypeEnum; import com.yomahub.liteflow.exception.NodeBuildException; import com.yomahub.liteflow.exception.NullParamException; import com.yomahub.liteflow.flow.FlowBus; +import com.yomahub.liteflow.flow.element.Node; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.List; +import java.util.Objects; + public class LiteFlowNodeBuilder { private final Logger LOG = LoggerFactory.getLogger(this.getClass()); @@ -23,19 +28,19 @@ public class LiteFlowNodeBuilder { return new LiteFlowNodeBuilder(); } - public static LiteFlowNodeBuilder createCommonNode(){ + public static LiteFlowNodeBuilder createCommonNode() { return new LiteFlowNodeBuilder(NodeTypeEnum.COMMON); } - public static LiteFlowNodeBuilder createCommonCondNode(){ + public static LiteFlowNodeBuilder createCommonCondNode() { return new LiteFlowNodeBuilder(NodeTypeEnum.COMMON); } - public static LiteFlowNodeBuilder createScriptNode(){ + public static LiteFlowNodeBuilder createScriptNode() { return new LiteFlowNodeBuilder(NodeTypeEnum.SCRIPT); } - public static LiteFlowNodeBuilder createScriptCondNode(){ + public static LiteFlowNodeBuilder createScriptCondNode() { return new LiteFlowNodeBuilder(NodeTypeEnum.COND_SCRIPT); } @@ -49,7 +54,7 @@ public class LiteFlowNodeBuilder { } public LiteFlowNodeBuilder setId(String nodeId) { - if (StrUtil.isBlank(nodeId)){ + if (StrUtil.isBlank(nodeId)) { return this; } this.node.setId(nodeId.trim()); @@ -57,7 +62,7 @@ public class LiteFlowNodeBuilder { } public LiteFlowNodeBuilder setName(String name) { - if (StrUtil.isBlank(name)){ + if (StrUtil.isBlank(name)) { return this; } this.node.setName(name.trim()); @@ -65,14 +70,14 @@ public class LiteFlowNodeBuilder { } public LiteFlowNodeBuilder setClazz(String clazz) { - if (StrUtil.isBlank(clazz)){ + if (StrUtil.isBlank(clazz)) { return this; } this.node.setClazz(clazz.trim()); return this; } - public LiteFlowNodeBuilder setClazz(Class clazz){ + public LiteFlowNodeBuilder setClazz(Class clazz) { assert clazz != null; setClazz(clazz.getName()); return this; @@ -92,7 +97,7 @@ public class LiteFlowNodeBuilder { // 设置类型的编码 public LiteFlowNodeBuilder setTypeCode(String nodeTypeCode) { - if (StringUtils.isBlank(nodeTypeCode)) { + if (StringUtils.isBlank(nodeTypeCode)) { throw new NullParamException("nodeTypeCode is blank"); } NodeTypeEnum nodeTypeEnum = NodeTypeEnum.getEnumByCode(nodeTypeCode); @@ -109,7 +114,7 @@ public class LiteFlowNodeBuilder { } public LiteFlowNodeBuilder setFile(String filePath) { - if (StrUtil.isBlank(filePath)){ + if (StrUtil.isBlank(filePath)) { return this; } String script = ResourceUtil.readUtf8Str(StrUtil.format("classpath: {}", filePath.trim())); @@ -117,12 +122,13 @@ public class LiteFlowNodeBuilder { } public void build() { + checkBuild(); try { if (this.node.getType().equals(NodeTypeEnum.COMMON)) { FlowBus.addCommonNode(this.node.getId(), this.node.getName(), this.node.getClazz()); - } else if (this.node.getType().equals(NodeTypeEnum.SCRIPT)){ + } else if (this.node.getType().equals(NodeTypeEnum.SCRIPT)) { FlowBus.addCommonScriptNode(this.node.getId(), this.node.getName(), this.node.getScript()); - } else if (this.node.getType().equals(NodeTypeEnum.COND_SCRIPT)){ + } else if (this.node.getType().equals(NodeTypeEnum.COND_SCRIPT)) { FlowBus.addCondScriptNode(this.node.getId(), this.node.getName(), this.node.getScript()); } } catch (Exception e) { @@ -131,4 +137,26 @@ public class LiteFlowNodeBuilder { throw new NodeBuildException(errMsg); } } + + /** + * build 前简单校验 + */ + private void checkBuild() { + List errorList = Lists.newArrayList(); + if (StrUtil.isBlank(this.node.getId())) { + errorList.add("id is blank"); + } + if (StrUtil.isBlank(this.node.getName())) { + errorList.add("name is blank"); + } + if (Objects.isNull(this.node.getType())) { + errorList.add("type is null"); + } + if (StrUtil.isBlank(this.node.getClazz())) { + errorList.add("clazz is blank"); + } + if (CollUtil.isNotEmpty(errorList)) { + throw new NodeBuildException(CollUtil.join(errorList, ",", "[", "]")); + } + } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/core/FlowExecutor.java b/liteflow-core/src/main/java/com/yomahub/liteflow/core/FlowExecutor.java index 2939616d7..8c08aa0e0 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/core/FlowExecutor.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/core/FlowExecutor.java @@ -9,27 +9,33 @@ package com.yomahub.liteflow.core; import cn.hutool.core.collection.ListUtil; -import cn.hutool.core.util.*; +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.ReUtil; +import cn.hutool.core.util.StrUtil; import com.google.common.collect.Lists; -import com.yomahub.liteflow.slot.DataBus; -import com.yomahub.liteflow.flow.LiteflowResponse; -import com.yomahub.liteflow.slot.DefaultContext; -import com.yomahub.liteflow.slot.Slot; -import com.yomahub.liteflow.flow.element.Chain; -import com.yomahub.liteflow.flow.element.Node; import com.yomahub.liteflow.enums.FlowParserTypeEnum; import com.yomahub.liteflow.exception.*; import com.yomahub.liteflow.flow.FlowBus; +import com.yomahub.liteflow.flow.LiteflowResponse; +import com.yomahub.liteflow.flow.element.Chain; +import com.yomahub.liteflow.flow.element.Node; import com.yomahub.liteflow.parser.*; import com.yomahub.liteflow.property.LiteflowConfig; import com.yomahub.liteflow.property.LiteflowConfigGetter; +import com.yomahub.liteflow.slot.DataBus; +import com.yomahub.liteflow.slot.DefaultContext; +import com.yomahub.liteflow.slot.Slot; import com.yomahub.liteflow.spi.holder.ContextAwareHolder; import com.yomahub.liteflow.thread.ExecutorHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.*; -import java.util.concurrent.*; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.Future; /** * 流程规则主要执行器类 @@ -68,7 +74,7 @@ public class FlowExecutor { LiteflowConfigGetter.setLiteflowConfig(liteflowConfig); //设置FlowExecutor的Holder,虽然大部分地方都可以通过Spring上下文获取到,但放入Holder,还是为了某些地方能方便的取到 FlowExecutorHolder.setHolder(this); - if (liteflowConfig.isParseOnStart()) { + if (BooleanUtil.isTrue(liteflowConfig.isParseOnStart())) { this.init(); } //初始化DataBus @@ -118,7 +124,7 @@ public class FlowExecutor { rulePathList.add(path); //支持多类型的配置文件,分别解析 - if (liteflowConfig.isSupportMultipleType()) { + if (BooleanUtil.isTrue(liteflowConfig.isSupportMultipleType())) { if (ObjectUtil.isNotNull(parser)) { parser.parseMain(ListUtil.toList(path)); } else { @@ -136,7 +142,7 @@ public class FlowExecutor { } //单类型的配置文件,需要一起解析 - if (!liteflowConfig.isSupportMultipleType()) { + if (BooleanUtil.isFalse(liteflowConfig.isSupportMultipleType())) { //检查Parser是否只有一个,因为多个不同的parser会造成子流程的混乱 if (parserNameSet.size() > 1) { String errorMsg = "cannot have multiple different parsers"; diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/monitor/MonitorBus.java b/liteflow-core/src/main/java/com/yomahub/liteflow/monitor/MonitorBus.java index 0027b42f0..9bf48b3d0 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/monitor/MonitorBus.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/monitor/MonitorBus.java @@ -7,8 +7,9 @@ */ package com.yomahub.liteflow.monitor; -import com.yomahub.liteflow.slot.DataBus; +import cn.hutool.core.util.BooleanUtil; import com.yomahub.liteflow.property.LiteflowConfig; +import com.yomahub.liteflow.slot.DataBus; import com.yomahub.liteflow.util.BoundedPriorityBlockingQueue; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -40,7 +41,7 @@ public class MonitorBus { public MonitorBus(LiteflowConfig liteflowConfig) { this.liteflowConfig = liteflowConfig; - if(liteflowConfig.getEnableLog()){ + if(BooleanUtil.isTrue(liteflowConfig.getEnableLog())){ this.printLogScheduler.scheduleAtFixedRate(new MonitorTimeTask(this), liteflowConfig.getDelay(), liteflowConfig.getPeriod(), TimeUnit.MILLISECONDS); } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/property/LiteflowConfig.java b/liteflow-core/src/main/java/com/yomahub/liteflow/property/LiteflowConfig.java index a30e145db..c3fd3156d 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/property/LiteflowConfig.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/property/LiteflowConfig.java @@ -8,10 +8,8 @@ */ package com.yomahub.liteflow.property; -import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; -import com.sun.org.apache.xpath.internal.operations.Bool; /** * liteflow的配置实体类 @@ -88,7 +86,7 @@ public class LiteflowConfig { public Boolean getEnable() { if (ObjectUtil.isNull(enable)) { - return true; + return Boolean.TRUE; } else { return enable; } @@ -168,7 +166,7 @@ public class LiteflowConfig { public Boolean getEnableLog() { if (ObjectUtil.isNull(enableLog)) { - return false; + return Boolean.FALSE; } else { return enableLog; } @@ -204,7 +202,7 @@ public class LiteflowConfig { public Boolean isParseOnStart() { if (ObjectUtil.isNull(parseOnStart)) { - return true; + return Boolean.TRUE; } else { return parseOnStart; } @@ -216,7 +214,7 @@ public class LiteflowConfig { public Boolean isSupportMultipleType() { if (ObjectUtil.isNull(supportMultipleType)) { - return false; + return Boolean.FALSE; } else { return supportMultipleType; } @@ -226,7 +224,7 @@ public class LiteflowConfig { this.supportMultipleType = supportMultipleType; } - public int getRetryCount() { + public Integer getRetryCount() { if (ObjectUtil.isNull(retryCount) || retryCount < 0) { return 0; } else { @@ -234,7 +232,7 @@ public class LiteflowConfig { } } - public void setRetryCount(int retryCount) { + public void setRetryCount(Integer retryCount) { this.retryCount = retryCount; } diff --git a/liteflow-spring-boot-starter/src/main/java/com/yomahub/liteflow/springboot/config/LiteflowPropertyAutoConfiguration.java b/liteflow-spring-boot-starter/src/main/java/com/yomahub/liteflow/springboot/config/LiteflowPropertyAutoConfiguration.java index 437562c86..28ccc8a0f 100644 --- a/liteflow-spring-boot-starter/src/main/java/com/yomahub/liteflow/springboot/config/LiteflowPropertyAutoConfiguration.java +++ b/liteflow-spring-boot-starter/src/main/java/com/yomahub/liteflow/springboot/config/LiteflowPropertyAutoConfiguration.java @@ -3,7 +3,6 @@ package com.yomahub.liteflow.springboot.config; import com.yomahub.liteflow.property.LiteflowConfig; import com.yomahub.liteflow.springboot.LiteflowMonitorProperty; import com.yomahub.liteflow.springboot.LiteflowProperty; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;