首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

xmemcached扩充XMemcachedClientBuilder简化spring3配置

2012-06-28 
xmemcached扩展XMemcachedClientBuilder简化spring3配置为什么要扩展呢?因为默认的配置并非集群环境的最佳

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"

????????????factory-bean="memcachedClientBuilder"

??????????? factory-method="build"

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

热点排行