莊周夢蝶

          生活、程序、未來
             :: 首頁 ::  ::  :: 聚合  :: 管理

          Xmemcached與Spring 3.0的集成

          Posted on 2009-12-24 01:51 dennis 閱讀(4882) 評論(1)  編輯  收藏 所屬分類: javamy open-source
              昨天收到一個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"/>



          主站蜘蛛池模板: 民权县| 霍城县| 合水县| 太保市| 乌兰浩特市| 镇远县| 峡江县| 息烽县| 武川县| 巢湖市| 江津市| 泸定县| 宣化县| 桦甸市| 十堰市| 寻乌县| 兴城市| 玛多县| 宜良县| 祁连县| 赤壁市| 习水县| 清流县| 黄大仙区| 武功县| 湖州市| 昌黎县| 崇左市| 页游| 民权县| 勐海县| 潞城市| 靖安县| 凤冈县| 民丰县| 静海县| 绥宁县| 彭州市| 呈贡县| 井研县| 中宁县|