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" />
...