#IB0SJ1 调整逻辑

This commit is contained in:
jay li
2024-12-06 20:50:59 +08:00
parent 882d3d1491
commit 33b18cbd77
11 changed files with 53 additions and 52 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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 {}='{}'";

View File

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

View File

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

View File

@@ -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() {

View File

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