原理是:将数据库变量放在一个全局的Map中,通过get读取,写好一个方法,用来操作数据库配置项的加载,当每次数据库配置项更改后,调取这个方法就可以实现刷新效果
@Component
public class BizConf {
private ReadWriteLock rwLock = new ReentrantReadWriteLock();
private final Lock rl = rwLock.readLock();
private final Lock wl = rwLock.writeLock();
private HashMap<String, String> kvs = new HashMap<String, String>();
private static Logger logger = LoggerFactory.getLogger(BizConf.class);
@Autowired
private Handyman handyman;
public String get(String k) {
String r = "";
rl.lock();
try {
r = kvs.get(k);
} finally {
rl.unlock();
}
return r;
}
@PostConstruct
public void refresh() {
wl.lock();
try {
List<ProxyPropertiesT> proxyPropertiesTs = handyman.allProxyList();
for (int i = 0; i < proxyPropertiesTs.size(); i++) {
ProxyPropertiesT proxyPropertiesT = proxyPropertiesTs.get(i);
String key = proxyPropertiesT.getProxyCode() + "_" + proxyPropertiesT.getConfigKey();
String value = proxyPropertiesT.getConfigValue();
if (StringUtils.isNotBlank(key) && StringUtils.isNotBlank(value)) {
//ignore password base on security concern
if(!key.contains("password")) {
logger.info("load property. Key=" + key + ",Value=" + value);
}
kvs.put(key, value);
}
}
List<SystemT> systemTs = handyman.allSystemConfig();
for (int i = 0; i < systemTs.size(); i++) {
SystemT systemT = systemTs.get(i);
String key = systemT.getSystemKey();
String value = systemT.getSystemValue();
if (StringUtils.isNotBlank(key) && StringUtils.isNotBlank(value)) {
logger.info("load property. Key=" + key + ",Value=" + value);
kvs.put(key, value);
}
}
} finally {
wl.unlock();
}
}
}