diff --git a/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/config/LiteflowMainAutoConfiguration.java b/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/config/LiteflowMainAutoConfiguration.java
index 319ed9edf..2398202a6 100644
--- a/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/config/LiteflowMainAutoConfiguration.java
+++ b/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/config/LiteflowMainAutoConfiguration.java
@@ -18,7 +18,7 @@ import org.noear.solon.core.AppContext;
@Configuration
public class LiteflowMainAutoConfiguration {
- @Inject(value = "${liteflow.parseOnStart}", required = false)
+ @Inject(value = "${liteflow.parseOnStart:true}", required = false)
boolean parseOnStart;
@Inject
diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-solon/pom.xml b/liteflow-testcase-el/liteflow-testcase-el-sql-solon/pom.xml
new file mode 100644
index 000000000..33e2bc582
--- /dev/null
+++ b/liteflow-testcase-el/liteflow-testcase-el-sql-solon/pom.xml
@@ -0,0 +1,107 @@
+
+
+ 4.0.0
+
+ com.yomahub
+ liteflow-testcase-el
+ 2.12.2
+
+
+ liteflow-testcase-el-sql-solon
+
+
+ 2.1.214
+ 8
+ 8
+ UTF-8
+
+
+
+
+
+ com.yomahub
+ liteflow-rule-sql
+ ${revision}
+ test
+
+
+
+ com.yomahub
+ liteflow-core
+ ${revision}
+
+
+
+ com.h2database
+ h2
+ ${h2.version}
+ test
+
+
+
+ com.yomahub
+ liteflow-script-groovy
+ ${revision}
+ test
+
+
+
+ com.yomahub
+ liteflow-script-graaljs
+ ${revision}
+ test
+
+
+
+ com.yomahub
+ liteflow-solon-plugin
+ ${revision}
+
+
+
+ com.yomahub
+ liteflow-el-builder
+ ${revision}
+
+
+
+ org.noear
+ solon-test-junit5
+ ${solon.version}
+ test
+
+
+
+ org.aspectj
+ aspectjweaver
+ test
+
+
+ org.apache.curator
+ curator-test
+ test
+
+
+ com.101tec
+ zkclient
+ test
+
+
+ org.apache.curator
+ curator-framework
+
+
+ org.apache.curator
+ curator-recipes
+
+
+
+ mysql
+ mysql-connector-java
+ 8.0.31
+ test
+
+
+
\ No newline at end of file
diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-solon/src/test/java/com/yomahub/liteflow/test/BaseTest.java b/liteflow-testcase-el/liteflow-testcase-el-sql-solon/src/test/java/com/yomahub/liteflow/test/BaseTest.java
new file mode 100644
index 000000000..0f94c22f3
--- /dev/null
+++ b/liteflow-testcase-el/liteflow-testcase-el-sql-solon/src/test/java/com/yomahub/liteflow/test/BaseTest.java
@@ -0,0 +1,21 @@
+package com.yomahub.liteflow.test;
+
+import com.yomahub.liteflow.core.FlowInitHook;
+import com.yomahub.liteflow.flow.FlowBus;
+import com.yomahub.liteflow.property.LiteflowConfigGetter;
+import com.yomahub.liteflow.spi.holder.SpiFactoryCleaner;
+import com.yomahub.liteflow.thread.ExecutorHelper;
+import org.junit.jupiter.api.AfterAll;
+
+public class BaseTest {
+
+ @AfterAll
+ public static void cleanScanCache() {
+ FlowBus.cleanCache();
+ ExecutorHelper.loadInstance().clearExecutorServiceMap();
+ SpiFactoryCleaner.clean();
+ LiteflowConfigGetter.clean();
+ FlowInitHook.cleanHook();
+ FlowBus.clearStat();
+ }
+}
diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-solon/src/test/java/com/yomahub/liteflow/test/def/SQLWithXmlELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-sql-solon/src/test/java/com/yomahub/liteflow/test/def/SQLWithXmlELSpringbootTest.java
new file mode 100644
index 000000000..e550ed2bd
--- /dev/null
+++ b/liteflow-testcase-el/liteflow-testcase-el-sql-solon/src/test/java/com/yomahub/liteflow/test/def/SQLWithXmlELSpringbootTest.java
@@ -0,0 +1,32 @@
+package com.yomahub.liteflow.test.def;
+
+import com.yomahub.liteflow.core.FlowExecutor;
+import com.yomahub.liteflow.flow.LiteflowResponse;
+import com.yomahub.liteflow.test.BaseTest;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.noear.solon.annotation.Import;
+import org.noear.solon.annotation.Inject;
+import org.noear.solon.test.SolonJUnit5Extension;
+
+@ExtendWith(SolonJUnit5Extension.class)
+@Import(profiles = "classpath:/application.properties")
+public class SQLWithXmlELSpringbootTest extends BaseTest {
+
+ @Inject
+ private FlowExecutor flowExecutor;
+
+ @Test
+ public void testSQLWithXml() {
+ LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg");
+ Assertions.assertEquals("a==>b==>c", response.getExecuteStepStr());
+ }
+
+ @Test
+ public void testSQLWithScriptXml() {
+ LiteflowResponse response = flowExecutor.execute2Resp("chain3", "arg");
+ Assertions.assertTrue(response.isSuccess());
+ Assertions.assertEquals("x0[if 脚本]==>a==>b", response.getExecuteStepStrWithoutTime());
+ }
+}
diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-solon/src/test/java/com/yomahub/liteflow/test/def/cmp/ACmp.java b/liteflow-testcase-el/liteflow-testcase-el-sql-solon/src/test/java/com/yomahub/liteflow/test/def/cmp/ACmp.java
new file mode 100644
index 000000000..68ddb8e67
--- /dev/null
+++ b/liteflow-testcase-el/liteflow-testcase-el-sql-solon/src/test/java/com/yomahub/liteflow/test/def/cmp/ACmp.java
@@ -0,0 +1,21 @@
+/**
+ *
Title: liteflow
+ * Description: 轻量级的组件式流程框架
+ * @author Bryan.Zhang
+ * @email weenyc31@163.com
+ * @Date 2020/4/1
+ */
+package com.yomahub.liteflow.test.def.cmp;
+
+import com.yomahub.liteflow.core.NodeComponent;
+import org.noear.solon.annotation.Component;
+
+@Component("a")
+public class ACmp extends NodeComponent {
+
+ @Override
+ public void process() {
+ System.out.println("ACmp executed!");
+ }
+
+}
diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-solon/src/test/java/com/yomahub/liteflow/test/def/cmp/BCmp.java b/liteflow-testcase-el/liteflow-testcase-el-sql-solon/src/test/java/com/yomahub/liteflow/test/def/cmp/BCmp.java
new file mode 100644
index 000000000..c1a5c5612
--- /dev/null
+++ b/liteflow-testcase-el/liteflow-testcase-el-sql-solon/src/test/java/com/yomahub/liteflow/test/def/cmp/BCmp.java
@@ -0,0 +1,21 @@
+/**
+ * Title: liteflow
+ * Description: 轻量级的组件式流程框架
+ * @author Bryan.Zhang
+ * @email weenyc31@163.com
+ * @Date 2020/4/1
+ */
+package com.yomahub.liteflow.test.def.cmp;
+
+import com.yomahub.liteflow.core.NodeComponent;
+import org.noear.solon.annotation.Component;
+
+@Component("b")
+public class BCmp extends NodeComponent {
+
+ @Override
+ public void process() {
+ System.out.println("BCmp executed!");
+ }
+
+}
diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-solon/src/test/java/com/yomahub/liteflow/test/def/cmp/CCmp.java b/liteflow-testcase-el/liteflow-testcase-el-sql-solon/src/test/java/com/yomahub/liteflow/test/def/cmp/CCmp.java
new file mode 100644
index 000000000..29502f361
--- /dev/null
+++ b/liteflow-testcase-el/liteflow-testcase-el-sql-solon/src/test/java/com/yomahub/liteflow/test/def/cmp/CCmp.java
@@ -0,0 +1,21 @@
+/**
+ * Title: liteflow
+ * Description: 轻量级的组件式流程框架
+ * @author Bryan.Zhang
+ * @email weenyc31@163.com
+ * @Date 2020/4/1
+ */
+package com.yomahub.liteflow.test.def.cmp;
+
+import com.yomahub.liteflow.core.NodeComponent;
+import org.noear.solon.annotation.Component;
+
+@Component("c")
+public class CCmp extends NodeComponent {
+
+ @Override
+ public void process() {
+ System.out.println("CCmp executed!");
+ }
+
+}
diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-solon/src/test/resources/application.properties b/liteflow-testcase-el/liteflow-testcase-el-sql-solon/src/test/resources/application.properties
new file mode 100644
index 000000000..7374e9fed
--- /dev/null
+++ b/liteflow-testcase-el/liteflow-testcase-el-sql-solon/src/test/resources/application.properties
@@ -0,0 +1,21 @@
+liteflow.rule-source-ext-data-map.url=jdbc:h2:mem:test_db;MODE=MySQL;INIT=RUNSCRIPT FROM 'classpath:sql/schema.sql'\\;RUNSCRIPT FROM 'classpath:sql/data.sql'
+liteflow.rule-source-ext-data-map.driverClassName=org.h2.Driver
+liteflow.rule-source-ext-data-map.username=root
+liteflow.rule-source-ext-data-map.password=123456
+liteflow.rule-source-ext-data-map.applicationName=demo
+liteflow.rule-source-ext-data-map.sqlLogEnabled=true
+liteflow.rule-source-ext-data-map.pollingEnabled=true
+liteflow.rule-source-ext-data-map.pollingIntervalSeconds=60
+liteflow.rule-source-ext-data-map.pollingStartSeconds=60
+liteflow.rule-source-ext-data-map.chainTableName=EL_TABLE
+liteflow.rule-source-ext-data-map.chainApplicationNameField=application_name
+liteflow.rule-source-ext-data-map.chainNameField=chain_name
+liteflow.rule-source-ext-data-map.elDataField=EL_DATA
+liteflow.rule-source-ext-data-map.namespaceField=namespace
+liteflow.rule-source-ext-data-map.scriptTableName=script_node_table
+liteflow.rule-source-ext-data-map.scriptApplicationNameField=application_name
+liteflow.rule-source-ext-data-map.scriptIdField=script_node_id
+liteflow.rule-source-ext-data-map.scriptNameField=script_node_name
+liteflow.rule-source-ext-data-map.scriptDataField=script_node_data
+liteflow.rule-source-ext-data-map.scriptTypeField=script_node_type
+liteflow.rule-source-ext-data-map.scriptLanguageField=script_language
\ No newline at end of file
diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-solon/src/test/resources/sql/data.sql b/liteflow-testcase-el/liteflow-testcase-el-sql-solon/src/test/resources/sql/data.sql
new file mode 100644
index 000000000..e885458bf
--- /dev/null
+++ b/liteflow-testcase-el/liteflow-testcase-el-sql-solon/src/test/resources/sql/data.sql
@@ -0,0 +1,16 @@
+DELETE FROM EL_TABLE;
+
+INSERT INTO EL_TABLE (APPLICATION_NAME,CHAIN_NAME,EL_DATA) values ('demo','chain1','THEN(a, b, c);');
+INSERT INTO EL_TABLE (APPLICATION_NAME,CHAIN_NAME,EL_DATA) values ('demo','chain2','IF(x1, THEN(a, b));');
+INSERT INTO EL_TABLE (APPLICATION_NAME,CHAIN_NAME,EL_DATA) values ('demo','chain3','IF(x0, THEN(a, b));');
+INSERT INTO EL_TABLE (APPLICATION_NAME,CHAIN_NAME,EL_DATA) values ('demo','','IF(x0, THEN(a, b));');
+INSERT INTO EL_TABLE (APPLICATION_NAME,CHAIN_NAME,EL_DATA) values ('demo','chain4','IF(x2, IF(x0, THEN(a, b)));');
+INSERT INTO EL_TABLE (APPLICATION_NAME,CHAIN_NAME,EL_DATA,ROUTE,NAMESPACE) values ('demo','r_chain1','THEN(a,b,c);','r1','ns');
+INSERT INTO EL_TABLE (APPLICATION_NAME,CHAIN_NAME,EL_DATA,ROUTE,NAMESPACE) values ('demo','r_chain2','THEN(c,b,a);','OR(r1,r2)','ns');
+
+DELETE FROM SCRIPT_NODE_TABLE;
+
+INSERT INTO SCRIPT_NODE_TABLE (APPLICATION_NAME,SCRIPT_NODE_ID,SCRIPT_NODE_NAME,SCRIPT_NODE_TYPE,SCRIPT_NODE_DATA,SCRIPT_LANGUAGE) values ('demo','x0','if 脚本','boolean_script','return true','groovy');
+INSERT INTO SCRIPT_NODE_TABLE (APPLICATION_NAME,SCRIPT_NODE_ID,SCRIPT_NODE_NAME,SCRIPT_NODE_TYPE,SCRIPT_NODE_DATA,SCRIPT_LANGUAGE) values ('demo','x1','if 脚本','boolean_script','return true','groovy');
+
+INSERT INTO SCRIPT_NODE_TABLE (APPLICATION_NAME,SCRIPT_NODE_ID,SCRIPT_NODE_NAME,SCRIPT_NODE_TYPE,SCRIPT_NODE_DATA,SCRIPT_LANGUAGE) values ('demo','x2','python脚本','boolean_script','return true','js');
diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-solon/src/test/resources/sql/schema.sql b/liteflow-testcase-el/liteflow-testcase-el-sql-solon/src/test/resources/sql/schema.sql
new file mode 100644
index 000000000..4e4efcfc1
--- /dev/null
+++ b/liteflow-testcase-el/liteflow-testcase-el-sql-solon/src/test/resources/sql/schema.sql
@@ -0,0 +1,22 @@
+create table IF NOT EXISTS `EL_TABLE`
+(
+ `id` bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+ `application_name` varchar(32) NOT NULL,
+ `chain_name` varchar(32) NOT NULL,
+ `el_data` varchar(1024) NOT NULL,
+ `route` varchar(1024),
+ `namespace` varchar(32),
+ PRIMARY KEY (`id`)
+);
+
+create table IF NOT EXISTS `script_node_table`
+(
+ `id` bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+ `application_name` varchar(32) NOT NULL,
+ `script_node_id` varchar(32) NOT NULL,
+ `script_node_name` varchar(32) NOT NULL,
+ `script_node_type` varchar(32) NOT NULL,
+ `script_node_data` varchar(1024) NOT NULL,
+ `script_language` varchar(1024) NOT NULL,
+ PRIMARY KEY (`id`)
+);
\ No newline at end of file
diff --git a/liteflow-testcase-el/pom.xml b/liteflow-testcase-el/pom.xml
index 7c3ba26e0..2d80347bc 100644
--- a/liteflow-testcase-el/pom.xml
+++ b/liteflow-testcase-el/pom.xml
@@ -40,6 +40,7 @@
liteflow-testcase-el-builder
liteflow-testcase-el-routechain
liteflow-testcase-el-script-kotlin-springboot
+ liteflow-testcase-el-sql-solon