为什么要扩展呢?因为默认的配置并非集群环境的最佳实践。
为什么要简化呢?因为不简化的配置实在是太丑陋了。
分别贴出代码与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" />
...