试图实例化xmemcached客户端

时间:2012-05-27 18:22:12

标签: java spring memcached

我一直在努力了解memcached的使用情况等,并尝试从昨天开始通过阅读少量稀缺资源进行设置。让我首先展示我拥有的东西。

  1. 已安装的memcached服务器
  2. 按照here说明配置了弹簧:

    <beans xmlns="http://www.springframework.org/schema/beans" 
        xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                http://www.springframework.org/schema/aop
                http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
    
        <import resource="simplesm-context.xml" />
        <aop:aspectj-autoproxy />
    
        <bean name="defaultMemcachedClient" class="com.google.code.ssm.CacheFactory">
              <property name="cacheClientFactory">
                    <bean class="com.google.code.ssm.providers.xmemcached.MemcacheClientFactoryImpl" />
              </property>
              <property name="addressProvider">
                    <bean class="com.google.code.ssm.config.DefaultAddressProvider">
                         <property name="address" value="127.0.0.1:11211" />
                    </bean>
              </property>
              <property name="configuration">
                    <bean class="com.google.code.ssm.providers.CacheConfiguration">
                          <property name="consistentHashing" value="true" />
                    </bean>
              </property>
         </bean>
    </beans>
    
  3. 通过spring成功创建了与服务器的连接:

    20:06:07,864 WARN  [main] (XMemcachedClient.java:645) - XMemcachedClient use Text protocol
    20:06:08,112 WARN  [main] (AbstractController.java:372) - The Controller started at localhost/127.0.0.1:0 ...
    20:06:08,139 WARN  [Xmemcached-Reactor-0] (MemcachedConnector.java:239) - Add a session: 127.0.0.1:11211
    
  4. 下一步是测试它,这提供了关于memcached的好/简单解释:http://www.majordojo.com/2007/03/memcached-howto.php

    我想尝试这一点:

    Class Foo {
        public static findById(id) {
                if (obj = memcached.get(id)) return obj;
                obj = loadFromDatabase(id);
                memcached.put(id,obj);
                return obj;
            }
    }
    

    但是在这个网站上没有任何地方说它是memcached的对象类型。所以我尝试了以下内容:

    import net.rubyeye.xmemcached.MemcachedClient
    
    Class Foo {
            @Autowired
        MemcachedClient defaultMemcachedClient;
            public static findById(id) {
                    if (obj = memcached.get(id)) return obj;
                    obj = loadFromDatabase(id);
                    memcached.put(id,obj);
                    return obj;
                }
        }
    

    我从日志中得到的错误是:

    nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [net.rubyeye.xmemcached.MemcachedClient] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency
    

    我认为defaultMemcachedClient bean应该是我的memcached客户端。这显然不是。我该怎么办?有人有想法吗?链接?建议吗?什么?

1 个答案:

答案 0 :(得分:2)

defaultMemcachedClient bean的类型为Cache,与xmemecached无关。

如果您想直接使用memcached,请不要使用Simple Spring Memcached。 SSM用于使用拦截器(AOP)和注释进行缓存。在你的情况下:

public class Foo {
    // cache for 1 hour
    @ReadThroughSingleCache(namespace="foo", expiration=3600)
    public Object findById(@ParameterValueKeyProvider int id) {
            return loadFromDatabase(id);
    }
}

调用此方法时,在调用此方法的主体之前,拦截检查密钥下的缓存中是否有任何值(密钥是使用namespace和id参数创建的)。如果缓存中有值,则返回给调用者,并且不执行方法体(loadFromDatabase)。如果执行方法的高速缓存主体没有值,则结果存储在高速缓存中并返回给调用者。

如果您想直接使用memcached客户端,您仍然可以使用SSM中的Cache对象,但您可能对使用xmemcached感兴趣。