package com.teriste.database;
import com.netflix.config.AbstractPollingScheduler;
import com.netflix.config.ConfigurationManager;
import com.netflix.config.DynamicConfiguration;
import com.netflix.config.FixedDelayPollingScheduler;
import com.netflix.config.PollResult;
import com.netflix.config.PolledConfigurationSource;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.Properties;
import javax.annotation.PostConstruct;
@Component
public class DataSourceDynamicActive {
private static final DebugLog DEBUG_LOG = LogFactory.getDebugLog(DataSourceDynamicActive.class);
@PostConstruct
public void init(){
// 循环读取配置文件
PolledConfigurationSource source = newConfigurationSource();
// 延迟读取的时长,可以直接从配置文件获取或固定值
String delayMills = System.getProperty("archaius.fixedDelayPollingScheduler.delayMills");
// 定时轮询读取文件内容
AbstractPollingScheduler scheduler = new FixedDelayPollingScheduler(1000,Integer.parseInt(delayMills),false);
// 加入配置管理器
DynamicConfiguration configuration = new DynamicConfiguration(source,scheduler);
ConfigurationManager.install(configuration);
}
// 具体轮询业务逻辑
private PolledConfigurationSource newConfigurationSource(){
return (initial, checkPoint) -> {
Properties properties = new Properties();
try (InputStream is = DataSourceDynamicActive.class.getClassLoader().getResourceAsStream("jdbc.properties")) {
properties.load(is);
} catch (IOException e) {
String text = "Fail to read \"jdbc.properties\".";
DEBUG_LOG.error(text);
}
return PollResult.createFull((Map)properties);
};
}
}
// 动态获取配置,switchDataSource是监听到文件中defaultDataSource变化时执行的业务逻辑
DynamicPropertyFactory.getInstance().getStringProperty("defaultDataSource", "dataSource1", this::switchDataSource);
原来使用的archaius默认方式不生效的原因是pom依赖中删除了archaius的jar
System.setProperty("archaius.configurationSource.additionalUrls", jdbcProp);
System.setProperty("archaius.fixedDelayPollingScheduler.initialDelayMills", "1000");
System.setProperty("archaius.fixedDelayPollingScheduler.delayMills", delay);
<dependency>
<groupId>com.netflix.archaius</groupId>
<artifactId>archaius-core</artifactId>
<version>0.7.7</version>
</dependency>
如果一个服务启动了多个archaius配置监听对象,会报错,可以通过下面的方式加入新的配置监听器
PolledConfigurationSource source = newConfigurationSource();
// 延迟读取的时长,可以直接从配置文件获取或固定值
String delayMills = System.getProperty("archaius.fixedDelayPollingScheduler.delayMills");
// 定时轮询读取文件内容
AbstractPollingScheduler scheduler = new FixedDelayPollingScheduler(1000,Integer.parseInt(delayMills),false);
// 加入配置管理器
DynamicConfiguration dynamicConfig = new DynamicConfiguration(source,scheduler);
ConcurrentCompositeConfiguration finalConfig = new ConcurrentCompositeConfiguration();
finalConfig.addConfiguration(dynamicConfig);
if (!ConfigurationManager.isConfigurationInstalled()) {
ConfigurationManager.install(finalConfig);
} else {
ConcurrentCompositeConfiguration config =
(ConcurrentCompositeConfiguration) ConfigurationManager.getConfigInstance();
config.addConfiguration(dynamicConfig);
}