`
lancefox
  • 浏览: 63499 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

xmemcached扩展XMemcachedClientBuilder简化spring3配置

 
阅读更多

为什么要扩展呢?因为默认的配置并非集群环境的最佳实践。

为什么要简化呢?因为不简化的配置实在是太丑陋了。

分别贴出代码与spring3.x配置文件,备忘...

 

直接运用在项目中,可以通过配置文件的修改,轻松增加和减少cache节点,多方便,如果能热加就更完美了

我是个菜鸟,不知道咋写能热切。 

XMemcachedClientBuilder这个类也真TM恶心,很多有用的参数都是private级别的,非逼人修改源码么这

不是?幸亏我们的JAVA拥有反射机制,否则被它恶心死了。

#########################################################

 

public class XMemcachedClientBuilderEX extends XMemcachedClientBuilder{

 private Class clazz = XMemcachedClientBuilder.class;
 
 private boolean weightFlag = true;
 
 private int[] weights = null;
 
 private List<InetSocketAddress> addressList = null;
 
 /**
  * 缓存节点
  * 格式  IP:PORT:WEIGHT
  * 如  192.168.137.2:11211:1
  */
 public XMemcachedClientBuilderEX(List<String> cacheNode){
  List<Integer> weight = new ArrayList();
  StringBuffer sb = new StringBuffer();
  for(String node:cacheNode){
   String[] nodeArgs = node.split(":");
   int len = nodeArgs.length;
   switch (len) {
    case 2://只有IP和端口的情况
     sb.append(nodeArgs[0].trim()).append(":").append(nodeArgs[1].trim());
     weightFlag = false;
     break;
    case 3:
     sb.append(nodeArgs[0].trim()).append(":").append(nodeArgs[1].trim());
     weight.add(Integer.parseInt(nodeArgs[2].trim()));
     break;
    default:
     break;
   }
   sb.append(" ");
  }
  addressList = getAddresses(sb.toString());
  weights = buildWeight(weight,weightFlag);
  init(addressList,weightFlag,weights);
 }
 
 private void init(List<InetSocketAddress> addressList,boolean weightFlag,int[] w){
  setCacheNode(addressList,weightFlag,w);
  super.setCommandFactory(new net.rubyeye.xmemcached.command.TextCommandFactory());
  super.setSessionLocator(new net.rubyeye.xmemcached.impl.KetamaMemcachedSessionLocator());
  super.setTranscoder(new net.rubyeye.xmemcached.transcoders.SerializingTranscoder());
 }
 
 private int[] buildWeight(List<Integer> weight,boolean weightFlag){
  int[] w = null;
  if(weightFlag){
   Integer[] weightArr = (Integer[])weight.toArray();
   w = new int[weightArr.length];
   int i=0;
   for(Integer wi:weightArr){
    w[i++] = wi.intValue();
   }
   System.out.println("weight : "+w);
  }
  return w;
 }
 
 private void setCacheNode(List<InetSocketAddress> addressList,boolean weightFlag,int[] w){
  Map<InetSocketAddress, InetSocketAddress> addressMap = buildAddressMap(addressList);
  try {
   Field[] fields = clazz.getDeclaredFields();
   for(Field field:fields){
    if(field.getName().equals("addressMap")){
     field.setAccessible(true);
     field.set(this, addressMap);
    }
    if(weightFlag && field.getName().equals("weights")){
     field.setAccessible(true);
     field.set(this, w);
    }
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
 
 private Map<InetSocketAddress, InetSocketAddress> buildAddressMap(List<InetSocketAddress> addressList){
  Map<InetSocketAddress, InetSocketAddress> addressMap = new LinkedHashMap<InetSocketAddress, InetSocketAddress>();
  if (addressList != null) {
   for (InetSocketAddress addr : addressList) {
    addressMap.put(addr, null);
   }
  }
  return addressMap;
 }
 
 private List<InetSocketAddress> getAddresses(String nodeInfo){
  return AddrUtil.getAddresses(nodeInfo);
 }
 
}

 

#########################################################

 ...

 <bean name="memcachedClientBuilder" class="xxx.XMemcachedClientBuilderEX">
  <constructor-arg>
   <list>
    <value>192.168.137.2:11211</value>
    <value>192.168.137.2:11212</value>
    <value>192.168.137.2:11213</value>
    <value>192.168.137.2:11214</value>
    <value>192.168.137.2:11215</value>
   </list>
  </constructor-arg>
 </bean>
 <bean name="memcachedClient"

            factory-bean="memcachedClientBuilder"

            factory-method="build"

            destroy-method="shutdown" />
...

分享到:
评论
1 楼 beming 2012-09-15  
请问代码中哪里用了spring的注入

相关推荐

Global site tag (gtag.js) - Google Analytics