数据源注册

This commit is contained in:
mxd
2021-12-31 19:45:40 +08:00
parent e725564c0d
commit 663a7d9588
3 changed files with 75 additions and 8 deletions

View File

@@ -385,8 +385,8 @@ public class MagicAPIAutoConfiguration implements WebMvcConfigurer, WebSocketCon
@Bean
@ConditionalOnMissingBean
public DataSourceMagicDynamicRegistry dataSourceMagicDynamicRegistry(DataSourceInfoMagicResourceStorage dataSourceInfoMagicResourceStorage) {
return new DataSourceMagicDynamicRegistry(dataSourceInfoMagicResourceStorage);
public DataSourceMagicDynamicRegistry dataSourceMagicDynamicRegistry(DataSourceInfoMagicResourceStorage dataSourceInfoMagicResourceStorage, MagicDynamicDataSource magicDynamicDataSource) {
return new DataSourceMagicDynamicRegistry(dataSourceInfoMagicResourceStorage, magicDynamicDataSource);
}

View File

@@ -25,7 +25,7 @@ public class DataSourceInfo extends MagicEntity {
/**
* 最多返回条数
*/
private int maxRows;
private int maxRows = -1;
/**
* 驱动类

View File

@@ -1,15 +1,41 @@
package org.ssssssss.magicapi.service.impl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.boot.context.properties.bind.Bindable;
import org.springframework.boot.context.properties.bind.Binder;
import org.springframework.boot.context.properties.source.ConfigurationPropertyName;
import org.springframework.boot.context.properties.source.ConfigurationPropertyNameAliases;
import org.springframework.boot.context.properties.source.ConfigurationPropertySource;
import org.springframework.boot.context.properties.source.MapConfigurationPropertySource;
import org.springframework.boot.jdbc.DatabaseDriver;
import org.springframework.context.event.EventListener;
import org.springframework.util.ClassUtils;
import org.ssssssss.magicapi.config.MagicDynamicDataSource;
import org.ssssssss.magicapi.event.FileEvent;
import org.ssssssss.magicapi.model.DataSourceInfo;
import org.ssssssss.magicapi.provider.MagicResourceStorage;
import org.ssssssss.magicapi.service.AbstractMagicDynamicRegistry;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;
public class DataSourceMagicDynamicRegistry extends AbstractMagicDynamicRegistry<DataSourceInfo> {
public DataSourceMagicDynamicRegistry(MagicResourceStorage<DataSourceInfo> magicResourceStorage) {
private final MagicDynamicDataSource magicDynamicDataSource;
private static final ClassLoader CLASSLOADER = DataSourceMagicDynamicRegistry.class.getClassLoader();
// copy from DataSourceBuilder
private static final String[] DATA_SOURCE_TYPE_NAMES = new String[]{
"com.zaxxer.hikari.HikariDataSource",
"org.apache.tomcat.jdbc.pool.DataSource",
"org.apache.commons.dbcp2.BasicDataSource"};
public DataSourceMagicDynamicRegistry(MagicResourceStorage<DataSourceInfo> magicResourceStorage, MagicDynamicDataSource magicDynamicDataSource) {
super(magicResourceStorage);
this.magicDynamicDataSource = magicDynamicDataSource;
}
@EventListener(condition = "#event.type == 'datasource'")
@@ -19,16 +45,57 @@ public class DataSourceMagicDynamicRegistry extends AbstractMagicDynamicRegistry
@Override
public boolean register(DataSourceInfo info) {
// mapping.register(mappingNode.getRequestMappingInfo());
System.out.println("注册数据源:" + info.getKey());
Map<String, Object> properties = new HashMap<>(info.getProperties());
properties.put("url", info.getUrl());
properties.put("username", info.getUsername());
properties.put("password", info.getPassword());
if (StringUtils.isBlank(info.getDriverClassName())) {
String driverClass = DatabaseDriver.fromJdbcUrl(info.getUrl()).getDriverClassName();
properties.put("driverClassName", driverClass);
} else {
properties.put("driverClassName", info.getDriverClassName());
}
DataSource datasource = createDataSource(getDataSourceType(info.getType()), properties);
magicDynamicDataSource.put(info.getId(), info.getKey(), info.getName(), datasource, info.getMaxRows());
return true;
}
@Override
public boolean unregister(DataSourceInfo info) {
System.out.println("取消注册数据源:" + info.getKey());
return true;
return magicDynamicDataSource.delete(info.getKey());
}
// copy from DataSourceBuilder
private DataSource createDataSource(Class<? extends DataSource> dataSourceType, Map<String, Object> properties) {
DataSource dataSource = BeanUtils.instantiateClass(dataSourceType);
ConfigurationPropertySource source = new MapConfigurationPropertySource(properties);
ConfigurationPropertyNameAliases aliases = new ConfigurationPropertyNameAliases();
aliases.addAliases("url", "jdbc-url");
aliases.addAliases("username", "user");
Binder binder = new Binder(source.withAliases(aliases));
binder.bind(ConfigurationPropertyName.EMPTY, Bindable.ofInstance(dataSource));
return dataSource;
}
@SuppressWarnings("unchecked")
private Class<? extends DataSource> getDataSourceType(String datasourceType) {
if (StringUtils.isNotBlank(datasourceType)) {
try {
return (Class<? extends DataSource>) ClassUtils.forName(datasourceType, CLASSLOADER);
} catch (Exception ignored) {
}
}
for (String name : DATA_SOURCE_TYPE_NAMES) {
try {
return (Class<? extends DataSource>) ClassUtils.forName(name, CLASSLOADER);
} catch (Exception ignored) {
// ignored
}
}
return null;
}
}