通过程序动态创建集群环境下的Ehcache RMI分布式缓存

Keywords:Ehcache, RMI Replicated Caching, 集群

Ehcache用户手册

Ehcache支持RMI、JMS、JGroups等多种集群环境下的缓存复制策略,具体可以参考Ehcache官方的用户手册:http://ehcache.org/documentation/index.html

选型:RMI Replicated Caching

查了很多资料,最终选择了RMI的缓存复制策略,主要是由于它配置起来比较简单,并且不依赖于第三方的jar包,目前也仅仅是在实验阶段,为了快速搭建原型环境。

因归正传

关于在集群环境下配置Ehcache的RMI复制策略,网上有很多现成的资料,官方网站的RMI Replicated Caching也有非常详细的讲解。但网上的大部分资料都是通过修改Ehcache.xml配置文件,增加cacheManagerPeerProviderFactory、cacheManagerPeerListenerFactory,并为cache配置cacheEventListenerFactory来实现cache的复制策略。

这样就存在一个问题,只有在Ehcache.xml中配置的cache才可以实现集群环境下的复制,如果我们有很多cache需要在集群环境下实现复制,把他们全部加到Ehcache中工作量会很大,并且容易出错,以后的扩展性也不够好。

通过查找官方资料,发现Ehcache有很多API,完全可以程序动态创建可以进行RMI复制的cache,这样就可以很方便的创建很多支持集群环境的cache,而不用都配置到配置文件中。

直接上代码:

1、首先要对Ehcache.xml进行通用性配置,在ehcache节点下增加cacheManagerPeerProviderFactory、cacheManagerPeerListenerFactory配置,这里使用的是组播方式。 

<cacheManagerPeerProviderFactory
        class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory" 
        properties="peerDiscovery=automatic, multicastGroupAddress=230.0.0.1, multicastGroupPort=4446, timeToLive=32"/>

<cacheManagerPeerListenerFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"/>

 2、在程序中动态创建支持RMI复制的cache:

private static final CacheManager singletonManager = CacheManager.getInstance();
CacheEventListenerFactoryConfiguration config = new CacheEventListenerFactoryConfiguration();
config.setClass("net.sf.ehcache.distribution.RMICacheReplicatorFactory");
//config.setProperties("replicateAsynchronously=true," +
//        	"replicatePuts=true," +
//        	"replicateUpdates=true," +
//        	"replicateUpdatesViaCopy=true," +
//        	"replicateRemovals=true");
CacheConfiguration cacheConf = new CacheConfiguration("myCacheName", maxSize);
cacheConf.addCacheEventListenerFactory(config);
Cache cache = new Cache(cacheConf);//创建支持RMI复制的cache
singletonManager.addCache(cache);//将此cache纳入manager管理

  

集群中的多个服务器,都用相同的代码获取此cache,只要保证cache的名字相同即可。

通过如上配置,"myCacheName” cache已经支持集群环境下的RMI复制,在集群中的每个server上通过singletonManager.getCache("myCacheName")即可获取此cache进行CURD操作。

看看效果吧,集群中的多个服务器同时执行对此cache的插入操作,其他服务器上都会得到相同的复制。 

猜你喜欢

转载自soartju.iteye.com/blog/790205