feature #I9RPBK 数据库插件支持决策路由特性

This commit is contained in:
everywhere.z
2024-05-23 19:28:21 +08:00
parent 46c974eead
commit 18cf5af502
16 changed files with 306 additions and 166 deletions

View File

@@ -16,7 +16,7 @@ public class SqlReadConstant {
public static final String SCRIPT_SQL_PATTERN = "SELECT * FROM {} WHERE {}=?";
public static final String CHAIN_XML_PATTERN = "<chain name=\"{}\"><![CDATA[{}]]></chain>";
public static final String CHAIN_XML_PATTERN = "<chain id=\"{}\" namespace=\"{}\"><route><![CDATA[{}]]></route><body><![CDATA[{}]]></body></chain>";
public static final String NODE_XML_PATTERN = "<nodes>{}</nodes>";

View File

@@ -11,6 +11,8 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* sql 轮询任务抽象类,维护公共方法
@@ -19,11 +21,11 @@ import java.util.Set;
* @author houxinyu
* @since 2.11.1
*/
public abstract class AbstractSqlReadPollTask implements SqlReadPollTask {
public abstract class AbstractSqlReadPollTask<T> implements SqlReadPollTask<T> {
private final Map<String/*唯一键*/, String/*data-xml的sha1值*/> DATA_SHA_MAP = new HashMap<>();
private final SqlRead read;
private final SqlRead<T> read;
public AbstractSqlReadPollTask(SqlRead read) {
public AbstractSqlReadPollTask(SqlRead<T> read) {
this.read = read;
if (!read.type().equals(type())) {
@@ -33,35 +35,34 @@ public abstract class AbstractSqlReadPollTask implements SqlReadPollTask {
@Override
public void execute() {
Map<String/*唯一键*/, String/*data-xml*/> newData = read.read();
List<T> dataList = read.read();
// 新增或者更新的元素
Map<String, String> saveElementMap = new HashMap<>();
List<T> saveElementList = new ArrayList<>();
// 删除的元素
List<String> deleteElementIds = new ArrayList<>();
List<String> deleteElementIds;
for (Map.Entry<String, String> entry : newData.entrySet()) {
String id = entry.getKey();
String element = entry.getValue();
String newSHA = DigestUtil.sha1Hex(element);
for (T data : dataList) {
String id = getKey(data);
String newSHA = getNeedSha1Value(data);
// 新增
// 如果封装的SHAMap中不存在该chain, 表示该元素为新增
if (!DATA_SHA_MAP.containsKey(id)) {
saveElementMap.put(id, element);
saveElementList.add(data);
DATA_SHA_MAP.put(id, newSHA);
}
// 修改
// SHA值发生变化,表示该元素的值已被修改,重新拉取变化的chain
else if (!StrUtil.equals(newSHA, DATA_SHA_MAP.get(id))) {
saveElementMap.put(id, element);
saveElementList.add(data);
DATA_SHA_MAP.put(id, newSHA);
}
}
Set<String> oldIdList = DATA_SHA_MAP.keySet(); // 旧的 id 列表
Set<String> newIdList = newData.keySet(); // 新的 id 列表
Set<String> newIdList = dataList.stream().map(this::getKey).collect(Collectors.toSet()); // 新的 id 列表
// 计算单差集
// 计算集合的单差集即只返回【oldIdList】中有但是【newIdList】中没有的元素例如
// subtractToList([1,2,3,4],[2,3,4,5]) -》 [1]
@@ -71,8 +72,8 @@ public abstract class AbstractSqlReadPollTask implements SqlReadPollTask {
DATA_SHA_MAP.remove(id);
}
if (CollUtil.isNotEmpty(saveElementMap)) {
doSave(saveElementMap);
if (CollUtil.isNotEmpty(saveElementList)) {
doSave(saveElementList);
}
if (CollUtil.isNotEmpty(deleteElementIds)) {
@@ -81,20 +82,34 @@ public abstract class AbstractSqlReadPollTask implements SqlReadPollTask {
}
@Override
public void initData(Map<String/*唯一键*/, String/*data-xml的数据*/> dataMap) {
DATA_SHA_MAP.putAll(shaMapValue(dataMap));
public void initData(List<T> dataList) {
DATA_SHA_MAP.putAll(shaValue(dataList));
}
public abstract void doSave(Map<String, String> saveElementMap);
public abstract void doSave(List<T> saveElementList);
public abstract void doDelete(List<String> deleteElementId);
private Map<String/*唯一键*/, String/*data-xml的sha1值*/> shaMapValue(Map<String, String> dataMap) {
private Map<String/*唯一键*/, String/*data-xml的sha1值*/> shaValue(List<T> dataList) {
Map<String, String> result = new HashMap<>();
dataMap.forEach((k, v) -> {
result.put(k, DigestUtil.sha1Hex(v));
});
dataList.forEach(t -> result.put(getKey(t), DigestUtil.sha1Hex(getNeedSha1Value(t))));
return result;
}
private String getNeedSha1Value(T data) {
if (StrUtil.isBlank(getExtValue(data))) {
return DigestUtil.sha1Hex(getValue(data));
}else{
return DigestUtil.sha1Hex(getValue(data) + "|||" + getExtValue(data));
}
}
// 如果是chain那就是返回chain的id如果是script那就返回script的id
protected abstract String getKey(T t);
// 如果是chain那就返回EL如果是script那就返回脚本数据
protected abstract String getValue(T t);
// 如果是chain那就返回route el如果是script这个不返回因为script没有扩展value
protected abstract String getExtValue(T t);
}

View File

@@ -2,6 +2,7 @@ package com.yomahub.liteflow.parser.sql.polling;
import com.yomahub.liteflow.parser.constant.ReadType;
import java.util.List;
import java.util.Map;
/**
@@ -11,7 +12,7 @@ import java.util.Map;
* @author houxinyu
* @since 2.11.1
*/
public interface SqlReadPollTask {
public interface SqlReadPollTask<T> {
/**
* 执行
@@ -21,9 +22,8 @@ public interface SqlReadPollTask {
/**
* 初始化数据
*
* @param dataMap 数据
*/
void initData(Map<String/*唯一键*/, String/*data-xml的数据*/> dataMap);
void initData(List<T> dataList);
/**
* 类型

View File

@@ -1,13 +1,16 @@
package com.yomahub.liteflow.parser.sql.polling.impl;
import cn.hutool.core.util.StrUtil;
import com.yomahub.liteflow.builder.el.LiteFlowChainELBuilder;
import com.yomahub.liteflow.flow.FlowBus;
import com.yomahub.liteflow.parser.constant.ReadType;
import com.yomahub.liteflow.parser.sql.polling.AbstractSqlReadPollTask;
import com.yomahub.liteflow.parser.sql.read.SqlRead;
import com.yomahub.liteflow.parser.sql.read.vo.ChainVO;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
/**
* chain 读取任务
@@ -16,20 +19,20 @@ import java.util.Map;
* @author houxinyu
* @since 2.11.1
*/
public class ChainReadPollTask extends AbstractSqlReadPollTask {
public class ChainReadPollTask extends AbstractSqlReadPollTask<ChainVO> {
public ChainReadPollTask(SqlRead read) {
public ChainReadPollTask(SqlRead<ChainVO> read) {
super(read);
}
@Override
public void doSave(Map<String, String> saveElementMap) {
for (Map.Entry<String, String> entry : saveElementMap.entrySet()) {
String chainName = entry.getKey();
String newData = entry.getValue();
LiteFlowChainELBuilder.createChain().setChainId(chainName).setEL(newData).build();
}
public void doSave(List<ChainVO> saveElementList) {
saveElementList.forEach(chainVO ->
LiteFlowChainELBuilder.createChain().setChainId(chainVO.getChainId())
.setRoute(chainVO.getRoute())
.setNamespace(chainVO.getNamespace())
.setEL(chainVO.getBody())
.build());
}
@Override
@@ -39,6 +42,21 @@ public class ChainReadPollTask extends AbstractSqlReadPollTask {
}
}
@Override
protected String getKey(ChainVO chainVO) {
return chainVO.getChainId();
}
@Override
protected String getValue(ChainVO chainVO) {
return chainVO.getBody();
}
@Override
protected String getExtValue(ChainVO chainVO) {
return chainVO.getRoute();
}
@Override
public ReadType type() {
return ReadType.CHAIN;

View File

@@ -1,13 +1,18 @@
package com.yomahub.liteflow.parser.sql.polling.impl;
import cn.hutool.core.util.StrUtil;
import com.yomahub.liteflow.builder.LiteFlowNodeBuilder;
import com.yomahub.liteflow.enums.NodeTypeEnum;
import com.yomahub.liteflow.flow.FlowBus;
import com.yomahub.liteflow.parser.constant.ReadType;
import com.yomahub.liteflow.parser.helper.NodeConvertHelper;
import com.yomahub.liteflow.parser.sql.polling.AbstractSqlReadPollTask;
import com.yomahub.liteflow.parser.sql.read.SqlRead;
import com.yomahub.liteflow.parser.sql.read.vo.ScriptVO;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
/**
* 脚本轮询任务
@@ -16,32 +21,45 @@ import java.util.Map;
* @author houxinyu
* @since 2.11.1
*/
public class ScriptReadPollTask extends AbstractSqlReadPollTask {
public ScriptReadPollTask(SqlRead read) {
public class ScriptReadPollTask extends AbstractSqlReadPollTask<ScriptVO> {
public ScriptReadPollTask(SqlRead<ScriptVO> read) {
super(read);
}
@Override
public void doSave(Map<String, String> saveElementMap) {
for (Map.Entry<String, String> entry : saveElementMap.entrySet()) {
String scriptKey = entry.getKey();
String newData = entry.getValue();
NodeConvertHelper.NodeSimpleVO scriptVO = NodeConvertHelper.convert(scriptKey);
NodeConvertHelper.changeScriptNode(scriptVO, newData);
}
public void doSave(List<ScriptVO> saveElementList) {
saveElementList.forEach(scriptVO -> LiteFlowNodeBuilder.createScriptNode()
.setId(scriptVO.getNodeId())
.setType(NodeTypeEnum.getEnumByCode(scriptVO.getType()))
.setName(scriptVO.getName())
.setScript(scriptVO.getScript())
.setLanguage(scriptVO.getLanguage())
.build());
}
@Override
public void doDelete(List<String> deleteElementId) {
for (String id : deleteElementId) {
NodeConvertHelper.NodeSimpleVO scriptVO = NodeConvertHelper.convert(id);
// 删除script
FlowBus.unloadScriptNode(scriptVO.getNodeId());
FlowBus.unloadScriptNode(id);
}
}
@Override
protected String getKey(ScriptVO scriptVO) {
return scriptVO.getNodeId();
}
@Override
protected String getValue(ScriptVO scriptVO) {
return scriptVO.getScript();
}
@Override
protected String getExtValue(ScriptVO scriptVO) {
return StrUtil.EMPTY;
}
@Override
public ReadType type() {
return ReadType.SCRIPT;

View File

@@ -9,7 +9,9 @@ import com.yomahub.liteflow.parser.sql.util.LiteFlowJdbcUtil;
import com.yomahub.liteflow.parser.sql.vo.SQLParserVO;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
@@ -20,7 +22,7 @@ import java.util.Map;
* @author Bryan.Zhang
* @since 2.11.1
*/
public abstract class AbstractSqlRead implements SqlRead {
public abstract class AbstractSqlRead<T> implements SqlRead<T> {
public final SQLParserVO config;
private static LFLog LOG = LFLoggerManager.getLogger(AbstractSqlRead.class);
@@ -29,10 +31,10 @@ public abstract class AbstractSqlRead implements SqlRead {
}
@Override
public Map<String/*规则唯一键*/, String/*规则内容*/> read() {
public List<T> read() {
// 如果不需要读取直接返回
if (!needRead()) {
return new HashMap<>();
return new ArrayList<>();
}
checkConfig();
@@ -40,7 +42,7 @@ public abstract class AbstractSqlRead implements SqlRead {
// 如果允许,就打印 sql 语句
logSqlIfEnable(sqlCmd);
Map<String/*规则唯一键*/, String/*规则*/> result = new HashMap<>();
List<T> result = new ArrayList<>();
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
@@ -54,9 +56,6 @@ public abstract class AbstractSqlRead implements SqlRead {
rs = stmt.executeQuery();
while (rs.next()) {
String xml = buildXmlElement(rs);
String uniqueKey = buildXmlElementUniqueKey(rs);
if (hasEnableFiled()){
boolean enable = getEnableFiledValue(rs);
// 如果停用,直接跳过
@@ -64,7 +63,7 @@ public abstract class AbstractSqlRead implements SqlRead {
continue;
}
}
result.put(uniqueKey, xml);
result.add(parse(rs));
}
} catch (Exception e) {
throw new ELSQLException(e.getMessage());
@@ -76,6 +75,8 @@ public abstract class AbstractSqlRead implements SqlRead {
return result;
}
protected abstract T parse(ResultSet rs) throws SQLException;
/**
* 是否包含启停字段
*/
@@ -88,10 +89,6 @@ public abstract class AbstractSqlRead implements SqlRead {
public abstract String buildQuerySql();
public abstract String buildXmlElement(ResultSet rs) throws SQLException;
public abstract String buildXmlElementUniqueKey(ResultSet rs) throws SQLException;
public abstract void checkConfig();
/**

View File

@@ -2,6 +2,7 @@ package com.yomahub.liteflow.parser.sql.read;
import com.yomahub.liteflow.parser.constant.ReadType;
import java.util.List;
import java.util.Map;
/**
@@ -11,14 +12,14 @@ import java.util.Map;
* @author houxinyu
* @since 2.11.1
*/
public interface SqlRead {
public interface SqlRead<T> {
/**
* 读取
*
* @return 返回读取到的数据
*/
Map<String/*规则唯一键*/, String/*规则内容*/> read();
List<T> read();
/**
* 类型

View File

@@ -19,8 +19,8 @@ import java.util.Map;
* @since 2.11.1
*/
public class SqlReadFactory {
private static final Map<ReadType, SqlRead> READ_MAP = new HashMap<>();
private static final Map<ReadType, SqlReadPollTask> POLL_TASK_MAP = new HashMap<>();
private static final Map<ReadType, SqlRead<?>> READ_MAP = new HashMap<>();
private static final Map<ReadType, SqlReadPollTask<?>> POLL_TASK_MAP = new HashMap<>();
public static void registerRead(SQLParserVO config) {
READ_MAP.putIfAbsent(ReadType.CHAIN, new ChainRead(config));
@@ -28,19 +28,21 @@ public class SqlReadFactory {
}
public static void registerSqlReadPollTask(ReadType readType) {
SqlRead sqlRead = getSqlRead(readType);
SqlRead<?> sqlRead = getSqlRead(readType);
if (ReadType.CHAIN.equals(readType)) {
POLL_TASK_MAP.putIfAbsent(ReadType.CHAIN, new ChainReadPollTask(sqlRead));
POLL_TASK_MAP.putIfAbsent(ReadType.CHAIN, new ChainReadPollTask((ChainRead)sqlRead));
} else if (ReadType.SCRIPT.equals(readType)) {
POLL_TASK_MAP.putIfAbsent(ReadType.SCRIPT, new ScriptReadPollTask(sqlRead));
POLL_TASK_MAP.putIfAbsent(ReadType.SCRIPT, new ScriptReadPollTask((ScriptRead)sqlRead));
}
}
public static SqlRead getSqlRead(ReadType readType) {
return READ_MAP.get(readType);
@SuppressWarnings("unchecked")
public static <T> SqlRead<T> getSqlRead(ReadType readType) {
return (SqlRead<T>)READ_MAP.get(readType);
}
public static SqlReadPollTask getSqlReadPollTask(ReadType readType) {
return POLL_TASK_MAP.get(readType);
@SuppressWarnings("unchecked")
public static <T> SqlReadPollTask<T> getSqlReadPollTask(ReadType readType) {
return (SqlReadPollTask<T>)POLL_TASK_MAP.get(readType);
}
}

View File

@@ -5,6 +5,7 @@ import com.yomahub.liteflow.parser.constant.ReadType;
import com.yomahub.liteflow.parser.constant.SqlReadConstant;
import com.yomahub.liteflow.parser.sql.exception.ELSQLException;
import com.yomahub.liteflow.parser.sql.read.AbstractSqlRead;
import com.yomahub.liteflow.parser.sql.read.vo.ChainVO;
import com.yomahub.liteflow.parser.sql.vo.SQLParserVO;
import java.sql.ResultSet;
@@ -17,12 +18,26 @@ import java.sql.SQLException;
* @author houxinyu
* @since 2.11.1
*/
public class ChainRead extends AbstractSqlRead {
public class ChainRead extends AbstractSqlRead<ChainVO> {
public ChainRead(SQLParserVO config) {
super(config);
}
@Override
protected ChainVO parse(ResultSet rs) throws SQLException {
ChainVO chainVO = new ChainVO();
chainVO.setChainId(getStringFromRsWithCheck(rs, super.config.getChainNameField()));
chainVO.setBody(getStringFromRsWithCheck(rs, super.config.getElDataField()));
if (StrUtil.isNotBlank(super.config.getNamespaceField())){
chainVO.setNamespace(getStringFromRs(rs, super.config.getNamespaceField()));
}
if (StrUtil.isNotBlank(super.config.getRouteField())){
chainVO.setRoute(getStringFromRs(rs, super.config.getRouteField()));
}
return chainVO;
}
@Override
public boolean hasEnableFiled() {
String chainEnableField = super.config.getChainEnableField();
@@ -70,20 +85,6 @@ public class ChainRead extends AbstractSqlRead {
}
}
@Override
public String buildXmlElement(ResultSet rs) throws SQLException {
String elDataField = super.config.getElDataField();
return getStringFromRs(rs, elDataField);
}
@Override
public String buildXmlElementUniqueKey(ResultSet rs) throws SQLException {
String chainNameField = super.config.getChainNameField();
return getStringFromRsWithCheck(rs, chainNameField);
}
@Override
public ReadType type() {
return ReadType.CHAIN;

View File

@@ -8,6 +8,7 @@ import com.yomahub.liteflow.parser.constant.ReadType;
import com.yomahub.liteflow.parser.constant.SqlReadConstant;
import com.yomahub.liteflow.parser.sql.exception.ELSQLException;
import com.yomahub.liteflow.parser.sql.read.AbstractSqlRead;
import com.yomahub.liteflow.parser.sql.read.vo.ScriptVO;
import com.yomahub.liteflow.parser.sql.util.LiteFlowJdbcUtil;
import com.yomahub.liteflow.parser.sql.vo.SQLParserVO;
@@ -24,12 +25,23 @@ import java.util.Objects;
* @author houxinyu
* @since 2.11.1
*/
public class ScriptRead extends AbstractSqlRead {
public class ScriptRead extends AbstractSqlRead<ScriptVO> {
public ScriptRead(SQLParserVO config) {
super(config);
}
@Override
protected ScriptVO parse(ResultSet rs) throws SQLException {
ScriptVO scriptVO = new ScriptVO();
scriptVO.setNodeId(getStringFromRsWithCheck(rs, super.config.getScriptIdField()));
scriptVO.setName(getStringFromRs(rs, super.config.getScriptNameField()));
scriptVO.setType(getStringFromRsWithCheck(rs, super.config.getScriptTypeField()));
scriptVO.setLanguage(getStringFromRs(rs, super.config.getScriptLanguageField()));
scriptVO.setScript(getStringFromRsWithCheck(rs, super.config.getScriptDataField()));
return scriptVO;
}
@Override
public boolean hasEnableFiled() {
String scriptEnableField = super.config.getScriptEnableField();
@@ -80,46 +92,6 @@ public class ScriptRead extends AbstractSqlRead {
}
}
@Override
public String buildXmlElement(ResultSet rs) throws SQLException {
String scriptDataField = super.config.getScriptDataField();
return getStringFromRs(rs, scriptDataField);
}
@Override
public String buildXmlElementUniqueKey(ResultSet rs) throws SQLException {
String scriptIdField = super.config.getScriptIdField();
String scriptNameField = super.config.getScriptNameField();
String scriptTypeField = super.config.getScriptTypeField();
String scriptLanguageField = super.config.getScriptLanguageField();
String id = getStringFromRsWithCheck(rs, scriptIdField);
String name = getStringFromRsWithCheck(rs, scriptNameField);
String type = getStringFromRsWithCheck(rs, scriptTypeField);
String language = withLanguage() ? getStringFromRs(rs, scriptLanguageField) : null;
NodeTypeEnum nodeTypeEnum = NodeTypeEnum.getEnumByCode(type);
if (Objects.isNull(nodeTypeEnum)) {
throw new ELSQLException(StrUtil.format("Invalid type value[{}]", type));
}
if (!nodeTypeEnum.isScript()) {
throw new ELSQLException(StrUtil.format("The type value[{}] is not a script type", type));
}
if (withLanguage() && !ScriptTypeEnum.checkScriptType(language)) {
throw new ELSQLException(StrUtil.format("The language value[{}] is invalid", language));
}
List<String> keys = CollUtil.newArrayList(id, type, name);
if (StrUtil.isNotBlank(language)) {
keys.add(language);
}
return StrUtil.join(StrUtil.COLON, keys);
}
@Override
public boolean needRead() {
if (StrUtil.isBlank(super.config.getScriptTableName())) {

View File

@@ -0,0 +1,44 @@
package com.yomahub.liteflow.parser.sql.read.vo;
public class ChainVO {
private String chainId;
private String route;
private String namespace;
private String body;
public String getChainId() {
return chainId;
}
public void setChainId(String chainId) {
this.chainId = chainId;
}
public String getRoute() {
return route;
}
public void setRoute(String route) {
this.route = route;
}
public String getNamespace() {
return namespace;
}
public void setNamespace(String namespace) {
this.namespace = namespace;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
}

View File

@@ -0,0 +1,64 @@
package com.yomahub.liteflow.parser.sql.read.vo;
public class ScriptVO {
private String nodeId;
private String type;
private String name;
private String language;
private Boolean enable;
private String script;
public String getNodeId() {
return nodeId;
}
public void setNodeId(String nodeId) {
this.nodeId = nodeId;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language;
}
public Boolean getEnable() {
return enable;
}
public void setEnable(Boolean enable) {
this.enable = enable;
}
public String getScript() {
return script;
}
public void setScript(String script) {
this.script = script;
}
}

View File

@@ -11,9 +11,12 @@ import com.yomahub.liteflow.parser.constant.ReadType;
import com.yomahub.liteflow.parser.helper.NodeConvertHelper;
import com.yomahub.liteflow.parser.sql.exception.ELSQLException;
import com.yomahub.liteflow.parser.sql.polling.SqlReadPollTask;
import com.yomahub.liteflow.parser.sql.read.AbstractSqlRead;
import com.yomahub.liteflow.parser.sql.read.SqlRead;
import com.yomahub.liteflow.parser.sql.read.SqlReadFactory;
import com.yomahub.liteflow.parser.sql.read.vo.ChainVO;
import com.yomahub.liteflow.parser.sql.read.vo.ScriptVO;
import com.yomahub.liteflow.parser.sql.vo.SQLParserVO;
import org.apache.commons.lang.StringUtils;
@@ -87,30 +90,30 @@ public class JDBCHelper {
* @return 数据内容
*/
public String getContent() {
SqlRead chainRead = SqlReadFactory.getSqlRead(ReadType.CHAIN);
SqlRead scriptRead = SqlReadFactory.getSqlRead(ReadType.SCRIPT);
SqlRead<ChainVO> chainRead = SqlReadFactory.getSqlRead(ReadType.CHAIN);
SqlRead<ScriptVO> scriptRead = SqlReadFactory.getSqlRead(ReadType.SCRIPT);
// 获取 chain 数据
Map<String, String> chainMap = chainRead.read();
List<ChainVO> chainVOList = chainRead.read();
List<String> chainList = new ArrayList<>();
chainMap.entrySet().stream()
.filter(entry -> StrUtil.isNotBlank(entry.getValue()))
.forEach(
entry -> chainList.add(StrUtil.format(CHAIN_XML_PATTERN, XmlUtil.escape(entry.getKey()), entry.getValue()))
);
chainVOList.forEach(
chainVO -> chainList.add(StrUtil.format(CHAIN_XML_PATTERN, XmlUtil.escape(chainVO.getChainId()), StrUtil.emptyIfNull(chainVO.getNamespace()), StrUtil.emptyIfNull(chainVO.getRoute()), chainVO.getBody()))
);
String chainsContent = CollUtil.join(chainList, StrUtil.EMPTY);
// 获取脚本数据
Map<String, String> scriptMap = scriptRead.read();
List<ScriptVO> scriptVOList = scriptRead.read();
List<String> scriptList = new ArrayList<>();
scriptMap.forEach((scriptKey, elData) -> {
NodeConvertHelper.NodeSimpleVO scriptVO = NodeConvertHelper.convert(scriptKey);
scriptVOList.forEach(scriptVO -> {
String id = scriptVO.getNodeId();
String name = scriptVO.getName();
String type = scriptVO.getType();
String language = scriptVO.getLanguage();
String elData = scriptVO.getScript();
if (StringUtils.isNotBlank(scriptVO.getLanguage())) {
scriptList.add(StrUtil.format(NODE_ITEM_WITH_LANGUAGE_XML_PATTERN, XmlUtil.escape(id), XmlUtil.escape(name), type, language, elData));
@@ -118,11 +121,14 @@ public class JDBCHelper {
scriptList.add(StrUtil.format(NODE_ITEM_XML_PATTERN, XmlUtil.escape(id), XmlUtil.escape(name), type, elData));
}
});
String nodesContent = StrUtil.format(NODE_XML_PATTERN, CollUtil.join(scriptList, StrUtil.EMPTY));
// 初始化轮询任务
SqlReadFactory.getSqlReadPollTask(ReadType.CHAIN).initData(chainMap);
SqlReadFactory.getSqlReadPollTask(ReadType.SCRIPT).initData(scriptMap);
SqlReadPollTask<ChainVO> sqlReadPollTask4Chain = SqlReadFactory.getSqlReadPollTask(ReadType.CHAIN);
sqlReadPollTask4Chain.initData(chainVOList);
SqlReadPollTask<ScriptVO> sqlReadPollTask4Script = SqlReadFactory.getSqlReadPollTask(ReadType.SCRIPT);
sqlReadPollTask4Script.initData(scriptVOList);
return StrUtil.format(XML_PATTERN, nodesContent, chainsContent);
}

View File

@@ -56,6 +56,16 @@ public class SQLParserVO {
*/
private String elDataField = "el_data";
/**
* 决策路由字段
*/
private String routeField;
/**
* 命名空间字段
*/
private String namespaceField;
/**
* 是否启动某一条chain
*/
@@ -310,4 +320,20 @@ public class SQLParserVO {
public boolean hasEnableField() {
return StrUtil.isNotBlank(chainEnableField) || StrUtil.isNotBlank(scriptEnableField);
}
public String getRouteField() {
return routeField;
}
public void setRouteField(String routeField) {
this.routeField = routeField;
}
public String getNamespaceField() {
return namespaceField;
}
public void setNamespaceField(String namespaceField) {
this.namespaceField = namespaceField;
}
}