mirror of
https://gitee.com/dromara/liteFlow.git
synced 2026-05-14 20:22:07 +08:00
Merge remote-tracking branch 'origin/dev' into dev
This commit is contained in:
@@ -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 &&
|
||||
|
||||
@@ -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, ",", "[", "]"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user