基于memcached的SNA实现(1)

来源:互联网 发布:tpo模考软件 mac 编辑:程序博客网 时间:2024/06/06 09:36

系统要集群,使用SNA方案。
一、 缓存的处理
缓存要使用统一的缓存服务器,集中式缓存。
原先的实现采用ehcache。
在spring里的配置,以资源缓存为例:

<!-- EhCache Manager -->
    
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
        
<property name="configLocation">
            
<value>classpath:ehcache.xml</value>
        
</property>
</bean>

<bean id="resourceCacheBackend"
           class
="org.springframework.cache.ehcache.EhCacheFactoryBean">
        
<property name="cacheManager" ref="cacheManager"/>
        
<property name="cacheName" value="resourceCache"/>
    
</bean>

    
<bean id="resourceCache"
           class
="com.framework.extcomponent.security.authentication.services.acegi.cache.EhCacheBasedResourceCache"
           autowire
="byName">
        
<property name="cache" ref="resourceCacheBackend"/>
    
</bean>

cacheManager负责对ehcache进行管理,初始化、启动、停止。
resourceCacheBackend负责实际执行缓存操作,put 、get、remove。
resourceCache实现具有业务语义的业务应用层面的缓存操作,内部调用resourceCacheBackend操作。

现在采用memcached。
关于客户端,采用文初封装的客户端,地址在http://code.google.com/p/memcache-client-forjava/。
使用spring的FactoryBean进行二次封装。同理:
memcachedManager负责对memcached进行管理,初始化、启动、停止。
代码:

/**
* User: ronghao
* Date: 2008-10-14
* Time: 10:36:30
* 管理Memcached 的CacheManager
*/
public class MemcachedCacheManagerFactoryBean implements FactoryBean, InitializingBean, DisposableBean {

    
protected final Log logger = LogFactory.getLog(getClass());

    
private ICacheManager<IMemcachedCache> cacheManager;

    
public Object getObject() throws Exception {
        
return cacheManager;
     }

    
public Class getObjectType() {
        
return this.cacheManager.getClass();
     }

    
public boolean isSingleton() {
        
return true;
     }

    
public void afterPropertiesSet() throws Exception {
         logger.info(
"Initializing Memcached CacheManager");
         cacheManager
= CacheUtil.getCacheManager(IMemcachedCache.class,
                 MemcachedCacheManager.
class.getName());
         cacheManager.start();
     }

    
public void destroy() throws Exception {
         logger.info(
"Shutting down Memcached CacheManager");
         cacheManager.stop();
     }
}

配置:

 
<bean id="memcachedManager"
           class
="com.framework.extcomponent.cache.MemcachedCacheManagerFactoryBean"/>

resourceCacheBackend负责实际执行缓存操作,put 、get、remove。
代码:

/**
* User: ronghao
* Date: 2008-10-14
* Time: 10:37:16
* 返回   MemcachedCache
*/
public class MemcachedCacheFactoryBean implements FactoryBean, BeanNameAware, InitializingBean {

    
protected final Log logger = LogFactory.getLog(getClass());

    
private ICacheManager<IMemcachedCache> cacheManager;
    
private String cacheName;
    
private String beanName;
    
private IMemcachedCache cache;

    
public void setCacheManager(ICacheManager<IMemcachedCache> cacheManager) {
        
this.cacheManager = cacheManager;
     }

    
public void setCacheName(String cacheName) {
        
this.cacheName = cacheName;
     }

    
public Object getObject() throws Exception {
        
return cache;
     }

    
public Class getObjectType() {
        
return this.cache.getClass();
     }

    
public boolean isSingleton() {
        
return true;
     }

    
public void setBeanName(String name) {
        
this.beanName=name;
     }

    
public void afterPropertiesSet() throws Exception {
        
// If no cache name given, use bean name as cache name.
       if (this.cacheName == null) {
        
this.cacheName = this.beanName;
     }
         cache
= cacheManager.getCache(cacheName);
     }
}

配置:

<bean id="resourceCacheBackend"
           class
="com.framework.extcomponent.cache.MemcachedCacheFactoryBean">
        
<property name="cacheManager" ref="memcachedManager"/>
        
<property name="cacheName" value="memcache"/>
    
</bean>
resourceCache同上,替换新的实现类MemcachedBasedResourceCache即可。
原创粉丝点击