這篇我將探討ehcache的集羣配置,並寫兩個分佈在不同邏輯機器上的程序去測試是不是達到了集羣效果。我的目標就是得到踏踏實實的配置成功的感覺。
一.集羣配置方式
ehcache提供三種網絡連接策略來實現集羣,rmi,jgroup還有jms。這裏只說rmi方式。同時ehcache可以可以實現多播的方式實現集羣。也可以手動指定集羣主機序列實現集羣,本例應用手動指定。
這裏說點題外話,本來看着分發包中的原來的例子配置是一件不怎麼難的事情,應該很容易就能實現。但是一開始,我是在我的linux主機上和我的主操作系統windows上實現集羣配置。結果反過來弄過去,都沒有成功。然後在網上找一些別人的配置經驗,竟然都是配置片段,沒有完整的實例文件。結果配置半天沒成功。但我懷疑是我的linux系統有些地方可能沒有配置好,於是先不管他。有開啓了我的另一個windows主機。然後把程序部署上去,竟然一次試驗成功。高興的同時,我得發句話“不要把代碼片段稱作實例,這很不負責任”。同時還存在一個問題,在linux下沒有部署成功的原因有待查明。
具體說明:配置cacheManagerPeerListenerFactory是配宿主主機配置監聽程序,來發現其他主機發來的同步請求
配置cacheManagerPeerProviderFactory是指定除自身之外的網絡羣體中其他提供同步的主機列表,用“|”分開不同的主機。
下面的例子的測試過程是:主機B緩存開啓,並從名爲UserCache的緩存中循環抓取鍵值爲“key1”的元素,直到取到,才退出循環。主機A緩存啓動,並在名爲UserCache的緩存中放入鍵值爲“key1”的元素。顯然,如果主機B取到的元素,那麼就證明同步成功,也就是集羣成功。
所以在測試過程中先啓動主機B的測試程序,在啓動主機A的測試程序。
下面具體說配置文件以及測試程序:
1. 主機A的配置文件以及測試源代碼
config/ehcache_cluster.xml
- <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:noNamespaceSchemaLocation="ehcache.xsd">
- <cacheManagerPeerProviderFactory
- class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
- properties="peerDiscovery=manual,
- rmiUrls=//192.168.1.254:40000/UserCache" />
- <cacheManagerPeerListenerFactory
- class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
- properties="hostName=192.168.1.126,port=40000,socketTimeoutMillis=120000" />
- <defaultCache maxElementsInMemory="10000" eternal="false"
- timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true"
- diskSpoolBufferSizeMB="30" maxElementsOnDisk="10000000"
- diskPersistent="false" diskExpiryThreadIntervalSeconds="120"
- memoryStoreEvictionPolicy="LRU">
- <cacheEventListenerFactory
- class="net.sf.ehcache.distribution.RMICacheReplicatorFactory" />
- </defaultCache>
- <cache name="UserCache" maxElementsInMemory="1000" eternal="false"
- timeToIdleSeconds="100000" timeToLiveSeconds="100000"
- overflowToDisk="false">
- <cacheEventListenerFactory
- class="net.sf.ehcache.distribution.RMICacheReplicatorFactory" />
- </cache>
- </ehcache>
tutorial/UsingCacheCluster
- package tutorial;
- import java.net.URL;
- import net.sf.ehcache.Cache;
- import net.sf.ehcache.CacheManager;
- import net.sf.ehcache.Element;
- public class UsingCacheCluster {
- public static void main(String[] args) throws Exception {
- URL url = UsingCacheCluster.class.getClassLoader().getResource(
- "config/ehcache_cluster.xml");
- CacheManager manager = CacheManager.create(url);
- //取得Cache
- Cache cache = manager.getCache("UserCache");
- Element element = new Element("key1", "value1");
- cache.put(element);
- Element element1 = cache.get("key1");
- System.out.println(element1.getValue());
- }
- }
2. 主機B上的配置文件以及測試代碼
config/ehcache_cluster.xml
- <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:noNamespaceSchemaLocation="ehcache.xsd">
- <cacheManagerPeerProviderFactory
- class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
- properties="peerDiscovery=manual,
- rmiUrls=//192.168.1.126:40000/UserCache" />
- <cacheManagerPeerListenerFactory
- class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
- properties="hostName=192.168.1.254,port=40000, socketTimeoutMillis=120000" />
- <defaultCache maxElementsInMemory="10000" eternal="false"
- timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true"
- diskSpoolBufferSizeMB="30" maxElementsOnDisk="10000000"
- diskPersistent="false" diskExpiryThreadIntervalSeconds="120"
- memoryStoreEvictionPolicy="LRU">
- <cacheEventListenerFactory
- class="net.sf.ehcache.distribution.RMICacheReplicatorFactory" />
- </defaultCache>
- <cache name="UserCache" maxElementsInMemory="1000" eternal="false"
- timeToIdleSeconds="100000" timeToLiveSeconds="100000"
- overflowToDisk="false">
- <cacheEventListenerFactory
- class="net.sf.ehcache.distribution.RMICacheReplicatorFactory" />
- </cache>
- </ehcache>
tutorial/UsingCacheCluster
- package tutorial;
- import java.net.URL;
- import net.sf.ehcache.Cache;
- import net.sf.ehcache.CacheManager;
- import net.sf.ehcache.Element;
- public class UsingCacheCluster {
- public static void main(String[] args) throws Exception {
- URL url = UsingCacheCluster.class.getClassLoader().getResource(
- "config/ehcache_cluster.xml");
- CacheManager manager = CacheManager.create(url);
- //取得Cache
- Cache cache = manager.getCache("UserCache");
- while(true) {
- Element e = cache.get("key1");
- if(e != null) {
- System.out.println(e.getValue());
- break;
- }
- Thread.sleep(1000);
- }
- }
- }