From 064873ecc788f7adc6709af80aaaeb9bd5d23733 Mon Sep 17 00:00:00 2001 From: chao <3072464591@QQ.com> Date: Fri, 10 May 2024 16:33:57 +0800 Subject: [PATCH] =?UTF-8?q?feat()=20=E8=BF=9E=E6=8E=A5=E6=B1=A0=E5=88=9D?= =?UTF-8?q?=E7=89=88V1.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../annotation/EnableMyFeignClients.java | 3 +- .../clinet/config/DataSourceClientRunner.java | 70 +++++++++++++------ .../data/source/clinet/test/Singleton.java | 33 +++++++-- .../remote/factory/DataSourceFactory.java | 5 +- .../type/remote/factory/DataTypeFactory.java | 5 +- 5 files changed, 84 insertions(+), 32 deletions(-) diff --git a/etl-common/etl-common-security/src/main/java/com/etl/common/security/annotation/EnableMyFeignClients.java b/etl-common/etl-common-security/src/main/java/com/etl/common/security/annotation/EnableMyFeignClients.java index 2aaa8ba..3fe0f03 100644 --- a/etl-common/etl-common-security/src/main/java/com/etl/common/security/annotation/EnableMyFeignClients.java +++ b/etl-common/etl-common-security/src/main/java/com/etl/common/security/annotation/EnableMyFeignClients.java @@ -5,8 +5,7 @@ import org.springframework.cloud.openfeign.EnableFeignClients; import java.lang.annotation.*; /** - * 自定义feign注解 - * 添加basePackages路径 + * 自定义feign注解 添加basePackages路径 * * @author Chao */ diff --git a/etl-modules/etl-modules-data-source/etl-modules-data-source-clinet/src/main/java/com/etl/data/source/clinet/config/DataSourceClientRunner.java b/etl-modules/etl-modules-data-source/etl-modules-data-source-clinet/src/main/java/com/etl/data/source/clinet/config/DataSourceClientRunner.java index c970f24..f0eee53 100644 --- a/etl-modules/etl-modules-data-source/etl-modules-data-source-clinet/src/main/java/com/etl/data/source/clinet/config/DataSourceClientRunner.java +++ b/etl-modules/etl-modules-data-source/etl-modules-data-source-clinet/src/main/java/com/etl/data/source/clinet/config/DataSourceClientRunner.java @@ -5,8 +5,8 @@ import com.etl.data.source.clinet.test.DataSourceConfig; import com.etl.data.source.clinet.test.Singleton; import com.etl.data.source.domain.DataSource; import com.etl.data.source.remote.DataSourceRemoteService; -import com.etl.data.type.remote.DataTypeRemoteService; import com.etl.data.type.domain.DataType; +import com.etl.data.type.remote.DataTypeRemoteService; import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.ApplicationArguments; @@ -14,9 +14,13 @@ import org.springframework.boot.ApplicationRunner; import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Collectors; /** - * + * 客户端初始化连接池 * * @author Chao * @ClassName: DataSourceClientRunner 描述 @@ -32,26 +36,50 @@ public class DataSourceClientRunner implements ApplicationRunner { private DataTypeRemoteService dataTypeRemoteService; @Override - public void run(ApplicationArguments args) throws Exception { - Result> dataSourceResultList = dataSourceRemoteService.dataSourceList(); - List dataSourceList = dataSourceResultList.getData(); - - // 创建数据源Map - HashMap stringDataSourceHashMap = new HashMap<>(); - // 获取数据源类型列表 - Result> dataTypeResultList = dataTypeRemoteService.list(); - List dataTypeList = dataTypeResultList.getData(); - for (DataSource datum : dataSourceList) { - // 过滤相应的数据源类型 - DataType type = dataTypeList.stream() - .filter( - dataType -> dataType.getId().equals(datum.getTypeId()) - ).findFirst() - .get(); - javax.sql.DataSource dataSource = DataSourceConfig.dataSource(datum,type); - stringDataSourceHashMap.put(datum.getDataSourceIp()+"-"+datum.getDataSourceDatabaseName(),dataSource); + public void run(ApplicationArguments args){ + try { + Result> dataSourceResultList = dataSourceRemoteService.dataSourceList(); + if (dataSourceResultList.getData() == null || dataSourceResultList.getData().isEmpty()){ + log.error("数据源列表为空"); + return; + } + List dataSourceList = dataSourceResultList.getData(); + log.info("数据源列表查询成功当前数据为{}" ,dataSourceList); + // 获取数据源类型列表 + Result> dataTypeResultList = dataTypeRemoteService.list(); + if (dataTypeResultList.getData() == null || dataTypeResultList.getData().isEmpty()){ + log.error("数据源类型列表为空"); + return; + } + List dataTypeList = dataTypeResultList.getData(); + log.info("数据源类型列表查询成功当前数据为{}" ,dataTypeList); + // 将数据源类型转换为Map ## Function.identity() 这个方法是返回一个自己 + Map dataTypeMap = dataTypeList.stream() + .collect( + Collectors.toMap( + DataType::getId, Function.identity() + ) + ); + // 创建数据源Map + HashMap stringDataSourceHashMap = new HashMap<>(); + // 遍历数据源列表 + for (DataSource datum : dataSourceList){ + // 过滤相应的数据源类型 + Optional dataType = Optional.ofNullable(dataTypeMap.get(datum.getTypeId())); + if (dataType.isPresent()){ + javax.sql.DataSource dataSource = DataSourceConfig.dataSource(datum, dataType.get()); + stringDataSourceHashMap.put(datum.getDataSourceIp()+"-"+datum.getDataSourceDatabaseName(),dataSource); + }else { + log.error("未找到数据源 ID 为 {} 的数据类型", datum.getTypeId()); + } + Singleton instance = Singleton.getInstance(stringDataSourceHashMap); + Map map = instance.getMap(); + log.info("数据源连接池初始化成功{}",map); + } + } catch (Exception e) { + log.error("初始化数据源连接池失败{}",e.getMessage()); + throw new RuntimeException(e); } - Singleton.getInstance(stringDataSourceHashMap); } } diff --git a/etl-modules/etl-modules-data-source/etl-modules-data-source-clinet/src/main/java/com/etl/data/source/clinet/test/Singleton.java b/etl-modules/etl-modules-data-source/etl-modules-data-source-clinet/src/main/java/com/etl/data/source/clinet/test/Singleton.java index d148300..e788637 100644 --- a/etl-modules/etl-modules-data-source/etl-modules-data-source-clinet/src/main/java/com/etl/data/source/clinet/test/Singleton.java +++ b/etl-modules/etl-modules-data-source/etl-modules-data-source-clinet/src/main/java/com/etl/data/source/clinet/test/Singleton.java @@ -6,23 +6,42 @@ import lombok.Data; import javax.sql.DataSource; import java.util.Map; +/** + * 单例模式 + * + * @author Han + */ @Data @AllArgsConstructor public class Singleton { - private Map map ; + //使用volatile修饰变量,具有原子性、可见性和防止指令重排的特性。 + + private volatile Map map; + private volatile static Singleton singleton; - private static Singleton singleton; /** - * 加入了同步代码,解决线程不安全问题 + * 使用双重校验锁来保证安全,使用volatile禁止指令重排序 * - * @param map - * @return + * @param map 连接池map + * @return Singleton */ - public static synchronized Singleton getInstance(Map map) { + public static Singleton getInstance(Map map) { + //先进行实例判断,只有当不存在的时候才去创建实例。 if (singleton == null) { - singleton = new Singleton(map); + //用synchronized 同步代码块 + //注意:此处不能用this,因为this不能和static同用。 + synchronized (Singleton.class) { + if (singleton == null) { + singleton = new Singleton(map); + } + } } return singleton; } + + /** + * 定义私有构造器,表示只在类内部使用,只能在内部创建。 + */ + private Singleton () {} } diff --git a/etl-modules/etl-modules-data-source/etl-modules-data-source-remote/src/main/java/com/etl/data/source/remote/factory/DataSourceFactory.java b/etl-modules/etl-modules-data-source/etl-modules-data-source-remote/src/main/java/com/etl/data/source/remote/factory/DataSourceFactory.java index 02330d2..f36a4a7 100644 --- a/etl-modules/etl-modules-data-source/etl-modules-data-source-remote/src/main/java/com/etl/data/source/remote/factory/DataSourceFactory.java +++ b/etl-modules/etl-modules-data-source/etl-modules-data-source-remote/src/main/java/com/etl/data/source/remote/factory/DataSourceFactory.java @@ -1,9 +1,12 @@ package com.etl.data.source.remote.factory; import com.etl.common.core.domain.Result; +import com.etl.data.source.domain.DataSource; import com.etl.data.source.remote.DataSourceRemoteService; import org.springframework.cloud.openfeign.FallbackFactory; +import java.util.ArrayList; + /** * 数据源熔断 * @@ -15,6 +18,6 @@ public class DataSourceFactory implements FallbackFactory Result.success(new ArrayList()); } } diff --git a/etl-modules/etl-modules-data-source/etl-modules-data-source-remote/src/main/java/com/etl/data/type/remote/factory/DataTypeFactory.java b/etl-modules/etl-modules-data-source/etl-modules-data-source-remote/src/main/java/com/etl/data/type/remote/factory/DataTypeFactory.java index 9659da4..bded788 100644 --- a/etl-modules/etl-modules-data-source/etl-modules-data-source-remote/src/main/java/com/etl/data/type/remote/factory/DataTypeFactory.java +++ b/etl-modules/etl-modules-data-source/etl-modules-data-source-remote/src/main/java/com/etl/data/type/remote/factory/DataTypeFactory.java @@ -1,9 +1,12 @@ package com.etl.data.type.remote.factory; import com.etl.common.core.domain.Result; +import com.etl.data.type.domain.DataType; import com.etl.data.type.remote.DataTypeRemoteService; import org.springframework.cloud.openfeign.FallbackFactory; +import java.util.ArrayList; + /** * 数据源类型熔断 * @@ -15,6 +18,6 @@ public class DataTypeFactory implements FallbackFactory { @Override public DataTypeRemoteService create(Throwable cause) { - return Result::error; + return () -> Result.error(new ArrayList()); } }