map缓存

package cacheMoBan;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.InitializingBean;
import com.paic.pafa.app.lwc.core.util.StringUtils;
/**
 * 使用Map缓存(ConcurrentHashMap)
 * @author YANGYONGFANG562
 *
 */
public class CacheMoBan implements BeanFactoryAware,InitializingBean {

	private static Map<String, Object> cache = new ConcurrentHashMap<String, Object>();

	private  Log logger = LogFactory.getLog(CacheMoBan.class);
	
	//private DeliveryMappingAddressDAO dao;
	
	private long reloadInterval;
	
	private long lastUpdateTime;
	
	private long minReloadInterval = 10;
	
	private long timeUnit = 60 * 1000L;
	
	private BeanFactory context;
	
	private static CacheMoBan instance;
	
	private CacheMoBan(){}
	
	@Override
	public void afterPropertiesSet() throws Exception {
		instance = this;
		loadData();
	}

	@Override
	public void setBeanFactory(BeanFactory paramBeanFactory)
			throws BeansException {
		this.context = paramBeanFactory;
	}
	
	public static CacheMoBan getInstance(){
		return  instance ;
	}
	
	public Map<String, String> getMappingCode(Map<String, Object> oldMap) {
		if(null == oldMap) return null;
		Map<String, String> newMap = new HashMap<String, String>();
		String newSafc = getDeliByCode((String) oldMap.get("a")); //key1
		newMap.put("safc", newSafc);
		return newMap;
		/*logger.info("DeliveryMappingAddressUitl.getMappingCode配送地址转换前的数据:" + oldMap);
		Map<String, String> newMap = new HashMap<String, String>();
		String newProvinceId = getDeliByCode((String) oldMap.get("provinceId"));
		newMap.put("provinceId", newProvinceId);
		String newCityId = getDeliByCode((String) oldMap.get("cityId"));
		newMap.put("cityId", newCityId);
		DeliveryMappingAddressInfoDTO areaDto = getDeliDtoByCode((String) oldMap.get("areaId"));
		String newTownId = null;
		if(null != areaDto) {
			if(GlobalConstants.FOUR_LEVEL.equals(areaDto.getCityLevel())) {
				//如果通过旧区县代码查出的是乡镇级别的数据,则把新代码赋值到乡镇;区县的值置为空
				newTownId = areaDto.getDeliCityCode();
				newMap.put("areaId", null);
				newMap.put("townId", newTownId);
			} else {
				newMap.put("areaId", areaDto.getDeliCityCode());
				newMap.put("townId", (String) oldMap.get("townId"));
			}
		} else {
			newMap.put("areaId", null);
			newMap.put("townId", (String) oldMap.get("townId"));
		}
		logger.info("DeliveryMappingAddressUitl.getMappingCode配送地址转换后的数据:" + newMap);
		return newMap;*/
	}
	/**
	 * 从缓存中取数据
	 * @param code
	 * @return
	 */
	public String getDeliByCode(String code) {
		String dto = getDeliDtoByCode(code);
		if(null == dto) return null;
		//String newCode = dto.getDeliCityCode();
		return dto;
	}
	
	/**
	 * 未超出时间间隔,不需要重新加载,超出需要重新加载
	 * @param code
	 * @return
	 */
	public String getDeliDtoByCode(String code) {
		if(!StringUtils.hasText(code)) return null;
		
		if(updateIntervalPassed()) {
			synchronized (CacheMoBan.class) {
				if(updateIntervalPassed()) {
					updateCache();
				}
			}
		}
		return (String) cache.get(code);
	}
	//更新缓存
	private void updateCache() {
		loadData();
	}
	/**
	 * 是否经过配置的间隔时间了
	 */
	private boolean updateIntervalPassed() {
		long timePassed = System.currentTimeMillis() - lastUpdateTime;
		try {
			//reloadInterval = Long.valueOf(Configuration.getValue("deliveryAddress.mapping.reloadCache.interval", String.valueOf(minReloadInterval)));
			reloadInterval = 60*12L;
			if (reloadInterval < minReloadInterval) {
				reloadInterval = minReloadInterval;
			}
			logger.debug("时间间隔为:" + reloadInterval + "分钟。");
		} catch (Exception e) {
			logger.info("判断是否重新更新配送地址映射缓存异常,使用最小间隔时间", e);
			reloadInterval = minReloadInterval;
		}
		
		return timePassed >= reloadInterval * timeUnit;
	}	
	
	private void loadData() {
		try {
			logger.info("deliverAddrMappingCache开始加载!");
			/*dao = (DeliveryMappingAddressDAO) context
					.getBean("deliveryMappingAddressDAO");
			List<DeliveryMappingAddressInfoDTO> list = dao.queryAll();
			if(null != list && !list.isEmpty()) {
				for (int i = 0; i < list.size(); i++) {
					DeliveryMappingAddressInfoDTO dto = list.get(i);
					if(null != dto && StringUtils.hasText(dto.getCityCode()) && StringUtils.hasText(dto.getDeliCityCode())) {
						cache.put(dto.getCityCode(), dto);
					}
				}
				logger.info("deliverAddrMappingCache加载结束,总共加载" + list.size() + "条记录。");
			}*/
			cache.put("key1", "accident");
			cache.put("key2", "property");
			cache.put("key3", "force");
			cache.put("key4", "biz");
			lastUpdateTime = System.currentTimeMillis();
		} catch (Exception e) {
			logger.info("deliverAddrMappingCache加载失败:", e);
		}
	}
	
	public static void main(String[] args) {
		Map<String,	Object> map = new HashMap<String, Object>();
		CacheMoBan cache = new CacheMoBan();
		map.put("a", "key1");
		map.put("b", "key2");
		map.put("c", "key3");
		System.out.println(cache.getMappingCode(map));
	}
}

  

posted @ 2018-05-03 14:53  qqyong  阅读(253)  评论(0编辑  收藏  举报