通過程序動態創建集羣環境下的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的插入操作,其他服務器上都會得到相同的複製。 

發佈了60 篇原創文章 · 獲贊 0 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章