From d5ec8c769ca3ec30daa98051b2d9672f8dc29215 Mon Sep 17 00:00:00 2001 From: dftre <3066417822@qq.com> Date: Wed, 30 Oct 2024 13:49:18 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=86=E7=A6=BBatomikos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 7 --- .../src/main/resources/application-druid.yml | 5 ++ .../datasource/AfterCreateDataSource.java | 10 ++++ .../service/datasource/CreateDataSource.java | 6 +-- ruoyi-framework/pom.xml | 6 --- .../config/DynamicDataSourceProperties.java | 20 ------- .../datasource/AtomikosDataSourceCreate.java | 54 ------------------- .../datasource/DataSourceCreate.java | 34 ++++++++++++ .../datasource/DataSourceManagement.java | 40 +++++++++++++- .../datasource/DynamicDataSource.java | 4 +- ruoyi-plugins/pom.xml | 18 ++++++- ruoyi-plugins/ruoyi-atomikos/pom.xml | 33 ++++++++++++ .../atomikos}/config/AtomikosConfig.java | 4 +- .../datasource/AtomikosDataSourceCreate.java | 45 ++++++++++++++++ ruoyi-plugins/ruoyi-plugins-starter/pom.xml | 8 ++- 15 files changed, 198 insertions(+), 96 deletions(-) create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/service/datasource/AfterCreateDataSource.java delete mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/AtomikosDataSourceCreate.java create mode 100644 ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DataSourceCreate.java create mode 100644 ruoyi-plugins/ruoyi-atomikos/pom.xml rename {ruoyi-framework/src/main/java/com/ruoyi/framework => ruoyi-plugins/ruoyi-atomikos/src/main/java/com/ruoyi/atomikos}/config/AtomikosConfig.java (92%) create mode 100644 ruoyi-plugins/ruoyi-atomikos/src/main/java/com/ruoyi/atomikos/datasource/AtomikosDataSourceCreate.java diff --git a/pom.xml b/pom.xml index b07c56c..88c30d1 100644 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,6 @@ 3.3.5 1.2.23 3.5.2 - 6.0.0 1.1 1.21 3.0.0 @@ -107,12 +106,6 @@ ${dynamic.version} - - - com.atomikos - transactions-spring-boot3-starter - ${transactions.version} - javax.transaction jta diff --git a/ruoyi-admin/src/main/resources/application-druid.yml b/ruoyi-admin/src/main/resources/application-druid.yml index 6c5e4ae..7460bb1 100644 --- a/ruoyi-admin/src/main/resources/application-druid.yml +++ b/ruoyi-admin/src/main/resources/application-druid.yml @@ -60,3 +60,8 @@ spring: wall: config: multi-statement-allow: true + + +# 是否开启分布式事务,如不开启,请删除atomikos插件,否则atomikos相关驱动虽不生效但仍会启动 +atomikos: + enabled: true \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/service/datasource/AfterCreateDataSource.java b/ruoyi-common/src/main/java/com/ruoyi/common/service/datasource/AfterCreateDataSource.java new file mode 100644 index 0000000..5636f56 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/service/datasource/AfterCreateDataSource.java @@ -0,0 +1,10 @@ +package com.ruoyi.common.service.datasource; + +import java.util.Properties; + +import javax.sql.CommonDataSource; +import javax.sql.DataSource; + +public interface AfterCreateDataSource { + DataSource afterCreateDataSource(String name,Properties prop, CommonDataSource dataSource); +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/service/datasource/CreateDataSource.java b/ruoyi-common/src/main/java/com/ruoyi/common/service/datasource/CreateDataSource.java index b6ac794..0814d84 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/service/datasource/CreateDataSource.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/service/datasource/CreateDataSource.java @@ -1,9 +1,9 @@ package com.ruoyi.common.service.datasource; -import javax.sql.DataSource; +import java.util.Properties; -import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; +import javax.sql.CommonDataSource; public interface CreateDataSource { - DataSource createDataSource(String name, DataSourceProperties dataSourceProperties); + CommonDataSource createDataSource(String name, Properties prop); } diff --git a/ruoyi-framework/pom.xml b/ruoyi-framework/pom.xml index 72db2fd..d802ae1 100644 --- a/ruoyi-framework/pom.xml +++ b/ruoyi-framework/pom.xml @@ -34,12 +34,6 @@ druid-spring-boot-3-starter - - - com.atomikos - transactions-spring-boot3-starter - - javax.transaction jta diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/DynamicDataSourceProperties.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/DynamicDataSourceProperties.java index 67c8810..b7aa825 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/DynamicDataSourceProperties.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/DynamicDataSourceProperties.java @@ -1,14 +1,8 @@ package com.ruoyi.framework.config; -import java.sql.Connection; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; import java.util.Map; import java.util.Properties; -import javax.sql.DataSource; - import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; @@ -24,20 +18,6 @@ public class DynamicDataSourceProperties { private Map datasource; private String primary; - public void validateDataSource(DataSource dataSource) { - try (Connection conn = dataSource.getConnection()) { - String validationQuery = "SELECT 1"; - try (Statement stmt = conn.createStatement(); - ResultSet rs = stmt.executeQuery(validationQuery)) { - if (!(rs.next() && rs.getInt(1) == 1)) { - throw new RuntimeException("数据源连接验证失败:查询结果不正确"); - } - } - } catch (SQLException e) { - throw new RuntimeException("数据源连接验证失败", e); - } - } - public Properties build(DataSourceProperties dataSourceProperties) { Properties prop = new Properties(); DruidProperties druidProperties = SpringUtils.getBean(DruidProperties.class); diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/AtomikosDataSourceCreate.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/AtomikosDataSourceCreate.java deleted file mode 100644 index ba07d2a..0000000 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/AtomikosDataSourceCreate.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.ruoyi.framework.datasource; - -import java.util.Properties; - -import javax.sql.DataSource; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; -import org.springframework.context.annotation.DependsOn; -import org.springframework.stereotype.Component; - -import com.alibaba.druid.pool.xa.DruidXADataSource; -import com.atomikos.spring.AtomikosDataSourceBean; -import com.ruoyi.common.service.datasource.CreateDataSource; -import com.ruoyi.framework.config.AtomikosConfig; -import com.ruoyi.framework.config.DruidConfig; -import com.ruoyi.framework.config.DynamicDataSourceProperties; - -@Component -@DependsOn({ "transactionManager" }) -public class AtomikosDataSourceCreate implements CreateDataSource { - - private static final Logger logger = LoggerFactory.getLogger(AtomikosDataSourceCreate.class); - @Autowired - private DynamicDataSourceProperties properties; - - @Autowired - private DruidConfig druidConfig; - - @Autowired - private AtomikosConfig atomikosConfig; - - public DataSource createDataSource(String name, DataSourceProperties dataSourceProperties) { - Properties prop = properties.build(dataSourceProperties); - DruidXADataSource dataSource = new DruidXADataSource(); - druidConfig.getDruidDataSources().add(dataSource); - dataSource.setConnectProperties(prop); - properties.setProperties(dataSource, prop); - AtomikosDataSourceBean ds = new AtomikosDataSourceBean(); - - atomikosConfig.getAtomikosDataSourceBeans().add(ds); - ds.setXaDataSourceClassName("com.alibaba.druid.pool.xa.DruidXADataSource"); - ds.setUniqueResourceName(name); - ds.setXaDataSource(dataSource); - ds.setXaProperties(prop); - ds.setMaxPoolSize(dataSource.getMaxActive()); - ds.setMinPoolSize(dataSource.getMinIdle()); - properties.validateDataSource(ds); - logger.info("数据源:{} 链接成功", name); - return dataSource; - } -} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DataSourceCreate.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DataSourceCreate.java new file mode 100644 index 0000000..73d4ef7 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DataSourceCreate.java @@ -0,0 +1,34 @@ +package com.ruoyi.framework.datasource; + +import java.util.Properties; + +import javax.sql.DataSource; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.alibaba.druid.pool.xa.DruidXADataSource; +import com.ruoyi.common.service.datasource.CreateDataSource; +import com.ruoyi.framework.config.DruidConfig; +import com.ruoyi.framework.config.DynamicDataSourceProperties; + +@Component +public class DataSourceCreate implements CreateDataSource { + + private static final Logger logger = LoggerFactory.getLogger(DataSourceCreate.class); + @Autowired + private DynamicDataSourceProperties properties; + + @Autowired + private DruidConfig druidConfig; + + public DataSource createDataSource(String name, Properties prop) { + DruidXADataSource dataSource = new DruidXADataSource(); + druidConfig.getDruidDataSources().add(dataSource); + dataSource.setConnectProperties(prop); + properties.setProperties(dataSource, prop); + return dataSource; + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DataSourceManagement.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DataSourceManagement.java index 91bbdda..ea2b485 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DataSourceManagement.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DataSourceManagement.java @@ -1,22 +1,32 @@ package com.ruoyi.framework.datasource; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; import java.util.Collection; import java.util.HashMap; import java.util.Map; +import java.util.Properties; +import javax.sql.CommonDataSource; import javax.sql.DataSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; +import com.ruoyi.common.service.datasource.AfterCreateDataSource; import com.ruoyi.common.service.datasource.CreateDataSource; import com.ruoyi.framework.config.DynamicDataSourceProperties; @Configuration public class DataSourceManagement implements InitializingBean { + protected final Logger logger = LoggerFactory.getLogger(DataSourceManagement.class); private Map targetDataSources = new HashMap<>(); @Autowired @@ -25,6 +35,9 @@ public class DataSourceManagement implements InitializingBean { @Autowired private CreateDataSource c; + @Autowired(required = false) + private AfterCreateDataSource afterCreateDataSource; + @Bean(name = "dynamicDataSource") @Primary public DynamicDataSource dataSource() { @@ -36,10 +49,35 @@ public class DataSourceManagement implements InitializingBean { return new DynamicDataSource(targetDataSources.get(dataSourceProperties.getPrimary()), objectMap); } + public void validateDataSource(DataSource dataSource) { + try (Connection conn = dataSource.getConnection()) { + String validationQuery = "SELECT 1"; + try (Statement stmt = conn.createStatement(); + ResultSet rs = stmt.executeQuery(validationQuery)) { + if (!(rs.next() && rs.getInt(1) == 1)) { + throw new RuntimeException("数据源连接验证失败:查询结果不正确"); + } + } + } catch (SQLException e) { + throw new RuntimeException("数据源连接验证失败", e); + } + } + @Override public void afterPropertiesSet() throws Exception { dataSourceProperties.getDatasource() - .forEach((name, props) -> this.putDataSource(name, c.createDataSource(name, props))); + .forEach((name, props) -> { + Properties properties = dataSourceProperties.build(props); + CommonDataSource commonDataSource = c.createDataSource(name, properties); + if (afterCreateDataSource != null) { + afterCreateDataSource.afterCreateDataSource(name, properties, commonDataSource); + } + DataSource dataSource = (DataSource) commonDataSource; + logger.info("数据源:{} 校验中.......", name); + validateDataSource(dataSource); + logger.info("数据源:{} 链接成功", name); + this.putDataSource(name, dataSource); + }); } public DataSource getDataSource(String name) { diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSource.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSource.java index 04dac6c..f3793aa 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSource.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/datasource/DynamicDataSource.java @@ -2,7 +2,7 @@ package com.ruoyi.framework.datasource; import java.util.Map; -import javax.sql.DataSource; +import javax.sql.CommonDataSource; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; @@ -13,7 +13,7 @@ import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; */ public class DynamicDataSource extends AbstractRoutingDataSource { - public DynamicDataSource(DataSource defaultTargetDataSource, Map targetDataSources) + public DynamicDataSource(CommonDataSource defaultTargetDataSource, Map targetDataSources) { super.setDefaultTargetDataSource(defaultTargetDataSource); super.setTargetDataSources(targetDataSources); diff --git a/ruoyi-plugins/pom.xml b/ruoyi-plugins/pom.xml index 80a91f1..4baeab1 100644 --- a/ruoyi-plugins/pom.xml +++ b/ruoyi-plugins/pom.xml @@ -15,6 +15,7 @@ 3.5.8 4.1.112.Final 3.18.1 + 6.0.0 @@ -76,7 +77,7 @@ ${ruoyi.version} - + com.ruoyi ruoyi-netty ${ruoyi.version} @@ -95,6 +96,13 @@ ${ruoyi.version} + + + com.ruoyi + ruoyi-atomikos + ${ruoyi.version} + + com.aliyun.oss @@ -102,6 +110,13 @@ ${oss.version} + + + com.atomikos + transactions-spring-boot3-starter + ${transactions.version} + + @@ -115,6 +130,7 @@ ruoyi-mybatis-interceptor ruoyi-netty ruoyi-alibaba-oss + ruoyi-atomikos pom diff --git a/ruoyi-plugins/ruoyi-atomikos/pom.xml b/ruoyi-plugins/ruoyi-atomikos/pom.xml new file mode 100644 index 0000000..4d9a6ef --- /dev/null +++ b/ruoyi-plugins/ruoyi-atomikos/pom.xml @@ -0,0 +1,33 @@ + + + + ruoyi-plugins + com.ruoyi + 3.8.8.3.1 + + 4.0.0 + + ruoyi-atomikos + + + ruoyi-atomikos + + + + + + + com.ruoyi + ruoyi-common + + + + + com.atomikos + transactions-spring-boot3-starter + + + + + diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/AtomikosConfig.java b/ruoyi-plugins/ruoyi-atomikos/src/main/java/com/ruoyi/atomikos/config/AtomikosConfig.java similarity index 92% rename from ruoyi-framework/src/main/java/com/ruoyi/framework/config/AtomikosConfig.java rename to ruoyi-plugins/ruoyi-atomikos/src/main/java/com/ruoyi/atomikos/config/AtomikosConfig.java index 41d0056..155ceb5 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/AtomikosConfig.java +++ b/ruoyi-plugins/ruoyi-atomikos/src/main/java/com/ruoyi/atomikos/config/AtomikosConfig.java @@ -1,8 +1,9 @@ -package com.ruoyi.framework.config; +package com.ruoyi.atomikos.config; import java.util.ArrayList; import java.util.List; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.DependsOn; @@ -23,6 +24,7 @@ import jakarta.transaction.UserTransaction; * @author ruoyi */ @Configuration +@ConditionalOnProperty(name = "atomikos.enabled", havingValue = "true") public class AtomikosConfig { @Bean(name = "userTransaction") public UserTransaction userTransaction() throws Throwable { diff --git a/ruoyi-plugins/ruoyi-atomikos/src/main/java/com/ruoyi/atomikos/datasource/AtomikosDataSourceCreate.java b/ruoyi-plugins/ruoyi-atomikos/src/main/java/com/ruoyi/atomikos/datasource/AtomikosDataSourceCreate.java new file mode 100644 index 0000000..2118757 --- /dev/null +++ b/ruoyi-plugins/ruoyi-atomikos/src/main/java/com/ruoyi/atomikos/datasource/AtomikosDataSourceCreate.java @@ -0,0 +1,45 @@ +package com.ruoyi.atomikos.datasource; + +import java.util.Properties; + +import javax.sql.CommonDataSource; +import javax.sql.DataSource; +import javax.sql.XADataSource; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.DependsOn; +import org.springframework.stereotype.Component; + +import com.atomikos.spring.AtomikosDataSourceBean; +import com.ruoyi.atomikos.config.AtomikosConfig; +import com.ruoyi.common.service.datasource.AfterCreateDataSource; + +@Component +@ConditionalOnProperty(name = "atomikos.enabled", havingValue = "true") +@DependsOn({ "transactionManager" }) +public class AtomikosDataSourceCreate implements AfterCreateDataSource { + + private static final Logger logger = LoggerFactory.getLogger(AtomikosDataSourceCreate.class); + + @Autowired + private AtomikosConfig atomikosConfig; + + public DataSource afterCreateDataSource(String name,Properties prop, CommonDataSource dataSource) { + AtomikosDataSourceBean ds = new AtomikosDataSourceBean(); + atomikosConfig.getAtomikosDataSourceBeans().add(ds); + ds.setXaDataSourceClassName("com.alibaba.druid.pool.xa.DruidXADataSource"); + ds.setUniqueResourceName(name); + ds.setXaDataSource((XADataSource)dataSource); + ds.setXaProperties(prop); + if (prop.getProperty("minIdle") != null) { + ds.setMinPoolSize(Integer.parseInt(prop.getProperty("minIdle"))); + } + if (prop.getProperty("maxActive") != null) { + ds.setMaxPoolSize(Integer.parseInt(prop.getProperty("maxActive"))); + } + return ds; + } +} diff --git a/ruoyi-plugins/ruoyi-plugins-starter/pom.xml b/ruoyi-plugins/ruoyi-plugins-starter/pom.xml index a32aacf..20048f9 100644 --- a/ruoyi-plugins/ruoyi-plugins-starter/pom.xml +++ b/ruoyi-plugins/ruoyi-plugins-starter/pom.xml @@ -55,12 +55,18 @@ com.ruoyi ruoyi-netty - + com.ruoyi ruoyi-alibaba-oss + + + + com.ruoyi + ruoyi-atomikos +