前言
该文章基于我之前写的另一篇关于Druid多数据源的配置,若没有使用多数据,可以借鉴一下,主要是思路是创建新的连接池,然后替换掉原先的连接池,因为 Druid 初始化后不能更换连接再次初始化。
实现代码
@Slf4j
@RefreshScope
@Configuration
public class NacosListener implements InitializingBean {
@Value("${smilex.nacos.listener.dataId}")
private String dataId;
@Resource
private DataSourceProperties dataSourceProperties;
@Autowired
private NacosConfigManager nacosConfigManager;
@Resource
private DynamicDataSource dynamicDataSource;
@Override
public void afterPropertiesSet() throws Exception {
NacosConfigProperties nacosConfigProperties = nacosConfigManager.getNacosConfigProperties();
log.info(nacosConfigProperties.toString());
ConfigService configService = nacosConfigManager.getConfigService();
NacosConfigProperties.Config config = nacosConfigProperties.getSharedConfigs().get(0);
configService.addListener(dataId, config.getGroup(), new Listener() {
@Override
public Executor getExecutor() {
return null;
}
@Override
public void receiveConfigInfo(String configInfo) {
log.info(configInfo);
Yaml yaml = new Yaml();
JSONObject infoJson = new JSONObject(yaml.load(configInfo));
refreshDataSource(infoJson);
}
});
}
/**
* 刷新数据库
*/
private void refreshDataSource(JSONObject infoJson) {
JSONObject druid = getProperties(infoJson, "spring.datasource.druid");
log.info(druid.toJSONString());
if (druid != null) {
DataSourceProperties dataSourceProperties = druid.toJavaObject(DataSourceProperties.class);
// DataSource dataSource = (DataSource) dynamicDataSource.getDataSource(DynamicDataSourceConfig.MASTER);
// DataSourceFactory.createDataSource(dataSource, dataSourceProperties);
dynamicDataSource.replaceDataSource(DynamicDataSourceConfig.MASTER, dataSourceProperties);
}
}
private JSONObject getProperties(JSONObject infoJson, String properties) {
if (StringUtils.isNotBlank(properties)) {
return loopProperties(infoJson, properties.split("\\."), 0);
}
return null;
}
private JSONObject loopProperties(JSONObject infoJson, String[] properties, int index) {
if (infoJson.containsKey(properties[index])) {
if (index < properties.length - 1) {
return loopProperties(infoJson.getJSONObject(properties[index]), properties, index + 1);
} else {
return infoJson.getJSONObject(properties[index]);
}
}
return null;
}
}