test:(rabbit,多数据源)
parent
ff1a0b7028
commit
e3da3d1b4b
|
@ -51,6 +51,9 @@ public class SysUser extends BaseEntity {
|
|||
@Excel(name = "登录名称")
|
||||
private String userName;
|
||||
|
||||
@Excel(name = "企业id")
|
||||
private Long enterpriseId;
|
||||
|
||||
/**
|
||||
* 用户昵称
|
||||
*/
|
||||
|
@ -333,6 +336,7 @@ public class SysUser extends BaseEntity {
|
|||
.append("userId", getUserId())
|
||||
.append("deptId", getDeptId())
|
||||
.append("userName", getUserName())
|
||||
.append("enterpriseId", getEnterpriseId())
|
||||
.append("nickName", getNickName())
|
||||
.append("email", getEmail())
|
||||
.append("phonenumber", getPhonenumber())
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
package com.muyu.common.system.remote;
|
||||
|
||||
/**
|
||||
* @ClassDescription:
|
||||
* @JdkVersion: 17
|
||||
* @Author: zhangxu
|
||||
* @Created: 2024/6/10 21:14
|
||||
*/
|
||||
public interface RemoEntInfoService {
|
||||
}
|
|
@ -39,4 +39,8 @@ public interface RemoteLogService {
|
|||
*/
|
||||
@PostMapping("/logininfor")
|
||||
public Result<Boolean> saveLogininfor (@RequestBody SysLogininfor sysLogininfor, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -7,10 +7,13 @@ import com.muyu.common.system.domain.SysRole;
|
|||
import com.muyu.common.system.domain.SysUser;
|
||||
import com.muyu.common.system.remote.factory.RemoteUserFallbackFactory;
|
||||
import com.muyu.common.system.domain.LoginUser;
|
||||
import com.muyu.domain.datasources.EntInfo;
|
||||
import org.springframework.cloud.openfeign.FeignClient;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 用户服务
|
||||
*
|
||||
|
@ -34,10 +37,22 @@ public interface RemoteUserService {
|
|||
@PostMapping("/user")
|
||||
public Result add (@Validated @RequestBody SysUser user);
|
||||
|
||||
@GetMapping("/list")
|
||||
public Result<List<EntInfo>> list();
|
||||
|
||||
|
||||
@PostMapping
|
||||
public Result addRole (@Validated @RequestBody SysRole role);
|
||||
|
||||
|
||||
|
||||
|
||||
@GetMapping("selectUserById")
|
||||
public Result selectUserById (Long userId);
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 注册用户信息
|
||||
*
|
||||
|
|
|
@ -5,11 +5,14 @@ import com.muyu.common.system.domain.SysRole;
|
|||
import com.muyu.common.system.remote.RemoteUserService;
|
||||
import com.muyu.common.system.domain.SysUser;
|
||||
import com.muyu.common.system.domain.LoginUser;
|
||||
import com.muyu.domain.datasources.EntInfo;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.cloud.openfeign.FallbackFactory;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 用户服务降级处理
|
||||
*
|
||||
|
@ -33,11 +36,21 @@ public class RemoteUserFallbackFactory implements FallbackFactory<RemoteUserServ
|
|||
return Result.error("获取用户失败:{}", throwable.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Result<List<EntInfo>> list() {
|
||||
return Result.error("获取失败");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Result addRole(SysRole role) {
|
||||
return Result.error("获取用户失败:{}", throwable.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Result selectUserById(Long userId) {
|
||||
return Result.error("获取用户失败:{}", throwable.getMessage());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Result<Boolean> registerUserInfo (SysUser sysUser, String source) {
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
package com.muyu.domain.datasources;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* @ClassDescription:
|
||||
* @JdkVersion: 17
|
||||
* @Author: zhangxu
|
||||
* @Created: 2024/6/10 20:40
|
||||
*/
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@Builder
|
||||
@TableName("etn_info")
|
||||
public class EntInfo {
|
||||
@TableId(type = IdType.AUTO)
|
||||
private Long id;
|
||||
|
||||
private String entCode;
|
||||
|
||||
private String ip;
|
||||
|
||||
private Long port;
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
package com.muyu.networking.controller;
|
||||
|
||||
import com.muyu.common.core.domain.Result;
|
||||
import com.muyu.domain.datasources.EntInfo;
|
||||
import com.muyu.networking.service.EntInfoService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @ClassDescription:
|
||||
* @JdkVersion: 17
|
||||
* @Author: zhangxu
|
||||
* @Created: 2024/6/10 20:55
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/entInfo")
|
||||
public class EntInfoController {
|
||||
@Autowired
|
||||
private EntInfoService entInfoService;
|
||||
|
||||
@GetMapping("/list")
|
||||
public Result<List<EntInfo>> list() {
|
||||
List<EntInfo> list = entInfoService.list();
|
||||
return Result.success(list);
|
||||
}
|
||||
|
||||
@PostMapping("/add")
|
||||
public Result add(@RequestBody EntInfo entInfo) {
|
||||
entInfoService.save(entInfo);
|
||||
return Result.success();
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
package com.muyu.networking.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.muyu.domain.datasources.EntInfo;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
/**
|
||||
* @ClassDescription:
|
||||
* @JdkVersion: 17
|
||||
* @Author: zhangxu
|
||||
* @Created: 2024/6/10 20:57
|
||||
*/
|
||||
@Mapper
|
||||
public interface EntInfoMapper extends BaseMapper<EntInfo> {
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
package com.muyu.networking.service;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.muyu.domain.datasources.EntInfo;
|
||||
|
||||
/**
|
||||
* @ClassDescription:
|
||||
* @JdkVersion: 17
|
||||
* @Author: zhangxu
|
||||
* @Created: 2024/6/10 20:55
|
||||
*/
|
||||
public interface EntInfoService extends IService<EntInfo> {
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
package com.muyu.networking.service.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.muyu.domain.Enterprise;
|
||||
import com.muyu.domain.datasources.EntInfo;
|
||||
import com.muyu.networking.mapper.EntInfoMapper;
|
||||
import com.muyu.networking.mapper.EnterpriseMapper;
|
||||
import com.muyu.networking.service.EntInfoService;
|
||||
import com.muyu.networking.service.EnterpriseService;
|
||||
|
||||
/**
|
||||
* @ClassDescription:
|
||||
* @JdkVersion: 17
|
||||
* @Author: zhangxu
|
||||
* @Created: 2024/6/10 20:56
|
||||
*/
|
||||
public class EntInfoServiceImpl extends ServiceImpl<EntInfoMapper, EntInfo> implements EntInfoService {
|
||||
|
||||
|
||||
}
|
|
@ -13,6 +13,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|||
import com.muyu.common.core.domain.Result;
|
||||
import com.muyu.common.core.utils.DateUtils;
|
||||
import com.muyu.common.security.utils.SecurityUtils;
|
||||
import com.muyu.common.system.domain.LoginUser;
|
||||
import com.muyu.common.system.domain.SysRole;
|
||||
import com.muyu.common.system.domain.SysUser;
|
||||
import com.muyu.common.system.remote.RemoteUserService;
|
||||
|
@ -26,8 +27,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|||
import org.springframework.stereotype.Service;
|
||||
|
||||
|
||||
|
||||
|
||||
import java.util.IllegalFormatCodePointException;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
|
@ -42,6 +42,10 @@ import java.util.UUID;
|
|||
@DS("networking")
|
||||
public class EnterpriseServiceImpl extends ServiceImpl<EnterpriseMapper,Enterprise> implements EnterpriseService
|
||||
{
|
||||
|
||||
@Autowired
|
||||
private RemoteUserService remoteUserService;
|
||||
|
||||
@Autowired(required = false)
|
||||
private EnterpriseMapper enterpriseMapper;
|
||||
|
||||
|
@ -66,24 +70,21 @@ public class EnterpriseServiceImpl extends ServiceImpl<EnterpriseMapper,Enterpr
|
|||
@Override
|
||||
public List<Enterprise> selectEnterpriseList(Enterprise enterprise)
|
||||
{
|
||||
//
|
||||
// SysUser sysUser = SysUser.builder()
|
||||
// .entId(enterprise.getId())
|
||||
// .build();
|
||||
|
||||
enterprise.setEnterpriseName("admin");
|
||||
if (enterprise.getEnterpriseName().equals("admin")){
|
||||
if (SecurityUtils.isAdmin(SecurityUtils.getUserId())) {
|
||||
return enterpriseMapper.selectEnterpriseList(enterprise);
|
||||
}
|
||||
LambdaQueryWrapper<Enterprise> lambdaQueryWrapper = new LambdaQueryWrapper<>() {{
|
||||
eq(Enterprise::getId, enterprise.getId());
|
||||
SysUser sysUser = SysUser.builder().userName(SecurityUtils.getUsername()).build();
|
||||
//判断 不是管理员登录 自能看自己的企业
|
||||
LambdaQueryWrapper<Enterprise> lambdaQueryWrapper = new LambdaQueryWrapper<>(){{
|
||||
eq(Enterprise::getEnterpriseName, sysUser.getUserName());
|
||||
}};
|
||||
//
|
||||
return enterpriseMapper.selectList(lambdaQueryWrapper);
|
||||
}
|
||||
|
||||
|
||||
@Autowired
|
||||
private RemoteUserService remoteUserService;
|
||||
|
||||
/**
|
||||
* 新增【请填写功能名称】
|
||||
*
|
||||
|
@ -99,26 +100,16 @@ public class EnterpriseServiceImpl extends ServiceImpl<EnterpriseMapper,Enterpr
|
|||
enterprise.setStatus("1");
|
||||
enterprise.setCertification("0");
|
||||
enterprise.setOpenAdd("0");
|
||||
SysRole.builder().roleId(2L).build();
|
||||
SysUser sysUser = SysUser.builder().userName(
|
||||
enterprise.getEnterpriseName())
|
||||
.password("admin")
|
||||
.roleId(2L)
|
||||
.entId(enterprise.getId())
|
||||
.roleId(2L)
|
||||
.nickName(enterprise.getEnterpriseName()).
|
||||
userType(String.valueOf(enterprise.getId()))
|
||||
.build();
|
||||
// Datasource datasource = new Datasource();
|
||||
// Datasource root = Datasource.builder()
|
||||
// .ip("115.159.67.205")
|
||||
// .password("sal75-z")
|
||||
// .database(sysUser.getUserName())
|
||||
// .username("root")
|
||||
// .build();
|
||||
// DynamicRoutingDataSource dynamicRoutingDataSource = new DynamicRoutingDataSource();
|
||||
// dynamicRoutingDataSource.createDataSource(root);
|
||||
Result add = remoteUserService.add(sysUser);
|
||||
return enterpriseMapper.insertEnterprise(enterprise);
|
||||
return enterpriseMapper.insertEnterprise(enterprise);
|
||||
}
|
||||
/**
|
||||
* 修改【请填写功能名称】
|
||||
|
@ -269,23 +260,6 @@ public class EnterpriseServiceImpl extends ServiceImpl<EnterpriseMapper,Enterpr
|
|||
// }
|
||||
// }
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -67,6 +67,13 @@ public class SysUserController extends BaseController {
|
|||
return getDataTable(list);
|
||||
}
|
||||
|
||||
|
||||
@GetMapping("selectUserById")
|
||||
public Result selectUserById (Long userId) {
|
||||
SysUser user = userService.selectUserById(userId);
|
||||
return success(user);
|
||||
}
|
||||
|
||||
@Log(title = "用户管理", businessType = BusinessType.EXPORT)
|
||||
@RequiresPermissions("system:user:export")
|
||||
@PostMapping("/export")
|
||||
|
|
|
@ -0,0 +1,57 @@
|
|||
package com.muyu.vehicle.config;
|
||||
|
||||
import org.springframework.amqp.rabbit.connection.CorrelationData;
|
||||
import org.springframework.amqp.rabbit.core.RabbitTemplate;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
|
||||
/**
|
||||
* @ClassDescription:
|
||||
* @JdkVersion: 17
|
||||
* @Author: zhangxu
|
||||
* @Created: 2024/6/10 20:28
|
||||
*/
|
||||
@Component
|
||||
public class ConfirmCallbackConfig implements RabbitTemplate.ConfirmCallback{
|
||||
|
||||
|
||||
@Autowired
|
||||
private RabbitTemplate rabbitTemplate;
|
||||
|
||||
/**
|
||||
* @PostContruct是spring框架的注解,在⽅法上加该注解会在项⽬启动的时候执⾏该⽅法,也可以理解为在spring容器初始化的时候执
|
||||
* @PostConstruct bean 被初始化的时候执行的方法的注解
|
||||
* @PreDestory bean 被销毁的时候执行的方法的注解
|
||||
*/
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
rabbitTemplate.setConfirmCallback(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* 交换机不管是否收到消息的一个回调方法
|
||||
*
|
||||
* @param correlationData 消息相关数据
|
||||
* @param ack 交换机是否收到消息
|
||||
* @param cause 失败原因
|
||||
*/
|
||||
@Override
|
||||
public void confirm(CorrelationData correlationData, boolean ack, String cause) {
|
||||
if (ack) {
|
||||
// 消息投递到 broker 的状态,true表示成功
|
||||
System.out.println("消息发送成功!");
|
||||
} else {
|
||||
// 发送异常
|
||||
System.out.println("发送异常原因 = " + cause);
|
||||
// TODO 可以将消息 内容 以及 失败的原因 记录到 日志表中
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,51 @@
|
|||
package com.muyu.vehicle.myDatasource.aspect;
|
||||
|
||||
import com.muyu.common.security.utils.SecurityUtils;
|
||||
import com.muyu.common.system.domain.SysUser;
|
||||
import com.muyu.common.system.remote.RemoteUserService;
|
||||
import com.muyu.vehicle.myDatasource.holder.DynamicDataSourceHolder;
|
||||
import org.aspectj.lang.annotation.After;
|
||||
import org.aspectj.lang.annotation.Aspect;
|
||||
import org.aspectj.lang.annotation.Before;
|
||||
import org.aspectj.lang.annotation.Pointcut;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* @ClassDescription:
|
||||
* @JdkVersion: 17
|
||||
* @Author: zhangxu
|
||||
* @Created: 2024/6/10 20:02
|
||||
*/
|
||||
@Aspect
|
||||
@Component
|
||||
public class DataSourceAsp {
|
||||
@Autowired
|
||||
private RemoteUserService remoteUserService;
|
||||
|
||||
@Pointcut("execution(public * com.car.client.controller.*Controller.*(..))")
|
||||
public void pointcut() {
|
||||
}
|
||||
|
||||
/**
|
||||
* 的每一個方法執行之前 執行的處理
|
||||
*/
|
||||
@Before("pointcut()")
|
||||
public void beforeMethod() {
|
||||
Long userid = SecurityUtils.getLoginUser().getUserid();
|
||||
SysUser sysUser = (SysUser) remoteUserService.selectUserById(userid).getData();
|
||||
DynamicDataSourceHolder.setDynamicDataSourceKey("ent_" + sysUser.getEnterpriseId());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 的每一個方法執行之后 執行的處理
|
||||
* 无论正常还是异常终了
|
||||
* 不能接受到返回值
|
||||
*/
|
||||
@After("pointcut()")
|
||||
public void afterMethod() {
|
||||
DynamicDataSourceHolder.removeDynamicDataSourceKey();
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
package com.muyu.vehicle.myDatasource.constants;
|
||||
|
||||
/**
|
||||
* @ClassDescription:
|
||||
* @JdkVersion: 17
|
||||
* @Author: zhangxu
|
||||
* @Created: 2024/6/10 20:01
|
||||
*/
|
||||
public class DatasourceConstant {
|
||||
|
||||
public final static String DATASOURCE_URL = "jdbc:mysql://{}:{}/car_networking?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8";
|
||||
|
||||
public final static String USER_NAME = "root";
|
||||
|
||||
public final static String PASSWORD = "wxl@123";
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,42 @@
|
|||
package com.muyu.vehicle.myDatasource.domain;
|
||||
|
||||
import com.muyu.common.core.utils.StringUtils;
|
||||
import com.muyu.vehicle.myDatasource.constants.DatasourceConstant;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* @ClassDescription:
|
||||
* @JdkVersion: 17
|
||||
* @Author: zhangxu
|
||||
* @Created: 2024/6/10 19:55
|
||||
*/
|
||||
@AllArgsConstructor
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@Builder
|
||||
public class DataSourceInfo {
|
||||
|
||||
|
||||
private String key;
|
||||
|
||||
private String url;
|
||||
|
||||
private String userName;
|
||||
|
||||
private String password;
|
||||
|
||||
|
||||
public static DataSourceInfo hostAndPortBuild(String key, String host, Integer port) {
|
||||
return DataSourceInfo.builder()
|
||||
.key(key)
|
||||
.url(StringUtils.format(DatasourceConstant.DATASOURCE_URL, host, port))
|
||||
.password(DatasourceConstant.PASSWORD)
|
||||
.userName(DatasourceConstant.USER_NAME)
|
||||
.build();
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
package com.muyu.vehicle.myDatasource.domain;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* @ClassDescription:
|
||||
* @JdkVersion: 17
|
||||
* @Author: zhangxu
|
||||
* @Created: 2024/6/10 19:57
|
||||
*/
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@Builder
|
||||
public class EnterpriseInfo {
|
||||
|
||||
private String entCode;
|
||||
|
||||
private String ip;
|
||||
|
||||
private String port;
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
package com.muyu.vehicle.myDatasource.factory;
|
||||
|
||||
import com.alibaba.druid.pool.DruidDataSource;
|
||||
import com.muyu.vehicle.myDatasource.domain.DataSourceInfo;
|
||||
import lombok.extern.log4j.Log4j2;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.sql.SQLException;
|
||||
|
||||
/**
|
||||
* @ClassDescription:
|
||||
* @JdkVersion: 17
|
||||
* @Author: zhangxu
|
||||
* @Created: 2024/6/10 20:01
|
||||
*/
|
||||
@Log4j2
|
||||
@Component
|
||||
public class DruidDataSourceFactory {
|
||||
/**
|
||||
* 根据传递的数据源信息测试数据库连接
|
||||
*/
|
||||
public DruidDataSource create(DataSourceInfo dataSourceInfo) {
|
||||
DruidDataSource druidDataSource = new DruidDataSource();
|
||||
druidDataSource.setUrl(dataSourceInfo.getUrl());
|
||||
druidDataSource.setUsername(dataSourceInfo.getUserName());
|
||||
druidDataSource.setPassword(dataSourceInfo.getPassword());
|
||||
druidDataSource.setBreakAfterAcquireFailure(true);
|
||||
druidDataSource.setConnectionErrorRetryAttempts(0);
|
||||
try {
|
||||
druidDataSource.getConnection(2000);
|
||||
log.info("{} -> 数据源连接成功", dataSourceInfo.getKey());
|
||||
return druidDataSource;
|
||||
} catch (SQLException throwables) {
|
||||
log.error("数据源 {} 连接失败,用户名:{},密码 {}", dataSourceInfo.getUrl(), dataSourceInfo.getUserName(), dataSourceInfo.getPassword());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,43 @@
|
|||
package com.muyu.vehicle.myDatasource.holder;
|
||||
|
||||
import lombok.extern.log4j.Log4j2;
|
||||
|
||||
/**
|
||||
* @ClassDescription:
|
||||
* @JdkVersion: 17
|
||||
* @Author: zhangxu
|
||||
* @Created: 2024/6/10 20:00
|
||||
*/
|
||||
@Log4j2
|
||||
public class DynamicDataSourceHolder {
|
||||
/**
|
||||
* 保存动态数据源名称
|
||||
*/
|
||||
private static final ThreadLocal<String> DYNAMIC_DATASOURCE_KEY = new ThreadLocal<>();
|
||||
|
||||
/**
|
||||
* 设置/切换数据源,决定当前线程使用哪个数据源
|
||||
*/
|
||||
public static void setDynamicDataSourceKey(String key) {
|
||||
log.info("数据源切换为:{}", key);
|
||||
DYNAMIC_DATASOURCE_KEY.set(key);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取动态数据源名称,默认使用mater数据源
|
||||
*/
|
||||
public static String getDynamicDataSourceKey() {
|
||||
String key = DYNAMIC_DATASOURCE_KEY.get();
|
||||
Assert.notNull(key, "请携带数据标识");
|
||||
return key;
|
||||
}
|
||||
|
||||
/**
|
||||
* 移除当前数据源
|
||||
*/
|
||||
public static void removeDynamicDataSourceKey() {
|
||||
log.info("移除数据源:{}", DYNAMIC_DATASOURCE_KEY.get());
|
||||
DYNAMIC_DATASOURCE_KEY.remove();
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,47 @@
|
|||
package com.muyu.vehicle.myDatasource.rule;
|
||||
|
||||
import com.alibaba.druid.pool.DruidDataSource;
|
||||
import com.muyu.vehicle.myDatasource.holder.DynamicDataSourceHolder;
|
||||
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @ClassDescription:
|
||||
* @JdkVersion: 17
|
||||
* @Author: zhangxu
|
||||
* @Created: 2024/6/10 19:55
|
||||
*/
|
||||
public class DynamicDataSource extends AbstractRoutingDataSource {
|
||||
/**
|
||||
* 备份所有数据源信息 备份的是 指针
|
||||
*/
|
||||
private Map<Object, Object> defineTargetDataSources;
|
||||
|
||||
/**
|
||||
* 判断键是否存在
|
||||
*/
|
||||
public boolean hashKey(String key) {
|
||||
return defineTargetDataSources.containsKey(key);
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加数据库
|
||||
*
|
||||
* @param key 键
|
||||
* @param value 数据源
|
||||
*/
|
||||
public void put(String key, DruidDataSource value) {
|
||||
defineTargetDataSources.put(key, value);
|
||||
this.afterPropertiesSet();
|
||||
}
|
||||
|
||||
/**
|
||||
* 决定当前线程使用哪个数据源
|
||||
*/
|
||||
@Override
|
||||
protected Object determineCurrentLookupKey() {
|
||||
return DynamicDataSourceHolder.getDynamicDataSourceKey();
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue