/* ================================================================== * Created [2009-4-27 下午11:32:55] by Jon.King * ================================================================== * TSS * ================================================================== * mailTo:jinpujun@hotmail.com * Copyright (c) Jon.King, 2009-2012 * ================================================================== */ package com.jinhe.tss.core.cachepool; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.log4j.Logger; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.Element; import com.jinhe.tss.core.cachepool.strategy.CacheConstants; import com.jinhe.tss.core.cachepool.strategy.CacheStrategy; import com.jinhe.tss.core.util.BeanUtil; import com.jinhe.tss.core.util.XMLDocUtil; /** * <p> CacheManager.java </p> * * 缓存池管理类 * * @author Jon.King 2007-1-3 */ public class CacheManager { protected Logger log = Logger.getLogger(this.getClass()); private static Map<String, IPool> pools = new HashMap<String, IPool>(); /** 在配置文件里配置了的缓冲池Code列表 */ private static List<String> configedPoolCodes = new ArrayList<String>(); private CacheManager(){ } private static CacheManager manager = null; /** * 获取一个缓存池管理类实例。singleTon * @return */ public static CacheManager getInstance(){ if(manager == null){ manager = new CacheManager(); manager.initPools(CacheConstants.STRATEGY_PATH); } return manager; } public static CacheManager getInstance(String cacheConfigFile){ if(manager == null){ manager = new CacheManager(); manager.initPools(cacheConfigFile); } return manager; } /** * 根据缓存策略文件里的配置初始化各个缓存池。 */ private void initPools(String cacheConfigFile){ try{ Document doc = XMLDocUtil.createDoc(cacheConfigFile); List<Element> nodes = XMLDocUtil.selectNodes(doc, CacheConstants.STRATEGY_NODE_NAME); for(Element strategyNode : nodes ){ Map<String, String> attrsMap = new HashMap<String, String>(); CacheStrategy strategy = new CacheStrategy(); for(Iterator<?> iter = strategyNode.attributeIterator(); iter.hasNext();){ Attribute attr = (Attribute)iter.next(); attrsMap.put(attr.getName(), attr.getValue()); } for(Iterator<?> iter = strategyNode.elementIterator(); iter.hasNext();){ Element attrNode = (Element)iter.next(); attrsMap.put(attrNode.getName(), attrNode.getText()); } BeanUtil.setDataToBean(strategy, attrsMap); configedPoolCodes.add(strategy.getCode()); pools.put(strategy.getCode(), strategy.getPoolInstance()); } }catch(Exception e){ log.info("根据缓存策略配置文件初始化缓存池失败 " + e); } } /** * 根据指定code值获取一个缓存池。 * 如果获取不到,则打出日志“指定的code值找不到相应的缓存池,请确定code值是否正确”, * 并经初始化一个临时的不可见的简单缓存池。 * @param code * @return */ public IPool getCachePool(String code){ IPool pool = pools.get(code); if(pool == null){ // 如果是配置文件里配置的缓冲池获取不到,则先等待3秒钟,其有可能正在初始化。 // 另外也不能随意生成一个新的普通池,否则像ThreadPool这样涉及到downCast的池将会出错 if(configedPoolCodes.contains(code)) { try { Thread.sleep(3000); } catch (InterruptedException e) { } return pools.get(code); // 再取一遍,如果还没生成则直接返回null } log.info("指定的code值找不到相应的缓存池,请确定code : " + code + "值是否正确,系统已经初始化一个临时的简单缓存池。"); CacheStrategy strategy = new CacheStrategy(); strategy.setCode(code); strategy.setName(code); strategy.setVisible(CacheConstants.FALSE); pools.put(code, pool = strategy.getPoolInstance()); } return pool; } /** * 获取所有的池 * @return */ public Set<Map.Entry<String, IPool>> listCachePools(){ return pools.entrySet(); } }