问题说完,这里主要是介绍下这个问题的解决方式,事实上Xmemcached有一个没有被文档化的Spring配置方式,没有写入文档的主要考虑是以为wiki介绍的第一种方式已经足够,而builder的方式相对繁琐一些。通过XmemcachedClientBuilder的这个factory bean的factory-method,也就是build方法来构建MemcachedClient,这就可以绕开spring 3.0的这个问题。一个示范配置如下:
<
bean
name
="memcachedClientBuilder"
class
="net.rubyeye.xmemcached.XMemcachedClientBuilder"
>
< constructor-arg >
< list >
< bean class ="java.net.InetSocketAddress" >
< constructor-arg >
< value >localhost </ value >
</ constructor-arg >
< constructor-arg >
< value >12000 </ value >
</ constructor-arg >
</ bean >
</ list >
</ constructor-arg >
</ bean >
< bean name ="memcachedClient" factory-bean ="memcachedClientBuilder"
factory-method ="build" destroy-method ="shutdown" />
< constructor-arg >
< list >
< bean class ="java.net.InetSocketAddress" >
< constructor-arg >
< value >localhost </ value >
</ constructor-arg >
< constructor-arg >
< value >12000 </ value >
</ constructor-arg >
</ bean >
</ list >
</ constructor-arg >
</ bean >
< bean name ="memcachedClient" factory-bean ="memcachedClientBuilder"
factory-method ="build" destroy-method ="shutdown" />
memcachedClientBuilder作为一个factory-bean,接受一个InetSocketAddress列表作为构造函数传入,最后MemcachedClient就可以通过factory-method——也就是build方法创建了。
多个节点情况下,可能你想设置权重,那么传入memcachedClientBuilder的第二个构造函数 参数权重数组 即可:
<
bean
name
="memcachedClientBuilder"
class
="net.rubyeye.xmemcached.XMemcachedClientBuilder"
>
< constructor-arg >
< list >
< bean class ="java.net.InetSocketAddress" >
< constructor-arg >
< value >localhost </ value >
</ constructor-arg >
< constructor-arg >
< value >12000 </ value >
</ constructor-arg >
</ bean >
< bean class ="java.net.InetSocketAddress" >
< constructor-arg >
< value >localhost </ value >
</ constructor-arg >
< constructor-arg >
< value >12001 </ value >
</ constructor-arg >
</ bean >
</ list >
</ constructor-arg >
< constructor-arg >
< list >
< value >1 </ value >
< value >2 </ value >
</ list >
</ constructor-arg >
</ bean >
< bean name ="memcachedClient" factory-bean ="memcachedClientBuilder"
factory-method ="build" destroy-method ="shutdown" />
< constructor-arg >
< list >
< bean class ="java.net.InetSocketAddress" >
< constructor-arg >
< value >localhost </ value >
</ constructor-arg >
< constructor-arg >
< value >12000 </ value >
</ constructor-arg >
</ bean >
< bean class ="java.net.InetSocketAddress" >
< constructor-arg >
< value >localhost </ value >
</ constructor-arg >
< constructor-arg >
< value >12001 </ value >
</ constructor-arg >
</ bean >
</ list >
</ constructor-arg >
< constructor-arg >
< list >
< value >1 </ value >
< value >2 </ value >
</ list >
</ constructor-arg >
</ bean >
< bean name ="memcachedClient" factory-bean ="memcachedClientBuilder"
factory-method ="build" destroy-method ="shutdown" />
上面的例子将localhost:12000的权重设置为1,而localhost:12001的权重设置为2。除了这些配置外,XmemcachedClientBuilder还有其他选项,如配置一致性哈希算法、连接池等,完整的配置例子如下:
<
bean
name
="memcachedClientBuilder"
class
="net.rubyeye.xmemcached.XMemcachedClientBuilder"
>
<!-- XMemcachedClientBuilder have two arguments.First is server list,and second is weights array. -->
< constructor-arg >
< list >
< bean class ="java.net.InetSocketAddress" >
< constructor-arg >
< value >localhost </ value >
</ constructor-arg >
< constructor-arg >
< value >12000 </ value >
</ constructor-arg >
</ bean >
< bean class ="java.net.InetSocketAddress" >
< constructor-arg >
< value >localhost </ value >
</ constructor-arg >
< constructor-arg >
< value >12001 </ value >
</ constructor-arg >
</ bean >
</ list >
</ constructor-arg >
< constructor-arg >
< list >
< value >1 </ value >
< value >2 </ value >
</ list >
</ constructor-arg >
< property name ="connectionPoolSize" value ="2" ></ property >
< property name ="commandFactory" >
< bean class ="net.rubyeye.xmemcached.command.TextCommandFactory" ></ bean >
</ property >
< property name ="sessionLocator" >
< bean class ="net.rubyeye.xmemcached.impl.KetamaMemcachedSessionLocator" ></ bean >
</ property >
< property name ="transcoder" >
< bean class ="net.rubyeye.xmemcached.transcoders.SerializingTranscoder" />
</ property >
</ bean >
<!-- Use factory bean to build memcached client -->
< bean name ="memcachedClient" factory-bean ="memcachedClientBuilder"
factory-method ="build" destroy-method ="shutdown" />
<!-- XMemcachedClientBuilder have two arguments.First is server list,and second is weights array. -->
< constructor-arg >
< list >
< bean class ="java.net.InetSocketAddress" >
< constructor-arg >
< value >localhost </ value >
</ constructor-arg >
< constructor-arg >
< value >12000 </ value >
</ constructor-arg >
</ bean >
< bean class ="java.net.InetSocketAddress" >
< constructor-arg >
< value >localhost </ value >
</ constructor-arg >
< constructor-arg >
< value >12001 </ value >
</ constructor-arg >
</ bean >
</ list >
</ constructor-arg >
< constructor-arg >
< list >
< value >1 </ value >
< value >2 </ value >
</ list >
</ constructor-arg >
< property name ="connectionPoolSize" value ="2" ></ property >
< property name ="commandFactory" >
< bean class ="net.rubyeye.xmemcached.command.TextCommandFactory" ></ bean >
</ property >
< property name ="sessionLocator" >
< bean class ="net.rubyeye.xmemcached.impl.KetamaMemcachedSessionLocator" ></ bean >
</ property >
< property name ="transcoder" >
< bean class ="net.rubyeye.xmemcached.transcoders.SerializingTranscoder" />
</ property >
</ bean >
<!-- Use factory bean to build memcached client -->
< bean name ="memcachedClient" factory-bean ="memcachedClientBuilder"
factory-method ="build" destroy-method ="shutdown" />