Xmemcached與Spring 3.0的集成
Posted on 2009-12-24 01:51 dennis 閱讀(4881) 評論(1) 編輯 收藏 所屬分類: java 、my open-source 昨天收到一個xmc的issue報告,大概的意思是將Xmemcached與spring 2.5集成沒有任何問題,但是將spring升級到3.0就會拋出一個異常,并且spring容器無法正常啟動,異常信息類似“Couldn't find a destroy method named 'shutdown' on bean XMemcachedClientFactoryBean”。更詳細的情況可以看這里,這是這位朋友分析的結(jié)果,簡單來說就是spring 3.0對于查找destroy method為空的情況處理不同了,過去是打個日志,現(xiàn)在是拋出一個異常。
問題說完,這里主要是介紹下這個問題的解決方式,事實上Xmemcached有一個沒有被文檔化的Spring配置方式,沒有寫入文檔的主要考慮是以為wiki介紹的第一種方式已經(jīng)足夠,而builder的方式相對繁瑣一些。通過XmemcachedClientBuilder的這個factory bean的factory-method,也就是build方法來構(gòu)建MemcachedClient,這就可以繞開spring 3.0的這個問題。一個示范配置如下:
memcachedClientBuilder作為一個factory-bean,接受一個InetSocketAddress列表作為構(gòu)造函數(shù)傳入,最后MemcachedClient就可以通過factory-method——也就是build方法創(chuàng)建了。
多個節(jié)點情況下,可能你想設(shè)置權(quán)重,那么傳入memcachedClientBuilder的第二個構(gòu)造函數(shù)參數(shù)權(quán)重數(shù)組即可:
上面的例子將localhost:12000的權(quán)重設(shè)置為1,而localhost:12001的權(quán)重設(shè)置為2。除了這些配置外,XmemcachedClientBuilder還有其他選項,如配置一致性哈希算法、連接池等,完整的配置例子如下:
問題說完,這里主要是介紹下這個問題的解決方式,事實上Xmemcached有一個沒有被文檔化的Spring配置方式,沒有寫入文檔的主要考慮是以為wiki介紹的第一種方式已經(jīng)足夠,而builder的方式相對繁瑣一些。通過XmemcachedClientBuilder的這個factory bean的factory-method,也就是build方法來構(gòu)建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列表作為構(gòu)造函數(shù)傳入,最后MemcachedClient就可以通過factory-method——也就是build方法創(chuàng)建了。
多個節(jié)點情況下,可能你想設(shè)置權(quán)重,那么傳入memcachedClientBuilder的第二個構(gòu)造函數(shù)參數(shù)權(quán)重數(shù)組即可:
<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的權(quán)重設(shè)置為1,而localhost:12001的權(quán)重設(shè)置為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"/>