Xmemcached与Spring 3.0的集成

昨天收到一个xmc的issue报告,大概的意思是将 Xmemcached 与spring 2.5集成没有任何问题,但是将spring升级到3.0就会抛出一个异常,并且spring容器无法正常启动,异常信息类似“ Couldn't find a destroy method named 'shutdown' on bean XMemcachedClientFactoryBean”。更详细的情况可以看这里,这是这位朋友分析的结果,简单来说就是spring 3.0对于查找destroy method为空的情况处理不同了,过去是打个日志,现在是抛出一个异常。
   问题说完,这里主要是介绍下这个问题的解决方式,事实上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"   />

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


上面的例子将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" />
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
spring+xmemcached aop切面 需要xmemcached-1.2.5+spring-2.5.6 <bean name="factoryMemcachedClient" class="net.rubyeye.xmemcached.utils.XMemcachedClientFactoryBean" destroy-method="shutdown"> <property name="servers"> <value>${XMemcached_servers}</value> </property> <!-- server's weights --> <property name="weights"> <list> <value>1</value> <value>2</value> <value>3</value> </list> </property> <!-- nio connection pool size --> <property name="connectionPoolSize" value="${XMemcached_connectionPoolSize}"></property> <!-- Use binary protocol,default is TextCommandFactory, BinaryCommandFactory KestrelCommandFactory --> <property name="commandFactory"> <bean class="net.rubyeye.xmemcached.command.BinaryCommandFactory"></bean> </property> <!-- Distributed strategy KetamaMemcachedSessionLocator--> <property name="sessionLocator"> <bean class="net.rubyeye.xmemcached.impl.KetamaMemcachedSessionLocator"></bean> </property> <!-- Serializing transcoder --> <property name="transcoder"> <bean class="net.rubyeye.xmemcached.transcoders.SerializingTranscoder" /> </property> <!-- ByteBuffer allocator --> <property name="bufferAllocator"> <bean class="net.rubyeye.xmemcached.buffer.SimpleBufferAllocator"></bean> </property> </bean> <bean id="cachingClient" class="com.dmx.cache.caching.impl.CachingXMemcachedClient" init-method="init" destroy-method="destroy"> <property name="memcachedClient" ref="factoryMemcachedClient" /> <property name="isflushAll" value="${XMemcached_isflushAll}" /> </bean> <bean id="cachingManager" class="com.dmx.cache.caching.impl.CachingManagerImpl"> <property name="cachingClient" ref="cachingClient" /> </bean> <bean id="cacheBeforeAdvice" class="com.dmx.cache.interceptor.advice.CacheBeforeAdvice"></bean> <bean id="cacheAfterAdvice" class="com.dmx.cache.interceptor.advice.CacheAfterAdvice"></bean> <bean id="cacheInterceptor" class="com.dmx.cache.interceptor.CacheInterceptor"> <property name="cachingManager" ref="cachingManager" /> <property name="cacheAttributes"> <props> <prop key="save*">update</prop> <prop key="remove*">update</prop> <prop key="add*">update</prop> <prop key="del*">update</prop> <prop key="get*">readOnly</prop> <prop key="getPlaybill">readOnly=10</prop> </props> </property> </bean> <bean id="cacheProxyFactoryBean" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="interceptorNames"> <list> <value>cacheBeforeAdvice</value> <value>cacheAfterAdvice</value> <value>cacheInterceptor</value> </list> </property> </bean> <bean id="demoDao" parent="cacheProxyFactoryBean"> <property name="target" ref="demoDaotarget" /> </bean>
可以使用Shiro提供的CacheManager将XMemcached集成到Shiro中。 首先,在pom.xml中添加XMemcached和Shiro的依赖,例如: ``` <dependency> <groupId>com.googlecode.xmemcached</groupId> <artifactId>xmemcached</artifactId> <version>2.4.6</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.7.1</version> </dependency> ``` 然后,在Shiro的配置文件中配置CacheManager,例如: ``` <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager"> <property name="cacheManagerConfigFile" value="classpath:ehcache.xml" /> </bean> ``` 这里使用了EhCacheManager,但可以将其替换为XMemcachedCacheManager。需要自己实现XMemcachedCacheManager类,例如: ``` public class XMemcachedCacheManager implements CacheManager { private MemcachedClient memcachedClient; public XMemcachedCacheManager(String servers) { try { memcachedClient = new XMemcachedClient(servers); } catch (IOException e) { throw new RuntimeException(e); } } @Override public <K, V> Cache<K, V> getCache(String name) throws CacheException { return new XMemcachedCache<>(memcachedClient, name); } @Override public void destroy() throws Exception { memcachedClient.shutdown(); } } ``` 最后,在Shiro的配置文件中使用XMemcachedCacheManager,例如: ``` <bean id="cacheManager" class="com.example.XMemcachedCacheManager"> <constructor-arg value="localhost:11211" /> </bean> ``` 这里使用了本地的XMemcached服务器,可以根据实际情况修改。配置完毕后,就可以在Shiro中使用XMemcached作为缓存了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值