MagicApi多数据源,使用非默认数据源存储脚本信息

前言

在使用magicapi的过程中,有一次,我想将magicapi的脚本数据存储在非默认的数据源,因为要做脚本备份这些,想放在一个单独的数据库,但是按照官方文档配置之后,总是报错,提示找不到数据源。

magic-api:
  web: /magic-api
  resource:
    type: database
    tableName: magic_api_file # 数据库中的表名
    datasource: slave#指定数据源(单数据源时无需配置,多数据源时默认使用主数据源,如果存在其他数据源中需要指定。)
    prefix: /magic-api # key前缀
    readonly: false # 是否是只读模式
  backup: #备份相关配置
    enable: true #是否启用
    max-history: -1 #备份保留天数,-1为永久保留
    table-name: magic_backup_record #使用数据库存储备份时的表名

在这里插入图片描述
这里的多数据源是ruoyi里边配置的druid的多数据源

分析

这里抛出一个数据源找不到的异常,经过源码分析,发现异常的来源

/**
	 * 获取数据源
	 *
	 * @param datasourceKey 数据源Key
	 */
	public MagicDynamicDataSource.DataSourceNode getDataSource(String datasourceKey) {
		if (datasourceKey == null) {
			datasourceKey = "";
		}
		MagicDynamicDataSource.DataSourceNode dataSourceNode = dataSourceMap.get(datasourceKey);
		Assert.isNotNull(dataSourceNode, String.format("找不到数据源%s", datasourceKey));
		return dataSourceNode;
	}

这是magicapi的数据源管理类,将数据源组成进MagicDynamicDataSource然后从中获取数据源
报这个错误的原因是,在magicapi初始化数据源时,只是把默认数据源放进了这个类
从MagicModuleConfiguration可以看到

/**
	 * 注入动态数据源
	 */
	@Bean
	@ConditionalOnMissingBean(MagicDynamicDataSource.class)
	public MagicDynamicDataSource magicDynamicDataSource(@Autowired(required = false) DataSource dataSource) {
		MagicDynamicDataSource dynamicDataSource = new MagicDynamicDataSource();
		if (dataSource != null) {
			dynamicDataSource.put(dataSource);
		} else {
			logger.warn("当前数据源未配置");
		}
		return dynamicDataSource;
	}

这里有一个@ConditionalOnMissingBean(MagicDynamicDataSource.class),意思是,当springboot里没有这个类的时候,就执行这个方法来创建MagicDynamicDataSource

解决

所以,我们只需要创建一个配置类重写这个方法,自己来初始化类,放入我们的数据源就可以了

/**
	 * 注入动态数据源
	 */
	@Bean
	@ConditionalOnMissingBean(MagicDynamicDataSource.class)
	MagicDynamicDataSource magicDynamicDataSource(@Autowired(required = false) DataSource dataSource) {
		MagicDynamicDataSource dynamicDataSource = new MagicDynamicDataSource();
		if (dataSource != null) {
			DruidDataSource mgicdb = new DruidDataSource();
			mgicdb.setUrl(url);
			dynamicDataSource.put(dataSource);
			dynamicDataSource.put("slave",mgicdb);
			try {
				Db db = Db.use(mgicdb);
				if(StrUtil.isNotBlank(tabName)) {
					db.execute(StrUtil.format("create table if not exists {}(file_path primary key,file_content)",tabName));
				}
				if(StrUtil.isNotBlank(backUpTabName)) {
					db.execute(StrUtil.format("create table if not exists {}(id,create_date,tag,type,name,content,create_by,primary key(id,create_date))",backUpTabName));
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		} else {
			logger.warn("当前数据源未配置");
		}
		return dynamicDataSource;
	}

我这里是自己配置了一个sqlite的数据源,并且使用hutool的Db模块初始化了表结构,实际使用的过程中,根据自己的情况来修改就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值