importjava.util.Collection;importjava.util.Collections;importjava.util.Iterator;importjava.util.List;importjava.util.Map;importjava.util.concurrent.ConcurrentHashMap;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Component;importnet.blogjava.frankiegao123.log.slf4j.Log;importnet.blogjava.frankiegao123.log.slf4j.LogFactory;/***
System.Config 配置缓存
*
*@authorfrankiegao123
* 2010-6-10 下午02:48:35*/@Component("configCache")public class ConfigCache implementsConfigService {private final static Log log = LogFactory.getLog(ConfigCache.class);/*** 更新缓存时记录的时间*/
private volatile long time = 0L;/*** 正在更新缓存时的门闩,为 true 时表示当前没有更新缓存,为 true 时表示当前正在更新缓存*/
private volatile boolean updateGate = true;/*** 缓存容器*/
private Map cache = new ConcurrentHashMap();privateCommonDao commonDao;
@AutowiredpublicConfigCache(CommonDao commonDao) {this.commonDao =commonDao;
log.info("initializing cache...");
refreshCache();
time=System.currentTimeMillis();
log.info("initialized cache finished, cache size: {}, set cache time to current: {}, cache timeout: {}ms", cache.size(), time, ConfigConstant.CACHE_TIMEOUT);
}/***
根据配置的键名获取配置值
*
*@paramconfigKey
*@return*@authorfrankiegao123
* 2010-6-10 上午11:18:33*/
publicSysConfig getSysConfig(String configKey) {long current =System.currentTimeMillis();if(updateGate &&isTimeout(current)) {synchronized (this) {if(updateGate) {
timeoutSynRefresh(current);
}
}
}returncache.get(configKey);
}/***
超时时更新缓存。该方法需要在同步环境中调用
*@paramcurrent
*@authorfrankiegao123
* 2010-6-10 上午11:16:30*/
private void timeoutSynRefresh(longcurrent) {
updateGate= false;
log.info("refresh cache start..., time out: {}, size: {}, set updateGate to false", (current - time) / 1000.0, cache.size());try{
refreshCache();
time=current;
log.info("refresh cache finished, size after update: {}, set cache time to current: {}", cache.size(), String.valueOf(time));
}catch(Exception e) {
log.error("refresh cache failed", e);
}finally{
updateGate= true;
log.info("refresh cache finished, set updateGate to true");
}
}/***
更新缓存数据
*
*@authorfrankiegao123
* 2010-6-10 上午11:15:55*/
private voidrefreshCache() {
List configs =commonDao.getSysConfigs();for(Iterator i =configs.iterator(); i.hasNext(); ) {
SysConfig config=i.next();
cache.put(config.getKey(), config);
}
commonDao.clear();
SysConfig config=cache.get(SysConfig.TEST_KEY);if(config == null) {
log.error("refresh cache, cannot find TEST_KEY");
}else{
log.info("refresh cache, find TEST_KEY = [{}]", config.getValue());
}
}/***
缓存是否超时
*
*@paramcurrent
*@return*@authorfrankiegao123
* 2010-6-10 上午11:16:12*/
private boolean isTimeout(longcurrent) {return (current - time >=ConfigConstant.CACHE_TIMEOUT);
}
CollectiongetSysConfigs() {returnCollections.unmodifiableCollection(cache.values());
}intgetSize() {returncache.size();
}longgetTime() {returntime;
}booleanisUpdateGate() {returnupdateGate;
}voidrefresh() {
time= 0L;
log.info("refresh: reset cache time to 0");
getSysConfig("none");
log.info("refresh: refresh cache finished, cache: {0}", String.valueOf(time));
}
}