Prechádzať zdrojové kódy

#IB0SJ1 调整逻辑

jay li 5 mesiacov pred
rodič
commit
33b18cbd77

+ 7 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/LiteFlowChainELBuilder.java

@@ -385,6 +385,7 @@ public class LiteFlowChainELBuilder {
 		if (StrUtil.isBlank(chain.getEl())){
 			throw new FlowSystemException(StrUtil.format("no el content in this unCompile chain[{}]", chain.getChainId()));
 		}
+		LiteflowConfig liteflowConfig = LiteflowConfigGetter.get();
 
 		// 如果chain已经有Condition了,那说明已经解析过了,这里只对未解析的chain进行解析
 		if (CollUtil.isNotEmpty(chain.getConditionList())){
@@ -429,6 +430,12 @@ public class LiteFlowChainELBuilder {
 				throw new QLException(StrUtil.format("parse el fail,el:[{}]", chain.getEl()));
 			}
 
+			// 设置实例id
+			if (liteflowConfig.getEnableNodeInstanceId()) {
+				NodeInstanceIdManageSpi nodeInstanceIdManageSpi = NodeInstanceIdManageSpiHolder.getInstance().getNodeInstanceIdManageSpi();
+				nodeInstanceIdManageSpi.setNodesInstanceId(condition, chain);
+			}
+
 			// 把主要的condition加入
 			chain.setConditionList(CollUtil.toList(condition));
 

+ 4 - 5
liteflow-core/src/main/java/com/yomahub/liteflow/flow/entity/InstanceIdDto.java → liteflow-core/src/main/java/com/yomahub/liteflow/flow/entity/InstanceInfoDto.java

@@ -1,14 +1,13 @@
 package com.yomahub.liteflow.flow.entity;
 
 /**
- * sInstanceId
- *
+ * InstanceInfo Dto
+ * {"chainId":"chain1","nodeId":"a","instanceId":"XXXX","index":0}
  * @author jay li
  * @since 2.13.0
  */
-public class InstanceIdDto {
-    // a_XXX_0
-    // {"chainId":"chain1","nodeId":"a","instanceId":"XXXX","index":0},
+public class InstanceInfoDto {
+
     private String chainId;
 
     private String nodeId;

+ 22 - 23
liteflow-core/src/main/java/com/yomahub/liteflow/flow/instanceId/BaseNodeInstanceIdManageSpi.java

@@ -5,7 +5,7 @@ import cn.hutool.crypto.digest.MD5;
 import com.yomahub.liteflow.flow.element.Chain;
 import com.yomahub.liteflow.flow.element.Condition;
 import com.yomahub.liteflow.flow.element.Node;
-import com.yomahub.liteflow.flow.entity.InstanceIdDto;
+import com.yomahub.liteflow.flow.entity.InstanceInfoDto;
 import org.apache.commons.lang.StringUtils;
 
 import java.util.*;
@@ -25,16 +25,13 @@ public abstract class BaseNodeInstanceIdManageSpi implements NodeInstanceIdManag
         if (StringUtils.isBlank(chainId) || StringUtils.isBlank(instanceId)) {
             return "";
         }
-
+        // 第一行为elMd5 第二行为实例id json格式信息
         List<String> instanceIdFile = readInstanceIdFile(chainId);
 
         for (int i = 1; i < instanceIdFile.size(); i++) {
-            List<InstanceIdDto> instanceIdDtos = parseList(instanceIdFile.get(i), InstanceIdDto.class);
-            if (instanceIdDtos == null) {
-                continue;
-            }
+            List<InstanceInfoDto> instanceInfos = parseList(instanceIdFile.get(i), InstanceInfoDto.class);
 
-            for (InstanceIdDto dto : instanceIdDtos) {
+            for (InstanceInfoDto dto : instanceInfos) {
                 if (Objects.equals(dto.getInstanceId(), instanceId)) {
                     return dto.getNodeId() + "(" + dto.getIndex() + ")";
                 }
@@ -50,18 +47,19 @@ public abstract class BaseNodeInstanceIdManageSpi implements NodeInstanceIdManag
         NodeInstanceIdManageSpi nodeInstanceIdManageSpi = NodeInstanceIdManageSpiHolder.getInstance().getNodeInstanceIdManageSpi();
 
         String elMd5 = MD5.create().digestHex(chain.getEl());
-        List<String> instanceIdFile = nodeInstanceIdManageSpi.readInstanceIdFile(chain.getChainId());
+        String chainId = chain.getChainId();
+        List<String> instanceIdFile = nodeInstanceIdManageSpi.readInstanceIdFile(chainId);
 
         // 如果文件不存在,或者文件内容不是当前el,则写入
         if (CollUtil.isEmpty(instanceIdFile) || !instanceIdFile.get(0).equals(elMd5)) {
-            nodeInstanceIdManageSpi.writeInstanceIdFile(writeNodeInstanceId(condition), elMd5, chain.getChainId());
+            nodeInstanceIdManageSpi.writeInstanceIdFile(writeNodeInstanceId(condition, chainId), elMd5, chainId);
         } else {
             // 文件存在,则直接读取
-            List<InstanceIdDto> instanceIdDtos = new ArrayList<>();
+            List<InstanceInfoDto> instanceInfoDtos = new ArrayList<>();
             for (int i = 1; i < instanceIdFile.size(); i++) {
-                List<InstanceIdDto> instanceIdDtos1 = parseList(instanceIdFile.get(i), InstanceIdDto.class);
-                if (instanceIdDtos1 != null) {
-                    instanceIdDtos.addAll(instanceIdDtos1);
+                List<InstanceInfoDto> instanceInfoDtos1 = parseList(instanceIdFile.get(i), InstanceInfoDto.class);
+                if (instanceInfoDtos1 != null) {
+                    instanceInfoDtos.addAll(instanceInfoDtos1);
                 }
             }
 
@@ -72,7 +70,7 @@ public abstract class BaseNodeInstanceIdManageSpi implements NodeInstanceIdManag
                         Node node = (Node) executable;
                         idCntMap.put(node.getId(), idCntMap.getOrDefault(node.getId(), -1) + 1);
 
-                        for (InstanceIdDto dto : instanceIdDtos) {
+                        for (InstanceInfoDto dto : instanceInfoDtos) {
                             if (Objects.equals(dto.getNodeId(), node.getId())
                                     && Objects.equals(dto.getChainId(), node.getCurrChainId())
                                     && Objects.equals(dto.getIndex(), idCntMap.get(node.getId()))) {
@@ -90,18 +88,19 @@ public abstract class BaseNodeInstanceIdManageSpi implements NodeInstanceIdManag
     // 写入时第一行为el的md5,第二行为json格式的groupKey和对应的nodeId 和实例id
     //          instanceId  a_XXX_0
     //         {"chainId":"chain1","nodeId":"a","instanceId":"XXXX","index":0},
-    private List<InstanceIdDto> writeNodeInstanceId(Condition condition) {
-        ArrayList<InstanceIdDto> instanceIdDtos = new ArrayList<>();
+    private List<InstanceInfoDto> writeNodeInstanceId(Condition condition, String chainId) {
+        ArrayList<InstanceInfoDto> instanceInfos = new ArrayList<>();
 
         condition.getExecutableGroup().forEach((key, executables) -> {
+            // 统计每个nodeId的索引
             Map<String, Integer> idCntMap = new HashMap<>();
             executables.forEach(executable -> {
                 if (executable instanceof Node) {
                     Node node = (Node) executable;
-                    InstanceIdDto instanceIdDto = new InstanceIdDto();
+                    InstanceInfoDto instanceInfoDto = new InstanceInfoDto();
 
-                    instanceIdDto.setChainId(node.getCurrChainId());
-                    instanceIdDto.setNodeId(node.getId());
+                    instanceInfoDto.setChainId(chainId);
+                    instanceInfoDto.setNodeId(node.getId());
 
                     String shortUUID = generateShortUUID();
 
@@ -110,15 +109,15 @@ public abstract class BaseNodeInstanceIdManageSpi implements NodeInstanceIdManag
                     String instanceId = node.getId() + "_" + shortUUID + "_" + idCntMap.get(node.getId());
 
                     node.setInstanceId(instanceId);
-                    instanceIdDto.setInstanceId(instanceId);
-                    instanceIdDto.setIndex(idCntMap.get(node.getId()));
+                    instanceInfoDto.setInstanceId(instanceId);
+                    instanceInfoDto.setIndex(idCntMap.get(node.getId()));
 
-                    instanceIdDtos.add(instanceIdDto);
+                    instanceInfos.add(instanceInfoDto);
                 }
             });
         });
 
-        return instanceIdDtos;
+        return instanceInfos;
     }
 
 }

+ 2 - 2
liteflow-core/src/main/java/com/yomahub/liteflow/flow/instanceId/DefaultNodeInstanceIdManageSpiImpl.java

@@ -3,7 +3,7 @@ package com.yomahub.liteflow.flow.instanceId;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.util.CharsetUtil;
-import com.yomahub.liteflow.flow.entity.InstanceIdDto;
+import com.yomahub.liteflow.flow.entity.InstanceInfoDto;
 import com.yomahub.liteflow.util.JsonUtil;
 import org.apache.commons.lang.StringUtils;
 
@@ -35,7 +35,7 @@ public class DefaultNodeInstanceIdManageSpiImpl extends BaseNodeInstanceIdManage
     }
 
     @Override
-    public void writeInstanceIdFile(List<InstanceIdDto> instanceIdList, String elMd5, String chainId) {
+    public void writeInstanceIdFile(List<InstanceInfoDto> instanceIdList, String elMd5, String chainId) {
         if (StringUtils.isBlank(chainId) || CollUtil.isEmpty(instanceIdList)) {
             return;
         }

+ 2 - 2
liteflow-core/src/main/java/com/yomahub/liteflow/flow/instanceId/NodeInstanceIdManageSpi.java

@@ -2,7 +2,7 @@ package com.yomahub.liteflow.flow.instanceId;
 
 import com.yomahub.liteflow.flow.element.Chain;
 import com.yomahub.liteflow.flow.element.Condition;
-import com.yomahub.liteflow.flow.entity.InstanceIdDto;
+import com.yomahub.liteflow.flow.entity.InstanceInfoDto;
 
 import java.util.List;
 
@@ -18,7 +18,7 @@ public interface NodeInstanceIdManageSpi {
     List<String> readInstanceIdFile(String chainId);
 
     // 写入文件保存
-    void writeInstanceIdFile(List<InstanceIdDto> instanceIdList, String elMd5, String chainId);
+    void writeInstanceIdFile(List<InstanceInfoDto> instanceIdList, String elMd5, String chainId);
 
     // 根据实例id获取 节点实例定位
     String getNodeInstanceLocationById(String chainId, String instanceId);

+ 2 - 2
liteflow-core/src/main/java/com/yomahub/liteflow/util/JsonUtil.java

@@ -3,7 +3,6 @@ package com.yomahub.liteflow.util;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -13,6 +12,7 @@ import com.yomahub.liteflow.log.LFLog;
 import com.yomahub.liteflow.log.LFLoggerManager;
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.TimeZone;
 
@@ -80,7 +80,7 @@ public class JsonUtil {
 
 	public static <T> List<T> parseList(String json, Class<T> clazz) {
 		if (StrUtil.isEmpty(json)) {
-			return null;
+			return Collections.emptyList();
 		}
 		try {
 			CollectionType listType = objectMapper.getTypeFactory().constructCollectionType(ArrayList.class, clazz);

+ 0 - 2
liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/constant/SqlReadConstant.java

@@ -23,8 +23,6 @@ public class SqlReadConstant {
             "    `el_data_md5`          varchar(128)   NOT NULL,\n" +
             "    `node_instance_id_map_json`     varchar(1024)   NOT NULL\n" +
             ");";
-    // a_XXX_0
-    //         {"chainId":"chain1","nodeId":"a","instanceId":"XXXX","index":0},
 
     public static final String SQL_PATTERN = "SELECT * FROM {} WHERE {}='{}'";
 

+ 4 - 4
liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/spi/instanceId/SqlNodeInstanceIdManageSpiImpl.java

@@ -2,7 +2,7 @@ package com.yomahub.liteflow.parser.spi.instanceId;
 
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.StrUtil;
-import com.yomahub.liteflow.flow.entity.InstanceIdDto;
+import com.yomahub.liteflow.flow.entity.InstanceInfoDto;
 import com.yomahub.liteflow.flow.instanceId.BaseNodeInstanceIdManageSpi;
 import com.yomahub.liteflow.parser.constant.ReadType;
 import com.yomahub.liteflow.parser.constant.SqlReadConstant;
@@ -39,15 +39,15 @@ public class SqlNodeInstanceIdManageSpiImpl extends BaseNodeInstanceIdManageSpi
     }
 
     @Override
-    public void writeInstanceIdFile(List<InstanceIdDto> instanceIdList, String elMd5, String chainId) {
+    public void writeInstanceIdFile(List<InstanceInfoDto> instanceIdList, String elMd5, String chainId) {
         JDBCHelper jdbcHelper = JDBCHelper.getInstance();
         SQLParserVO conf = jdbcHelper.getSqlParserVO();
 
         String insertSql = StrUtil.format(SqlReadConstant.INSTANT_INSERT_SQL, conf.getInstanceIdTableName(), conf.getInstanceIdApplicationNameField(),
-                conf.getNodeInstanceIdMapJsondField(), conf.getElDataMd5Field(), conf.getInstanceChainIdField(), conf.getApplicationName(), JsonUtil.toJsonString(instanceIdList),
+                conf.getNodeInstanceIdMapJsonField(), conf.getElDataMd5Field(), conf.getInstanceChainIdField(), conf.getApplicationName(), JsonUtil.toJsonString(instanceIdList),
                 elMd5, chainId);
         String updateSql = StrUtil.format(SqlReadConstant.INSTANT_UPDATE_SQL, conf.getInstanceIdTableName(), conf.getElDataMd5Field(), elMd5,
-                conf.getNodeInstanceIdMapJsondField(), JsonUtil.toJsonString(instanceIdList), conf.getChainNameField(), chainId, conf.getInstanceIdApplicationNameField(), conf.getApplicationName());
+                conf.getNodeInstanceIdMapJsonField(), JsonUtil.toJsonString(instanceIdList), conf.getChainNameField(), chainId, conf.getInstanceIdApplicationNameField(), conf.getApplicationName());
         String selectSql = StrUtil.format(SqlReadConstant.INSTANT_SELECT_SQL, conf.getInstanceIdTableName(), conf.getInstanceChainIdField(), chainId,
                 conf.getInstanceIdApplicationNameField(), conf.getApplicationName());
 

+ 1 - 1
liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/read/impl/InstanceIdRead.java

@@ -28,7 +28,7 @@ public class InstanceIdRead extends AbstractSqlRead<InstanceIdVO> {
         InstanceIdVO idVO = new InstanceIdVO();
         idVO.setChainId(getStringFromRsWithCheck(rs, super.config.getInstanceChainIdField()));
         idVO.setElDataMd5(getStringFromRsWithCheck(rs, super.config.getElDataMd5Field()));
-        idVO.setNodeInstanceIdMapJson(getStringFromRsWithCheck(rs, super.config.getNodeInstanceIdMapJsondField()));
+        idVO.setNodeInstanceIdMapJson(getStringFromRsWithCheck(rs, super.config.getNodeInstanceIdMapJsonField()));
         return idVO;
     }
 

+ 5 - 5
liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/vo/SQLParserVO.java

@@ -79,7 +79,7 @@ public class SQLParserVO {
    /**
     * group_key_instance_id
     */
-    private String nodeInstanceIdMapJsondField = "node_instance_id_map_json";
+    private String nodeInstanceIdMapJsonField = "node_instance_id_map_json";
 
     /**
      * 决策路由字段
@@ -443,12 +443,12 @@ public class SQLParserVO {
         this.elDataMd5Field = elDataMd5Field;
     }
 
-    public String getNodeInstanceIdMapJsondField() {
-        return nodeInstanceIdMapJsondField;
+    public String getNodeInstanceIdMapJsonField() {
+        return nodeInstanceIdMapJsonField;
     }
 
-    public void setNodeInstanceIdMapJsondField(String nodeInstanceIdMapJsondField) {
-        this.nodeInstanceIdMapJsondField = nodeInstanceIdMapJsondField;
+    public void setNodeInstanceIdMapJsonField(String nodeInstanceIdMapJsonField) {
+        this.nodeInstanceIdMapJsonField = nodeInstanceIdMapJsonField;
     }
 
     public DataSourceConfig getBaomidou() {

+ 4 - 6
liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/java/com/yomahub/liteflow/test/sqlInstanceId/SQLWithXmlELInstanceIdSpringbootTest.java

@@ -2,7 +2,7 @@ package com.yomahub.liteflow.test.sqlInstanceId;
 
 import com.yomahub.liteflow.core.FlowExecutor;
 import com.yomahub.liteflow.flow.LiteflowResponse;
-import com.yomahub.liteflow.flow.entity.InstanceIdDto;
+import com.yomahub.liteflow.flow.entity.InstanceInfoDto;
 import com.yomahub.liteflow.flow.instanceId.NodeInstanceIdManageSpi;
 import com.yomahub.liteflow.flow.instanceId.NodeInstanceIdManageSpiHolder;
 import com.yomahub.liteflow.parser.sql.exception.ELSQLException;
@@ -12,9 +12,7 @@ import com.yomahub.liteflow.property.LiteflowConfigGetter;
 import com.yomahub.liteflow.test.BaseTest;
 import com.yomahub.liteflow.util.JsonUtil;
 import org.assertj.core.util.Sets;
-import org.json.JSONArray;
 import org.json.JSONException;
-import org.json.JSONObject;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
@@ -52,14 +50,14 @@ public class SQLWithXmlELInstanceIdSpringbootTest extends BaseTest {
         // 查询数据库实例id
         String instanceId = queryInstanceId("r_chain4");
         // 解析 JSON
-        List<InstanceIdDto> instanceIdDtos = JsonUtil.parseList(instanceId, InstanceIdDto.class);
+        List<InstanceInfoDto> instanceInfoDtos = JsonUtil.parseList(instanceId, InstanceInfoDto.class);
         // 构造实例id字符串
         StringBuilder result = new StringBuilder();
         int i = 0;
 
-        for (InstanceIdDto dto : instanceIdDtos) {
+        for (InstanceInfoDto dto : instanceInfoDtos) {
             result.append(dto.getNodeId()).append("[").append(dto.getInstanceId()).append("]");
-            if (i + 1 < instanceIdDtos.size()) {
+            if (i + 1 < instanceInfoDtos.size()) {
                 result.append("==>");
             }
             i++;