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
-
+
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
+