mirror of
https://gitee.com/dromara/liteFlow.git
synced 2026-05-14 20:22:07 +08:00
feature #I9RPBK 数据库插件支持决策路由特性
This commit is contained in:
@@ -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>";
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
/**
|
||||
* 类型
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
/**
|
||||
|
||||
@@ -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();
|
||||
|
||||
/**
|
||||
* 类型
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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())) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user