diff --git a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/util/ScriptPollingTask.java b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/util/ScriptPollingTask.java index 5a68e6f7..0c8c1065 100644 --- a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/util/ScriptPollingTask.java +++ b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/util/ScriptPollingTask.java @@ -23,13 +23,9 @@ import java.util.*; */ public class ScriptPollingTask implements Runnable { - private static final String SQL_PATTERN = "SELECT {},{} FROM {} WHERE {}=?"; + private static final String SCRIPT_PATTERN = "SELECT {},{},{},{} FROM {} WHERE {}=?"; - private static final String CONCAT_PATTERN = "CONCAT_WS(':',{},{},{}) as script_concat"; - - private static final String CONCAT_WITH_LANGUAGE_PATTERN = "CONCAT_WS(':',{},{},{},{}) as script_concat"; - - private static final String SCRIPT_KEY_FIELD = "script_concat"; + private static final String SCRIPT_PATTERN_WITH_LANGUAGE = "SELECT {},{},{},{},{} FROM {} WHERE {}=?"; private Connection conn; @@ -62,14 +58,16 @@ public class ScriptPollingTask implements Runnable { String applicationName = sqlParserVO.getApplicationName(); String scriptLanguageField = sqlParserVO.getScriptLanguageField(); - String KeyField; + String sqlCmd = null; if (StrUtil.isNotBlank(scriptLanguageField)) { - KeyField = StrUtil.format(CONCAT_WITH_LANGUAGE_PATTERN, scriptIdField, scriptTypeField, scriptNameField, scriptLanguageField); + //脚本有语言 + sqlCmd = StrUtil.format(SCRIPT_PATTERN_WITH_LANGUAGE, scriptDataField, scriptIdField, scriptTypeField, scriptNameField, + scriptLanguageField, scriptTableName, scriptApplicationNameField); } else { - KeyField = StrUtil.format(CONCAT_PATTERN, scriptIdField, scriptTypeField, scriptNameField); + sqlCmd = StrUtil.format(SCRIPT_PATTERN, scriptDataField, scriptIdField, scriptTypeField, scriptNameField, + scriptTableName, scriptApplicationNameField); } - String sqlCmd = StrUtil.format(SQL_PATTERN, KeyField, scriptDataField, scriptTableName, scriptApplicationNameField); stmt = conn.prepareStatement(sqlCmd, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); // 设置游标拉取数量 stmt.setFetchSize(FETCH_SIZE_MAX); @@ -79,7 +77,7 @@ public class ScriptPollingTask implements Runnable { Set newScriptSet = new HashSet<>(); while (rs.next()) { - String scriptKey = getStringFromResultSet(rs, SCRIPT_KEY_FIELD); + String scriptKey = getScriptKeyFromRS(rs, sqlParserVO); String newData = getStringFromResultSet(rs, scriptDataField); String newSHA = DigestUtil.sha1Hex(newData); newScriptSet.add(scriptKey); @@ -92,8 +90,7 @@ public class ScriptPollingTask implements Runnable { //加入到shaMap scriptSHAMap.put(scriptKey, newSHA); - } - else if (!StrUtil.equals(newSHA, scriptSHAMap.get(scriptKey))) { + } else if (!StrUtil.equals(newSHA, scriptSHAMap.get(scriptKey))) { //SHA值发生变化,表示该script的值已被修改,重新拉取变化的script NodeConvertHelper.NodeSimpleVO scriptVO = NodeConvertHelper.convert(scriptKey); //修改script @@ -106,7 +103,7 @@ public class ScriptPollingTask implements Runnable { //SHA值无变化,表示该chain未改变 } - if(scriptSHAMap.size() > newScriptSet.size()) { + if (scriptSHAMap.size() > newScriptSet.size()) { //如果遍历prepareStatement后修改过的SHAMap数量比最新script总数多, 说明有两种情况: // 1、删除了script // 2、修改了script的id/name/type:因为遍历到新的script_key时会加到SHAMap里,但没有机会删除旧的script @@ -114,7 +111,7 @@ public class ScriptPollingTask implements Runnable { //在此处遍历scriptSHAMap,把不在newScriptSet中的script删除 //这里用iterator是为避免在遍历集合时删除元素导致ConcurrentModificationException Iterator iterator = scriptSHAMap.keySet().iterator(); - while(iterator.hasNext()){ + while (iterator.hasNext()) { String scriptKey = iterator.next(); if (!newScriptSet.contains(scriptKey)) { NodeConvertHelper.NodeSimpleVO scriptVO = NodeConvertHelper.convert(scriptKey); @@ -142,4 +139,16 @@ public class ScriptPollingTask implements Runnable { } return data; } + + private String getScriptKeyFromRS(ResultSet rs, SQLParserVO sqlParserVO) throws SQLException { + String id = getStringFromResultSet(rs, sqlParserVO.getScriptIdField()); + String type = getStringFromResultSet(rs, sqlParserVO.getScriptTypeField()); + String name = getStringFromResultSet(rs, sqlParserVO.getScriptNameField()); + String scriptKey = StrUtil.join(":", id, type, name); + if (StrUtil.isNotBlank(sqlParserVO.getScriptLanguageField())) { + String language = getStringFromResultSet(rs, sqlParserVO.getScriptLanguageField()); + scriptKey = StrUtil.join(":", id, type, name, language); + } + return scriptKey; + } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/java/com/yomahub/liteflow/test/sql/SQLWithXmlELSpringbootPollingTest.java b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/java/com/yomahub/liteflow/test/sql/SQLWithXmlELSpringbootPollingTest.java index caf288ca..e907cc2a 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/java/com/yomahub/liteflow/test/sql/SQLWithXmlELSpringbootPollingTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/java/com/yomahub/liteflow/test/sql/SQLWithXmlELSpringbootPollingTest.java @@ -148,7 +148,7 @@ public class SQLWithXmlELSpringbootPollingTest extends BaseTest { Statement statement = connection.createStatement(); //修改script data statement.executeUpdate( - "UPDATE SCRIPT_NODE_TABLE SET SCRIPT_NODE_DATA='return false;' WHERE SCRIPT_NODE_ID='x1'"); + "UPDATE SCRIPT_NODE_TABLE SET SCRIPT_NODE_DATA='return false' WHERE SCRIPT_NODE_ID='x1'"); //修改script名 statement.executeUpdate( "UPDATE SCRIPT_NODE_TABLE SET SCRIPT_NODE_NAME='x0_script' WHERE SCRIPT_NODE_ID='x0'");