Memcached学習ノート-第4部:Memcached Javaクライアント-gwalin(3)-spring統合

7187 ワード


Memcached Java Client Spring統合
 
 
プロジェクトがSpringをミドルウェアとして使用している場合は、Springの統合構成が役立ちます.
 
プロファイル
applicationContext-memcachedjavaclient.xml
 
<?xml version="1.0" encoding="UTF-8"?>  
<beans  
    xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans   
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd ">  
    <!--memcached     SocketPool-->  
    <bean id="memcachedPool" class="com.danga.MemCached.SockIOPool" factory-method="getInstance" init-method="initialize" destroy-method="shutDown">    
        <constructor-arg><value>neeaMemcachedPool</value></constructor-arg>
        <property name="servers">  
            <list>  
                <value>localhost:11211</value>
                <value>localhost:11212</value>
                <value>localhost:11213</value>
            </list>  
        </property>  
        <!--        
        <property name="weights">  
            <value>1,1,1</value>  
        </property>-->  
        <property name="initConn">  
            <value>5</value>  
        </property>  
        <property name="minConn">  
            <value>5</value>  
        </property>  
        <property name="maxConn">  
            <value>250</value>  
        </property>  
        <property name="maintSleep">  
            <value>30</value>  
        </property>  
        <property name="nagle">  
            <value>false</value>  
        </property>  
        <property name="maxIdle">  
            <value>6000</value>  
        </property>  
        <property name="socketTO">  
            <value>3000</value>  
        </property>  
    </bean>  
      
    <!--memcached client-->  
    <bean id="memCachedClient" class="com.danga.MemCached.MemCachedClient">  
        <constructor-arg>  
            <value>neeaMemcachedPool</value>  
        </constructor-arg> 
    </bean>  
    <!--memcached    ***end-->  

    <!--          -->
    <bean id="memcachedClientService" class="org.acooly.memcached.memcachedjavaclient.MemcachedClientServiceJavaClientImpl">
        <property name="memCachedClient" ref="memCachedClient" />
    </bean>
</beans>  

 ビジネスコード
JVMコンテナを直接使用していたコードを微調整し、サービスメソッドで呼び出しの一例を変更してmemcachedクライアントインスタンスをSpring注入依存として取得します.サービスインタフェースクラス:MemcachedClientService
/**
 * Memcached         ,         ,          API  ,               
 *       flags  , append,prepend,replace,incr,decr   
 * 
 * @author zhangpu
 * 
 */
public interface MemcachedClientService {

	String get(String key);

	CacheItem gets(String key);

	boolean add(String key, String value);

	boolean set(String key, String value);

	boolean cas(String key, String value, long unique);
	
	boolean delete(String key);

	boolean flushAll();

}

 
サービス実装クラス:M e m c h e d ClientServiceJavaClientImpl
/**
 * Memcached for java           (SPING)
 * 
 * @author zhangpu
 * 
 */
public class MemcachedClientServiceJavaClientImpl implements MemcachedClientService {

	/**         */
	private MemCachedClient memCachedClient;

	public void setMemCachedClient(MemCachedClient memCachedClient) {
		this.memCachedClient = memCachedClient;
	}

	public boolean add(String key, String value) {
		return memCachedClient.add(key, value);
	}

	public boolean cas(String key, String value, long unique) {
		return memCachedClient.cas(key, value, unique);
	}

	public String get(String key) {
		return (String) memCachedClient.get(key);
	}

	public CacheItem gets(String key) {
		MemcachedItem item = memCachedClient.gets(key);
		return new CacheItem(key, (String) item.getValue(), item.getCasUnique());
	}

	public boolean set(String key, String value) {
		return memCachedClient.set(key, value);
	}

	public boolean delete(String key) {
		return memCachedClient.delete(key);
	}

	public boolean flushAll() {
		return memCachedClient.flushAll();
	}

}

 
コード検証
public class MemcachedClientSerivceSpringTest {

	public static void main(String[] args) throws Exception {
		ApplicationContext context = new ClassPathXmlApplicationContext(
				new String[] { "applicationContext-memcachedjavaclient.xml" });
		
		MemcachedClientService memcachedClientService = (MemcachedClientService) context
				.getBean("memcachedClientService");
		
		String key = "keySpring";
		String value = "i like Spring.";
		String newValue = "i love Spring";
		System.out.println("add: " + memcachedClientService.add(key, value));
		System.out.println("set: " + memcachedClientService.set(key, newValue));
		System.out.println("get: " + memcachedClientService.get(key));
		CacheItem item = memcachedClientService.gets(key);
		System.out.println("gets: " + item);
		System.out.println("cas: " + memcachedClientService.cas(key, newValue, item.getUnique()));
		System.out.println("del: " + memcachedClientService.delete(key));
	}

}

 
 実行結果:
 
add: true
set: true
get: i love Spring
gets: {key:keySpring,value:i love Spring,unique:2701285}
cas: true
del: true

 構成の問題
コンフィギュレーションファイルでウェイトコンフィギュレーションにコメントしたのは、SocketPoolのウェイトパラメータがInteger[]であるため、SpringコンフィギュレーションにInteger[]パラメータをどのように注入するかは考えられませんでした.以前は自分のコードでしたが、文字列に変換してこの問題をスキップすることができます.
 
<property name="weights">  
      <value>1,1,1</value>  
</property>
 
解決策:
  • 拡張Springの構成実装、Springは関連拡張方法を提供し、カスタムパラメータ構成をサポートする.
  • memcached java clientのソースコードをダウンロードし、SocketPoolの実装を変更します.