diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/exception/MissMavenDependencyException.java b/liteflow-core/src/main/java/com/yomahub/liteflow/exception/MissMavenDependencyException.java new file mode 100644 index 000000000..099553d09 --- /dev/null +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/exception/MissMavenDependencyException.java @@ -0,0 +1,39 @@ +package com.yomahub.liteflow.exception; + +import cn.hutool.core.util.StrUtil; + +/** + * 缺少 maven 依赖异常 + * + * @author tkc + * @since 2.12.5 + */ +public class MissMavenDependencyException extends RuntimeException { + + private static final long serialVersionUID = 1L; + private static final String TEMPLATE = "miss maven dependency " + "\n" + + "\n" + + " {groupId}\n" + + " {artifactId}\n" + + " ${version}\n" + + ""; + + /** + * 异常信息 + */ + private String message; + + public MissMavenDependencyException(String groupId, String artifactId) { + this.message = StrUtil.format(TEMPLATE, groupId, artifactId); + } + + @Override + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + +} diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/spi/ContextAware.java b/liteflow-core/src/main/java/com/yomahub/liteflow/spi/ContextAware.java index a750f4c55..4a874d3b8 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/spi/ContextAware.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/spi/ContextAware.java @@ -33,8 +33,20 @@ public interface ContextAware extends SpiPriority { */ Map getBeansOfType(Class type); + /** + * 判断是否存在指定名称的bean + * + * @param beanName bean 名称 + */ boolean hasBean(String beanName); + /** + * 判断是否存在指定类型的bean + * + * @param clazz 类型 + */ + boolean hasBean(Class clazz); + Object registerDeclWrapBean(String beanName, DeclWarpBean declWarpBean); } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/spi/local/LocalContextAware.java b/liteflow-core/src/main/java/com/yomahub/liteflow/spi/local/LocalContextAware.java index d33267d8e..3fa9952c3 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/spi/local/LocalContextAware.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/spi/local/LocalContextAware.java @@ -54,6 +54,11 @@ public class LocalContextAware implements ContextAware { return false; } + @Override + public boolean hasBean(Class clazz) { + return false; + } + @Override public Object registerDeclWrapBean(String beanName, DeclWarpBean declWarpBean) { return null; diff --git a/liteflow-rule-plugin/liteflow-rule-sql/pom.xml b/liteflow-rule-plugin/liteflow-rule-sql/pom.xml index 754633d6c..9a40ad550 100644 --- a/liteflow-rule-plugin/liteflow-rule-sql/pom.xml +++ b/liteflow-rule-plugin/liteflow-rule-sql/pom.xml @@ -25,5 +25,23 @@ cn.hutool hutool-crypto + + + + com.baomidou + dynamic-datasource-spring + ${dynamic-datasource.version} + true + provided + + + + + org.apache.shardingsphere + sharding-jdbc-core + ${sharding-jdbc.version} + true + provided + \ No newline at end of file diff --git a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/SQLXmlELParser.java b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/SQLXmlELParser.java index a758fd606..c5a56ac18 100644 --- a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/SQLXmlELParser.java +++ b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/SQLXmlELParser.java @@ -8,6 +8,7 @@ import cn.hutool.core.util.StrUtil; import com.yomahub.liteflow.core.FlowInitHook; import com.yomahub.liteflow.parser.constant.ReadType; import com.yomahub.liteflow.parser.el.ClassXmlFlowELParser; +import com.yomahub.liteflow.parser.sql.datasource.LiteflowDataSourceConnectFactory; import com.yomahub.liteflow.parser.sql.exception.ELSQLException; import com.yomahub.liteflow.parser.sql.read.SqlReadFactory; import com.yomahub.liteflow.parser.sql.util.JDBCHelper; @@ -58,6 +59,9 @@ public class SQLXmlELParser extends ClassXmlFlowELParser { // 初始化 SqlReadFactory SqlReadFactory.registerRead(sqlParserVO); + // 初始化连接器 + LiteflowDataSourceConnectFactory.register(); + // 注册轮询任务 SqlReadFactory.registerSqlReadPollTask(ReadType.CHAIN); SqlReadFactory.registerSqlReadPollTask(ReadType.SCRIPT); @@ -92,7 +96,7 @@ public class SQLXmlELParser extends ClassXmlFlowELParser { * @param sqlParserVO sqlParserVO */ private void checkParserVO(SQLParserVO sqlParserVO) { - if (sqlParserVO.isDefaultDataSource()) { + if (sqlParserVO.isAutoFoundDataSource()) { return; } if (StrUtil.isEmpty(sqlParserVO.getUrl())) { diff --git a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/datasource/LiteFlowDataSourceConnect.java b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/datasource/LiteFlowDataSourceConnect.java new file mode 100644 index 000000000..f820dd42c --- /dev/null +++ b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/datasource/LiteFlowDataSourceConnect.java @@ -0,0 +1,25 @@ +package com.yomahub.liteflow.parser.sql.datasource; + +import com.yomahub.liteflow.parser.sql.vo.SQLParserVO; + +import java.sql.Connection; + +/** + * 数据源获取接口 + * + * @author tkc + * @since 2.12.5 + */ +public interface LiteFlowDataSourceConnect { + + /** + * 检查是否支持该数据源 + */ + boolean filter(SQLParserVO config); + + /** + * 获取连接 + */ + Connection getConn(SQLParserVO config) throws Exception; + +} diff --git a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/datasource/LiteflowDataSourceConnectFactory.java b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/datasource/LiteflowDataSourceConnectFactory.java new file mode 100644 index 000000000..9d51700c0 --- /dev/null +++ b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/datasource/LiteflowDataSourceConnectFactory.java @@ -0,0 +1,57 @@ +package com.yomahub.liteflow.parser.sql.datasource; + +import com.yomahub.liteflow.parser.sql.datasource.impl.BaoMiDouDynamicDsConn; +import com.yomahub.liteflow.parser.sql.datasource.impl.DefaultLiteFlowJdbcConn; +import com.yomahub.liteflow.parser.sql.datasource.impl.LiteFlowAutoLookUpJdbcConn; +import com.yomahub.liteflow.parser.sql.datasource.impl.ShardingJdbcDsConn; +import com.yomahub.liteflow.parser.sql.vo.SQLParserVO; +import com.yomahub.liteflow.spi.ContextAware; +import com.yomahub.liteflow.spi.holder.ContextAwareHolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.CopyOnWriteArrayList; + +/** + * 数据源获取接口工厂 + * + * @author tkc + * @since 2.12.5 + */ +public class LiteflowDataSourceConnectFactory { + private static final List CONNECT_LIST = new CopyOnWriteArrayList<>(); + private static final Logger LOG = LoggerFactory.getLogger(LiteflowDataSourceConnectFactory.class); + + public static void register() { + ContextAware contextAware = ContextAwareHolder.loadContextAware(); + Map beanMap = contextAware.getBeansOfType(LiteFlowDataSourceConnect.class); + Collection values = beanMap.values(); + + // 清空原有的列表 + CONNECT_LIST.clear(); + // 将自定义的放在最前面 + CONNECT_LIST.addAll(values); + + // 内置的几种处理器 + CONNECT_LIST.add(new DefaultLiteFlowJdbcConn()); + CONNECT_LIST.add(new BaoMiDouDynamicDsConn()); + CONNECT_LIST.add(new ShardingJdbcDsConn()); + + // 自动查找放在最后,这个用于兜底处理,这个里面如果找不到,会直接抛出异常 + CONNECT_LIST.add(new LiteFlowAutoLookUpJdbcConn()); + } + + public static Optional getConnect(SQLParserVO config) { + for (LiteFlowDataSourceConnect dataSourceConnect : CONNECT_LIST) { + if (dataSourceConnect.filter(config)) { + LOG.debug("use lite-flow-data-source-connect: {}", dataSourceConnect.getClass().getName()); + return Optional.of(dataSourceConnect); + } + } + return Optional.empty(); + } +} diff --git a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/datasource/impl/BaoMiDouDynamicDsConn.java b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/datasource/impl/BaoMiDouDynamicDsConn.java new file mode 100644 index 000000000..2ecd298a3 --- /dev/null +++ b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/datasource/impl/BaoMiDouDynamicDsConn.java @@ -0,0 +1,63 @@ +package com.yomahub.liteflow.parser.sql.datasource.impl; + +import cn.hutool.core.util.ClassLoaderUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; +import com.yomahub.liteflow.exception.MissMavenDependencyException; +import com.yomahub.liteflow.parser.sql.datasource.LiteFlowDataSourceConnect; +import com.yomahub.liteflow.parser.sql.exception.ELSQLException; +import com.yomahub.liteflow.parser.sql.vo.SQLParserVO; +import com.yomahub.liteflow.spi.ContextAware; +import com.yomahub.liteflow.spi.holder.ContextAwareHolder; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.util.Map; +import java.util.Optional; + +/** + * 苞米豆动态数据源 + * + * @author tkc + * @since 2.12.5 + */ +public class BaoMiDouDynamicDsConn implements LiteFlowDataSourceConnect { + @Override + public boolean filter(SQLParserVO config) { + // 是否配置苞米豆动态数据源配置 + boolean configFlag = Optional.ofNullable(config.getBaomidou()) + .map(SQLParserVO.DataSourceConfig::getDataSourceName) + .isPresent(); + if (!configFlag) { + return false; + } + boolean classLoadFlag = ClassLoaderUtil.isPresent(Constant.LOAD_CLASS_NAME); + if (!classLoadFlag) { + throw new MissMavenDependencyException(Constant.MAVEN_GROUP_ID, Constant.MAVEN_ARTIFACT_ID); + } + return true; + } + + @Override + public Connection getConn(SQLParserVO config) throws Exception { + String dataSourceName = config.getBaomidou().getDataSourceName(); + ContextAware contextAware = ContextAwareHolder.loadContextAware(); + DynamicRoutingDataSource dynamicRoutingDataSource = contextAware.getBean(DynamicRoutingDataSource.class); + Map dataSources = dynamicRoutingDataSource.getDataSources(); + if (!dataSources.containsKey(dataSourceName)) { + throw new ELSQLException(StrUtil.format("can not found {} datasource", dataSourceName)); + } + + DataSource dataSource = dynamicRoutingDataSource.getDataSource(dataSourceName); + return dataSource.getConnection(); + } + + /** + * 常量类 + */ + public static class Constant { + public static final String LOAD_CLASS_NAME = "com.baomidou.dynamic.datasource.DynamicRoutingDataSource"; + public static final String MAVEN_GROUP_ID = "com.baomidou"; + public static final String MAVEN_ARTIFACT_ID = "dynamic-datasource-spring-boot-starter"; + } +} diff --git a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/datasource/impl/DefaultLiteFlowJdbcConn.java b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/datasource/impl/DefaultLiteFlowJdbcConn.java new file mode 100644 index 000000000..812b1b2d4 --- /dev/null +++ b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/datasource/impl/DefaultLiteFlowJdbcConn.java @@ -0,0 +1,29 @@ +package com.yomahub.liteflow.parser.sql.datasource.impl; + +import com.yomahub.liteflow.parser.sql.datasource.LiteFlowDataSourceConnect; +import com.yomahub.liteflow.parser.sql.vo.SQLParserVO; + +import java.sql.Connection; +import java.sql.DriverManager; + +/** + * lite flow 默认的数据源连接 + * + * @author tkc + * @since 2.12.5 + */ +public class DefaultLiteFlowJdbcConn implements LiteFlowDataSourceConnect { + @Override + public boolean filter(SQLParserVO config) { + return config.isUseJdbcConn(); + } + + @Override + public Connection getConn(SQLParserVO config) throws Exception { + String url = config.getUrl(); + String username = config.getUsername(); + String password = config.getPassword(); + + return DriverManager.getConnection(url, username, password); + } +} diff --git a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/datasource/impl/LiteFlowAutoLookUpJdbcConn.java b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/datasource/impl/LiteFlowAutoLookUpJdbcConn.java new file mode 100644 index 000000000..7ad67b7fa --- /dev/null +++ b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/datasource/impl/LiteFlowAutoLookUpJdbcConn.java @@ -0,0 +1,94 @@ +package com.yomahub.liteflow.parser.sql.datasource.impl; + +import com.yomahub.liteflow.parser.sql.datasource.LiteFlowDataSourceConnect; +import com.yomahub.liteflow.parser.sql.exception.ELSQLException; +import com.yomahub.liteflow.parser.sql.util.LiteFlowJdbcUtil; +import com.yomahub.liteflow.parser.sql.vo.SQLParserVO; +import com.yomahub.liteflow.spi.holder.ContextAwareHolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.Map; +import java.util.Optional; + +/** + * lite flow 自动查找连接 + * + * @author tkc + * @since 2.12.5 + */ +public class LiteFlowAutoLookUpJdbcConn implements LiteFlowDataSourceConnect { + private static final Logger LOG = LoggerFactory.getLogger(LiteFlowAutoLookUpJdbcConn.class); + + @Override + public boolean filter(SQLParserVO config) { + return true; + } + + @Override + public Connection getConn(SQLParserVO config) throws Exception { + return DataSourceBeanNameHolder.autoLookUpConn(config); + } + + public static class DataSourceBeanNameHolder { + private static String DATA_SOURCE_NAME = null; + + public static synchronized void init(String dataSourceName) { + if (DATA_SOURCE_NAME == null) { + DATA_SOURCE_NAME = dataSourceName; + } + } + + public static String getDataSourceName() { + return DATA_SOURCE_NAME; + } + + public static boolean isNotInit() { + return DATA_SOURCE_NAME == null; + } + + /** + * 自动查找可用数据源 + */ + public static Connection autoLookUpConn(SQLParserVO sqlParserVO) throws SQLException { + Connection connection; + Map dataSourceMap = ContextAwareHolder.loadContextAware().getBeansOfType(DataSource.class); + if (LiteFlowJdbcUtil.DataSourceBeanNameHolder.isNotInit()) { + synchronized (LiteFlowJdbcUtil.DataSourceBeanNameHolder.class) { + if (LiteFlowJdbcUtil.DataSourceBeanNameHolder.isNotInit()) { + String executeSql = LiteFlowJdbcUtil.buildCheckSql(sqlParserVO); + // 遍历数据源,多数据源场景下,判断哪个数据源有 liteflow 配置 + for (Map.Entry entry : dataSourceMap.entrySet()) { + String dataSourceName = entry.getKey(); + DataSource dataSource = entry.getValue(); + + if (LiteFlowJdbcUtil.checkConnectionCanExecuteSql(dataSource.getConnection(), executeSql)) { + // 找到数据源名称后,将其缓存起来,下次使用就不再寻找 + LiteFlowJdbcUtil.DataSourceBeanNameHolder.init(dataSourceName); + + LOG.info("use dataSourceName[{}],has found liteflow config", dataSourceName); + break; + } else { + LOG.info("check dataSourceName[{}],but not has liteflow config", dataSourceName); + } + } + } + } + } + DataSource dataSource = Optional.ofNullable(LiteFlowJdbcUtil.DataSourceBeanNameHolder.getDataSourceName()) + .map(dataSourceMap::get) + .orElse(null); + if (dataSource == null) { + throw new ELSQLException("can not found liteflow config in dataSourceName " + dataSourceMap.keySet()); + } + connection = dataSource.getConnection(); + if (connection == null) { + throw new ELSQLException("can not found liteflow config in dataSourceName " + dataSourceMap.keySet()); + } + return connection; + } + } +} diff --git a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/datasource/impl/ShardingJdbcDsConn.java b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/datasource/impl/ShardingJdbcDsConn.java new file mode 100644 index 000000000..2c31e1bf6 --- /dev/null +++ b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/datasource/impl/ShardingJdbcDsConn.java @@ -0,0 +1,52 @@ +package com.yomahub.liteflow.parser.sql.datasource.impl; + +import cn.hutool.core.util.ClassLoaderUtil; +import com.yomahub.liteflow.exception.MissMavenDependencyException; +import com.yomahub.liteflow.parser.sql.datasource.LiteFlowDataSourceConnect; +import com.yomahub.liteflow.parser.sql.vo.SQLParserVO; +import com.yomahub.liteflow.spi.ContextAware; +import com.yomahub.liteflow.spi.holder.ContextAwareHolder; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.util.Optional; + +/** + * ShardingJdbc 动态数据源 + * + * @author tkc + * @since 2.12.5 + */ +public class ShardingJdbcDsConn implements LiteFlowDataSourceConnect { + + @Override + public boolean filter(SQLParserVO config) { + // 是否配置 sharding jdbc 动态数据源配置 + boolean configFlag = Optional.ofNullable(config.getShardingjdbc()) + .map(SQLParserVO.DataSourceConfig::getDataSourceName) + .isPresent(); + + if (!configFlag) { + return false; + } + boolean classLoadFlag = ClassLoaderUtil.isPresent(Constant.LOAD_CLASS_NAME); + if (!classLoadFlag) { + throw new MissMavenDependencyException(Constant.MAVEN_GROUP_ID, Constant.MAVEN_ARTIFACT_ID); + } + return true; + } + + @Override + public Connection getConn(SQLParserVO config) throws Exception { + ContextAware contextAware = ContextAwareHolder.loadContextAware(); + + return contextAware.getBean(DataSource.class).getConnection(); + } + + + public static class Constant { + public static final String LOAD_CLASS_NAME = "org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource"; + public static final String MAVEN_GROUP_ID = "org.apache.shardingsphere"; + public static final String MAVEN_ARTIFACT_ID = "sharding-jdbc-core"; + } +} diff --git a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/util/LiteFlowJdbcUtil.java b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/util/LiteFlowJdbcUtil.java index 6c46bcaf0..2272ec3fb 100644 --- a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/util/LiteFlowJdbcUtil.java +++ b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/util/LiteFlowJdbcUtil.java @@ -1,6 +1,8 @@ package com.yomahub.liteflow.parser.sql.util; import cn.hutool.core.util.StrUtil; +import com.yomahub.liteflow.parser.sql.datasource.LiteFlowDataSourceConnect; +import com.yomahub.liteflow.parser.sql.datasource.LiteflowDataSourceConnectFactory; import com.yomahub.liteflow.parser.sql.exception.ELSQLException; import com.yomahub.liteflow.parser.sql.vo.SQLParserVO; import com.yomahub.liteflow.spi.holder.ContextAwareHolder; @@ -10,6 +12,7 @@ import org.slf4j.LoggerFactory; import javax.sql.DataSource; import java.sql.*; import java.util.Map; +import java.util.Optional; public class LiteFlowJdbcUtil { private static final Logger LOG = LoggerFactory.getLogger(LiteFlowJdbcUtil.class); @@ -17,44 +20,27 @@ public class LiteFlowJdbcUtil { /** * 获取链接 - * 此方法会根据配置,判读使用指定数据源,还是IOC容器中已有的数据源 + * 此方法会从多个角度查找数据源,优先级从上到下 + * 1. 自定义连接器获取,实现了 DataBaseConnect 接口 + * 2. 没有配置数据源连接配置,判断标准参考 SqlParserVO#isDefaultDataSource(),自动寻找IOC容器中已有的数据源 + * 3. 使用数据源配置,使用 jdbc 创建连接 * * @param sqlParserVO sql解析器参数 * @return 返回数据库连接 */ public static Connection getConn(SQLParserVO sqlParserVO) { Connection connection = null; - String url = sqlParserVO.getUrl(); - String username = sqlParserVO.getUsername(); - String password = sqlParserVO.getPassword(); try { - // 如果不配置 jdbc 连接相关配置,代表使用项目数据源 - if (sqlParserVO.isDefaultDataSource()) { - String executeSql = buildCheckSql(sqlParserVO); - Map dataSourceMap = ContextAwareHolder.loadContextAware().getBeansOfType(DataSource.class); - // 遍历数据源,多数据源场景下,判断哪个数据源有 liteflow 配置 - for (Map.Entry entry : dataSourceMap.entrySet()) { - String dataSourceName = entry.getKey(); - DataSource dataSource = entry.getValue(); - - if (checkConnectionCanExecuteSql(dataSource.getConnection(), executeSql)) { - connection = dataSource.getConnection(); - LOG.info("use dataSourceName[{}],has found liteflow config", dataSourceName); - break; - } else { - LOG.info("check dataSourceName[{}],but not has liteflow config", dataSourceName); - } - } - if (connection == null) { - throw new ELSQLException("can not found liteflow config in dataSourceName " + dataSourceMap.keySet()); - } + // 如果指定连接查找器,就使用连接查找器获取连接 + Optional connectOpt = LiteflowDataSourceConnectFactory.getConnect(sqlParserVO); + if (connectOpt.isPresent()) { + connection = connectOpt.get().getConn(sqlParserVO); + } else { + // 理论上这里不会走,因为最后一个连接查找器 LiteFlowAutoLookUpJdbcConn 没找到会抛出异常的 + // 这里是一个兜底,理论上不会走 + throw new ELSQLException("can not found connect by liteflow config"); } - // 如果配置 jdbc 连接相关配置,代表使用指定链接信息 - else { - connection = DriverManager.getConnection(url, username, password); - } - } catch (Exception e) { throw new ELSQLException(e); } @@ -62,6 +48,7 @@ public class LiteFlowJdbcUtil { return connection; } + /** * 判断连接是否可以执行指定 sql * @@ -123,10 +110,69 @@ public class LiteFlowJdbcUtil { * @param sqlParserVO sql解析器参数 * @return 返回组合完成的检查sql */ - private static String buildCheckSql(SQLParserVO sqlParserVO) { + public static String buildCheckSql(SQLParserVO sqlParserVO) { String chainTableName = sqlParserVO.getChainTableName(); String elDataField = sqlParserVO.getElDataField(); String chainNameField = sqlParserVO.getChainNameField(); return StrUtil.format(CHECK_SQL_PATTERN, chainNameField, elDataField, chainTableName); } + + public static class DataSourceBeanNameHolder { + private static String DATA_SOURCE_NAME = null; + + public static synchronized void init(String dataSourceName) { + if (DATA_SOURCE_NAME == null) { + DATA_SOURCE_NAME = dataSourceName; + } + } + + public static String getDataSourceName() { + return DATA_SOURCE_NAME; + } + + public static boolean isNotInit() { + return DATA_SOURCE_NAME == null; + } + + /** + * 自动查找可用数据源 + */ + public static Connection autoLookUpConn(SQLParserVO sqlParserVO) throws SQLException { + Connection connection; + Map dataSourceMap = ContextAwareHolder.loadContextAware().getBeansOfType(DataSource.class); + if (DataSourceBeanNameHolder.isNotInit()) { + synchronized (DataSourceBeanNameHolder.class) { + if (DataSourceBeanNameHolder.isNotInit()) { + String executeSql = buildCheckSql(sqlParserVO); + // 遍历数据源,多数据源场景下,判断哪个数据源有 liteflow 配置 + for (Map.Entry entry : dataSourceMap.entrySet()) { + String dataSourceName = entry.getKey(); + DataSource dataSource = entry.getValue(); + + if (checkConnectionCanExecuteSql(dataSource.getConnection(), executeSql)) { + // 找到数据源名称后,将其缓存起来,下次使用就不再寻找 + DataSourceBeanNameHolder.init(dataSourceName); + + LOG.info("use dataSourceName[{}],has found liteflow config", dataSourceName); + break; + } else { + LOG.info("check dataSourceName[{}],but not has liteflow config", dataSourceName); + } + } + } + } + } + DataSource dataSource = Optional.ofNullable(DataSourceBeanNameHolder.getDataSourceName()) + .map(dataSourceMap::get) + .orElse(null); + if (dataSource == null) { + throw new ELSQLException("can not found liteflow config in dataSourceName " + dataSourceMap.keySet()); + } + connection = dataSource.getConnection(); + if (connection == null) { + throw new ELSQLException("can not found liteflow config in dataSourceName " + dataSourceMap.keySet()); + } + return connection; + } + } } diff --git a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/vo/SQLParserVO.java b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/vo/SQLParserVO.java index cf8560d03..680392102 100644 --- a/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/vo/SQLParserVO.java +++ b/liteflow-rule-plugin/liteflow-rule-sql/src/main/java/com/yomahub/liteflow/parser/sql/vo/SQLParserVO.java @@ -166,6 +166,16 @@ public class SQLParserVO { */ private Boolean sqlLogEnabled = true; + /** + * 苞米豆动态数据源配置 + */ + private DataSourceConfig baomidou; + + /** + * sharding jdbc 动态数据源配置 + */ + private DataSourceConfig shardingjdbc; + public String getUrl() { return url; } @@ -295,10 +305,23 @@ public class SQLParserVO { } /** - * 判断配资是否使用 IOC 已有数据源 + * 判断是否自动查找数据源 */ - public boolean isDefaultDataSource() { - return StrUtil.isBlank(url) && StrUtil.isBlank(username) && StrUtil.isBlank(password) && StrUtil.isBlank(driverClassName); + public boolean isAutoFoundDataSource() { + return StrUtil.isBlank(url) && + StrUtil.isBlank(username) && + StrUtil.isBlank(password) && + StrUtil.isBlank(driverClassName); + } + + /** + * 判断是否使用jdbc连接 + */ + public boolean isUseJdbcConn(){ + return StrUtil.isNotBlank(url) && + StrUtil.isNotBlank(username) && + StrUtil.isNotBlank(password) && + StrUtil.isNotBlank(driverClassName); } public Boolean getPollingEnabled() { @@ -427,4 +450,32 @@ public class SQLParserVO { public void setGroupKeyInstanceIdField(String groupKeyInstanceIdField) { this.groupKeyInstanceIdField = groupKeyInstanceIdField; } + + public DataSourceConfig getBaomidou() { + return baomidou; + } + + public void setBaomidou(DataSourceConfig baomidou) { + this.baomidou = baomidou; + } + + public DataSourceConfig getShardingjdbc() { + return shardingjdbc; + } + + public void setShardingjdbc(DataSourceConfig shardingjdbc) { + this.shardingjdbc = shardingjdbc; + } + + public static class DataSourceConfig { + private String dataSourceName; + + public String getDataSourceName() { + return dataSourceName; + } + + public void setDataSourceName(String dataSourceName) { + this.dataSourceName = dataSourceName; + } + } } diff --git a/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/spi/solon/SolonContextAware.java b/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/spi/solon/SolonContextAware.java index 92b25c250..01fcb68ca 100644 --- a/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/spi/solon/SolonContextAware.java +++ b/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/spi/solon/SolonContextAware.java @@ -110,6 +110,11 @@ public class SolonContextAware implements ContextAware { return Solon.context().hasWrap(beanName); } + @Override + public boolean hasBean(Class clazz) { + return CollUtil.size(getBeansOfType(clazz)) > 0; + } + @Override public int priority() { return 1; diff --git a/liteflow-spring/src/main/java/com/yomahub/liteflow/spi/spring/SpringAware.java b/liteflow-spring/src/main/java/com/yomahub/liteflow/spi/spring/SpringAware.java index 769daa7cf..f4674ca30 100644 --- a/liteflow-spring/src/main/java/com/yomahub/liteflow/spi/spring/SpringAware.java +++ b/liteflow-spring/src/main/java/com/yomahub/liteflow/spi/spring/SpringAware.java @@ -1,5 +1,6 @@ package com.yomahub.liteflow.spi.spring; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.yomahub.liteflow.core.proxy.DeclWarpBean; import com.yomahub.liteflow.spi.ContextAware; @@ -122,6 +123,11 @@ public class SpringAware implements ApplicationContextAware, ContextAware { return applicationContext.containsBean(beanName); } + @Override + public boolean hasBean(Class clazz) { + return CollUtil.size(getBeansOfType(clazz)) > 0; + } + @Override public int priority() { return 1; diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-dynamic/src/test/java/com/yomahub/liteflow/test/sql/SQLWithXmlELMultiLanguageUseBaoMiDouConnSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-dynamic/src/test/java/com/yomahub/liteflow/test/sql/SQLWithXmlELMultiLanguageUseBaoMiDouConnSpringbootTest.java new file mode 100644 index 000000000..97acbbb26 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-dynamic/src/test/java/com/yomahub/liteflow/test/sql/SQLWithXmlELMultiLanguageUseBaoMiDouConnSpringbootTest.java @@ -0,0 +1,34 @@ +package com.yomahub.liteflow.test.sql; + +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.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import javax.annotation.Resource; + +@ExtendWith(SpringExtension.class) +@TestPropertySource(value = "classpath:/application-baomidou-data-source-xml.properties") +@SpringBootTest(classes = SQLWithXmlELMultiLanguageUseBaoMiDouConnSpringbootTest.class) +@EnableAutoConfiguration +@ComponentScan({"com.yomahub.liteflow.test.sql.cmp"}) +public class SQLWithXmlELMultiLanguageUseBaoMiDouConnSpringbootTest extends BaseTest { + + @Resource + private FlowExecutor flowExecutor; + + @Test + public void testMultiLanguage1() { + LiteflowResponse response = flowExecutor.execute2Resp("chain4", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("x2[python脚本]==>x0[if 脚本]==>a==>b", response.getExecuteStepStrWithoutTime()); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-dynamic/src/test/java/com/yomahub/liteflow/test/sql/SQLWithXmlELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-dynamic/src/test/java/com/yomahub/liteflow/test/sql/SQLWithXmlELSpringbootTest.java index 5282642e5..ecb03f497 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-dynamic/src/test/java/com/yomahub/liteflow/test/sql/SQLWithXmlELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-dynamic/src/test/java/com/yomahub/liteflow/test/sql/SQLWithXmlELSpringbootTest.java @@ -1,13 +1,8 @@ package com.yomahub.liteflow.test.sql; -import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; -import com.baomidou.dynamic.datasource.ds.ItemDataSource; import com.yomahub.liteflow.core.FlowExecutor; import com.yomahub.liteflow.flow.LiteflowResponse; import com.yomahub.liteflow.test.BaseTest; -import com.zaxxer.hikari.HikariDataSource; -import com.zaxxer.hikari.HikariPoolMXBean; -import com.zaxxer.hikari.pool.HikariPool; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -18,11 +13,6 @@ import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit.jupiter.SpringExtension; import javax.annotation.Resource; -import javax.sql.DataSource; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.TimeUnit; /** * @author tangkc diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-dynamic/src/test/resources/application-baomidou-data-source-xml.properties b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-dynamic/src/test/resources/application-baomidou-data-source-xml.properties new file mode 100644 index 000000000..8387890fd --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-dynamic/src/test/resources/application-baomidou-data-source-xml.properties @@ -0,0 +1,39 @@ +liteflow.rule-source-ext-data={\ + "applicationName":"demo",\ + "baomidou":{"dataSourceName":"h2-first"},\ + "chainTableName":"EL_TABLE",\ + "chainApplicationNameField":"application_name",\ + "chainNameField":"chain_name",\ + "elDataField":"EL_DATA",\ + "pollingEnabled": true,\ + "pollingIntervalSeconds": 10,\ + "pollingStartSeconds": 5,\ + "scriptTableName":"script_node_table",\ + "scriptApplicationNameField":"application_name",\ + "scriptIdField":"script_node_id",\ + "scriptNameField":"script_node_name",\ + "scriptDataField":"script_node_data",\ + "scriptLanguageField":"script_language",\ + "scriptTypeField":"script_node_type"\ + } +spring.profiles.active=test +spring.datasource.driver-class-name=org.h2.Driver +spring.datasource.dynamic.primary=h2-first +spring.datasource.dynamic.strict=false +spring.datasource.dynamic.datasource.h2-first.url=jdbc:h2:mem:test_db1 +spring.datasource.dynamic.datasource.h2-first.username=root1 +spring.datasource.dynamic.datasource.h2-first.password=123456 +spring.datasource.dynamic.datasource.h2-first.init.schema=classpath:/sql/schema.sql +spring.datasource.dynamic.datasource.h2-first.init.data=classpath:/sql/data.sql +spring.datasource.dynamic.datasource.h2-first.hikari.min-idle=1 +spring.datasource.dynamic.datasource.h2-first.hikari.max-pool-size=5 +spring.datasource.dynamic.datasource.h2-second.url=jdbc:h2:mem:test_db2 +spring.datasource.dynamic.datasource.h2-second.username=root2 +spring.datasource.dynamic.datasource.h2-second.password=123456 +spring.datasource.dynamic.datasource.h2-second.init.schema=classpath:/sql/second/schema.sql +spring.datasource.dynamic.datasource.h2-second.init.data=classpath:/sql/second/data.sql +spring.datasource.dynamic.datasource.h2-second.hikari.min-idle=1 +spring.datasource.dynamic.datasource.h2-second.hikari.max-pool-size=5 + + + diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-sharding-jdbc/pom.xml b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-sharding-jdbc/pom.xml new file mode 100644 index 000000000..0c5dc3628 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-sharding-jdbc/pom.xml @@ -0,0 +1,85 @@ + + + 4.0.0 + + liteflow-testcase-el + com.yomahub + ${revision} + ../pom.xml + + + liteflow-testcase-el-sql-springboot-sharding-jdbc + + + 2.1.214 + 2.6.8 + 5.5.0 + + + + + org.springframework.boot + spring-boot-starter + ${springboot.version} + + + org.springframework.boot + spring-boot-starter-web + ${springboot.version} + + + com.yomahub + liteflow-spring-boot-starter + ${revision} + + + + com.yomahub + liteflow-rule-sql + ${revision} + test + + + + org.springframework.boot + spring-boot-starter-test + + + + org.springframework.boot + spring-boot-starter-data-jpa + ${jpa.version} + test + + + + com.h2database + h2 + ${h2.version} + test + + + + com.yomahub + liteflow-script-groovy + ${revision} + test + + + + com.yomahub + liteflow-script-graaljs + ${revision} + test + + + + + org.apache.shardingsphere + shardingsphere-jdbc + ${shardingsphere.version} + + + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-sharding-jdbc/src/test/java/com/yomahub/liteflow/test/sql/shardingjdbc/BaseTest.java b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-sharding-jdbc/src/test/java/com/yomahub/liteflow/test/sql/shardingjdbc/BaseTest.java new file mode 100644 index 000000000..62255975e --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-sharding-jdbc/src/test/java/com/yomahub/liteflow/test/sql/shardingjdbc/BaseTest.java @@ -0,0 +1,29 @@ +package com.yomahub.liteflow.test.sql.shardingjdbc; + + +import com.yomahub.liteflow.core.FlowInitHook; +import com.yomahub.liteflow.flow.FlowBus; +import com.yomahub.liteflow.property.LiteflowConfigGetter; +import com.yomahub.liteflow.spi.holder.SpiFactoryInitializing; +import com.yomahub.liteflow.spring.ComponentScanner; +import com.yomahub.liteflow.thread.ExecutorHelper; +import org.junit.jupiter.api.AfterAll; + +/** + * @author tangkc + * @since 2.8.6 + */ +public class BaseTest { + + @AfterAll + public static void cleanScanCache() { + ComponentScanner.cleanCache(); + FlowBus.cleanCache(); + ExecutorHelper.loadInstance().clearExecutorServiceMap(); + SpiFactoryInitializing.clean(); + LiteflowConfigGetter.clean(); + FlowInitHook.cleanHook(); + FlowBus.clearStat(); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-sharding-jdbc/src/test/java/com/yomahub/liteflow/test/sql/shardingjdbc/SQLWithXmlELShardingJdbcDsSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-sharding-jdbc/src/test/java/com/yomahub/liteflow/test/sql/shardingjdbc/SQLWithXmlELShardingJdbcDsSpringbootTest.java new file mode 100644 index 000000000..a7b6cffc2 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-sharding-jdbc/src/test/java/com/yomahub/liteflow/test/sql/shardingjdbc/SQLWithXmlELShardingJdbcDsSpringbootTest.java @@ -0,0 +1,33 @@ +package com.yomahub.liteflow.test.sql.shardingjdbc; + +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.flow.LiteflowResponse; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import javax.annotation.Resource; + +@ExtendWith(SpringExtension.class) +@TestPropertySource(value = "classpath:/application-sharding-jdbc-data-source-xml.properties") +@SpringBootTest(classes = SQLWithXmlELShardingJdbcDsSpringbootTest.class) +@EnableAutoConfiguration +@ComponentScan({"com.yomahub.liteflow.test.sql.shardingjdbc.cmp"}) +public class SQLWithXmlELShardingJdbcDsSpringbootTest extends BaseTest { + + @Resource + private FlowExecutor flowExecutor; + + @Test + public void testMultiLanguage1() { + LiteflowResponse response = flowExecutor.execute2Resp("chain4", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("x2[python脚本]==>x0[if 脚本]==>a==>b", response.getExecuteStepStrWithoutTime()); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-sharding-jdbc/src/test/java/com/yomahub/liteflow/test/sql/shardingjdbc/cmp/ACmp.java b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-sharding-jdbc/src/test/java/com/yomahub/liteflow/test/sql/shardingjdbc/cmp/ACmp.java new file mode 100644 index 000000000..04f4b923b --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-sharding-jdbc/src/test/java/com/yomahub/liteflow/test/sql/shardingjdbc/cmp/ACmp.java @@ -0,0 +1,22 @@ +/** + *

Title: liteflow

+ *

Description: 轻量级的组件式流程框架

+ * + * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.sql.shardingjdbc.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import org.springframework.stereotype.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-springboot-sharding-jdbc/src/test/java/com/yomahub/liteflow/test/sql/shardingjdbc/cmp/BCmp.java b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-sharding-jdbc/src/test/java/com/yomahub/liteflow/test/sql/shardingjdbc/cmp/BCmp.java new file mode 100644 index 000000000..322b3e978 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-sharding-jdbc/src/test/java/com/yomahub/liteflow/test/sql/shardingjdbc/cmp/BCmp.java @@ -0,0 +1,22 @@ +/** + *

Title: liteflow

+ *

Description: 轻量级的组件式流程框架

+ * + * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.sql.shardingjdbc.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import org.springframework.stereotype.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-springboot-sharding-jdbc/src/test/java/com/yomahub/liteflow/test/sql/shardingjdbc/cmp/CCmp.java b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-sharding-jdbc/src/test/java/com/yomahub/liteflow/test/sql/shardingjdbc/cmp/CCmp.java new file mode 100644 index 000000000..0d6be523d --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-sharding-jdbc/src/test/java/com/yomahub/liteflow/test/sql/shardingjdbc/cmp/CCmp.java @@ -0,0 +1,22 @@ +/** + *

Title: liteflow

+ *

Description: 轻量级的组件式流程框架

+ * + * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.sql.shardingjdbc.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import org.springframework.stereotype.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-springboot-sharding-jdbc/src/test/resources/application-sharding-jdbc-data-source-xml.properties b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-sharding-jdbc/src/test/resources/application-sharding-jdbc-data-source-xml.properties new file mode 100644 index 000000000..cc93b75ff --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-sharding-jdbc/src/test/resources/application-sharding-jdbc-data-source-xml.properties @@ -0,0 +1,22 @@ +liteflow.rule-source-ext-data={\ + "applicationName":"demo",\ + "shardingjdbc":{"dataSourceName":"ds_1"},\ + "chainTableName":"EL_TABLE",\ + "chainApplicationNameField":"application_name",\ + "chainNameField":"chain_name",\ + "elDataField":"EL_DATA",\ + "pollingEnabled": true,\ + "pollingIntervalSeconds": 10,\ + "pollingStartSeconds": 5,\ + "scriptTableName":"script_node_table",\ + "scriptApplicationNameField":"application_name",\ + "scriptIdField":"script_node_id",\ + "scriptNameField":"script_node_name",\ + "scriptDataField":"script_node_data",\ + "scriptLanguageField":"script_language",\ + "scriptTypeField":"script_node_type"\ + } +spring.profiles.active=test +spring.datasource.driver-class-name=org.apache.shardingsphere.driver.ShardingSphereDriver + +spring.datasource.url=jdbc:shardingsphere:classpath:shardingsphere.yaml \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-sharding-jdbc/src/test/resources/shardingsphere.yaml b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-sharding-jdbc/src/test/resources/shardingsphere.yaml new file mode 100644 index 000000000..2fd3b2a3c --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-sharding-jdbc/src/test/resources/shardingsphere.yaml @@ -0,0 +1,29 @@ +rules: + - !SINGLE + tables: + - "*.*" # Load all single tables + - !READWRITE_SPLITTING + dataSources: + readwrite_ds: + writeDataSourceName: ds_2 + readDataSourceNames: + - ds_1 + transactionalReadQueryStrategy: PRIMARY + loadBalancerName: random + loadBalancers: + random: + type: RANDOM + +dataSources: + ds_1: + dataSourceClassName: com.zaxxer.hikari.HikariDataSource + driverClassName: org.h2.Driver + jdbcUrl: jdbc:h2:mem:test_db1;INIT=RUNSCRIPT FROM 'classpath:sql/schema.sql'\;RUNSCRIPT FROM 'classpath:sql/data.sql' + username: root1 + password: 123456 + ds_2: + dataSourceClassName: com.zaxxer.hikari.HikariDataSource + driverClassName: org.h2.Driver + jdbcUrl: jdbc:h2:mem:test_db2;INIT=RUNSCRIPT FROM 'classpath:sql/second/schema.sql'\;RUNSCRIPT FROM 'classpath:sql/second/data.sql' + username: root2 + password: 123456 \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-sharding-jdbc/src/test/resources/sql/data.sql b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-sharding-jdbc/src/test/resources/sql/data.sql new file mode 100644 index 000000000..f6875cc64 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-sharding-jdbc/src/test/resources/sql/data.sql @@ -0,0 +1,14 @@ +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','THEN(a, b, c);'); +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)));'); + +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 false','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-springboot-sharding-jdbc/src/test/resources/sql/schema.sql b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-sharding-jdbc/src/test/resources/sql/schema.sql new file mode 100644 index 000000000..fa60f098a --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-sharding-jdbc/src/test/resources/sql/schema.sql @@ -0,0 +1,20 @@ +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, + 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/liteflow-testcase-el-sql-springboot-sharding-jdbc/src/test/resources/sql/second/data.sql b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-sharding-jdbc/src/test/resources/sql/second/data.sql new file mode 100644 index 000000000..c38147292 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-sharding-jdbc/src/test/resources/sql/second/data.sql @@ -0,0 +1,4 @@ +DELETE +FROM EL_TABLE; +DELETE +FROM SCRIPT_NODE_TABLE; \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-sharding-jdbc/src/test/resources/sql/second/schema.sql b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-sharding-jdbc/src/test/resources/sql/second/schema.sql new file mode 100644 index 000000000..fa60f098a --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-sharding-jdbc/src/test/resources/sql/second/schema.sql @@ -0,0 +1,20 @@ +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, + 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 a1407eefc..e2a579d8d 100644 --- a/liteflow-testcase-el/pom.xml +++ b/liteflow-testcase-el/pom.xml @@ -43,6 +43,7 @@ liteflow-testcase-el-script-kotlin-springboot liteflow-testcase-el-sql-solon liteflow-testcase-el-script-javax-springboot + liteflow-testcase-el-sql-springboot-sharding-jdbc diff --git a/pom.xml b/pom.xml index db76114dd..e9a057b5d 100644 --- a/pom.xml +++ b/pom.xml @@ -78,6 +78,8 @@ 3.1.12 1.9.23 1.3.7 + 4.3.1 + 4.1.1 @@ -372,6 +374,7 @@ maven-site-plugin 3.7.1 + org.apache.maven.plugins