From 33b18cbd77d4826b91eb6c821e6a427e550927ff Mon Sep 17 00:00:00 2001 From: jay li <221531386@qq.com> Date: Fri, 6 Dec 2024 20:50:59 +0800 Subject: [PATCH] =?UTF-8?q?#IB0SJ1=20=E8=B0=83=E6=95=B4=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../builder/el/LiteFlowChainELBuilder.java | 7 +++ ...nstanceIdDto.java => InstanceInfoDto.java} | 9 ++-- .../BaseNodeInstanceIdManageSpi.java | 45 +++++++++---------- .../DefaultNodeInstanceIdManageSpiImpl.java | 4 +- .../instanceId/NodeInstanceIdManageSpi.java | 4 +- .../com/yomahub/liteflow/util/JsonUtil.java | 4 +- .../parser/constant/SqlReadConstant.java | 2 - .../SqlNodeInstanceIdManageSpiImpl.java | 8 ++-- .../parser/sql/read/impl/InstanceIdRead.java | 2 +- .../liteflow/parser/sql/vo/SQLParserVO.java | 10 ++--- .../SQLWithXmlELInstanceIdSpringbootTest.java | 10 ++--- 11 files changed, 53 insertions(+), 52 deletions(-) rename liteflow-core/src/main/java/com/yomahub/liteflow/flow/entity/{InstanceIdDto.java => InstanceInfoDto.java} (85%) diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/LiteFlowChainELBuilder.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/LiteFlowChainELBuilder.java index 50650bf57..e22fd4e1f 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/LiteFlowChainELBuilder.java +++ b/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)); diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/entity/InstanceIdDto.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/entity/InstanceInfoDto.java similarity index 85% rename from liteflow-core/src/main/java/com/yomahub/liteflow/flow/entity/InstanceIdDto.java rename to liteflow-core/src/main/java/com/yomahub/liteflow/flow/entity/InstanceInfoDto.java index 1c6d604a6..38b88cb30 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/entity/InstanceIdDto.java +++ b/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; diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/instanceId/BaseNodeInstanceIdManageSpi.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/instanceId/BaseNodeInstanceIdManageSpi.java index d8b3efe52..bfdca6f80 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/instanceId/BaseNodeInstanceIdManageSpi.java +++ b/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 instanceIdFile = readInstanceIdFile(chainId); for (int i = 1; i < instanceIdFile.size(); i++) { - List instanceIdDtos = parseList(instanceIdFile.get(i), InstanceIdDto.class); - if (instanceIdDtos == null) { - continue; - } + List 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 instanceIdFile = nodeInstanceIdManageSpi.readInstanceIdFile(chain.getChainId()); + String chainId = chain.getChainId(); + List 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 instanceIdDtos = new ArrayList<>(); + List instanceInfoDtos = new ArrayList<>(); for (int i = 1; i < instanceIdFile.size(); i++) { - List instanceIdDtos1 = parseList(instanceIdFile.get(i), InstanceIdDto.class); - if (instanceIdDtos1 != null) { - instanceIdDtos.addAll(instanceIdDtos1); + List 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 writeNodeInstanceId(Condition condition) { - ArrayList instanceIdDtos = new ArrayList<>(); + private List writeNodeInstanceId(Condition condition, String chainId) { + ArrayList instanceInfos = new ArrayList<>(); condition.getExecutableGroup().forEach((key, executables) -> { + // 统计每个nodeId的索引 Map 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; } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/instanceId/DefaultNodeInstanceIdManageSpiImpl.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/instanceId/DefaultNodeInstanceIdManageSpiImpl.java index d787326b2..cc94e8185 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/instanceId/DefaultNodeInstanceIdManageSpiImpl.java +++ b/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 instanceIdList, String elMd5, String chainId) { + public void writeInstanceIdFile(List instanceIdList, String elMd5, String chainId) { if (StringUtils.isBlank(chainId) || CollUtil.isEmpty(instanceIdList)) { return; } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/instanceId/NodeInstanceIdManageSpi.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/instanceId/NodeInstanceIdManageSpi.java index 91c4350dc..6f19d2964 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/instanceId/NodeInstanceIdManageSpi.java +++ b/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 readInstanceIdFile(String chainId); // 写入文件保存 - void writeInstanceIdFile(List instanceIdList, String elMd5, String chainId); + void writeInstanceIdFile(List instanceIdList, String elMd5, String chainId); // 根据实例id获取 节点实例定位 String getNodeInstanceLocationById(String chainId, String instanceId); diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/util/JsonUtil.java b/liteflow-core/src/main/java/com/yomahub/liteflow/util/JsonUtil.java index cb31cd848..6d8815938 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/util/JsonUtil.java +++ b/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 List parseList(String json, Class clazz) { if (StrUtil.isEmpty(json)) { - return null; + return Collections.emptyList(); } try { CollectionType listType = objectMapper.getTypeFactory().constructCollectionType(ArrayList.class, clazz); diff --git a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/constant/SqlReadConstant.java b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/constant/SqlReadConstant.java index 12cfeef69..b5442d514 100644 --- a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/constant/SqlReadConstant.java +++ b/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 {}='{}'"; diff --git a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/spi/instanceId/SqlNodeInstanceIdManageSpiImpl.java b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/spi/instanceId/SqlNodeInstanceIdManageSpiImpl.java index 58c90d10c..4472479ab 100644 --- a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/spi/instanceId/SqlNodeInstanceIdManageSpiImpl.java +++ b/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 instanceIdList, String elMd5, String chainId) { + public void writeInstanceIdFile(List 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()); diff --git a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/read/impl/InstanceIdRead.java b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/read/impl/InstanceIdRead.java index 5f916b96b..5ea2deaf5 100644 --- a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/read/impl/InstanceIdRead.java +++ b/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 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; } diff --git a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/vo/SQLParserVO.java b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/vo/SQLParserVO.java index a45bdfac8..67257084c 100644 --- a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/vo/SQLParserVO.java +++ b/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() { diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/java/com/yomahub/liteflow/test/sqlInstanceId/SQLWithXmlELInstanceIdSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/java/com/yomahub/liteflow/test/sqlInstanceId/SQLWithXmlELInstanceIdSpringbootTest.java index 863c41daf..886796323 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/java/com/yomahub/liteflow/test/sqlInstanceId/SQLWithXmlELInstanceIdSpringbootTest.java +++ b/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 instanceIdDtos = JsonUtil.parseList(instanceId, InstanceIdDto.class); + List 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++;