Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
everywhere.z
2022-06-17 19:01:37 +08:00
6 changed files with 102 additions and 45 deletions

View File

@@ -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<Condition> 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<String> 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 &&

View File

@@ -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<String> 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, ",", "[", "]"));
}
}
}

View File

@@ -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";

View File

@@ -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);
}
}

View File

@@ -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;
}

View File

@@ -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;