http://www.cnblogs.com/hoojo/archive/2012/07/19/2599534.html
http://www.cnblogs.com/hellowood23/p/5210267.html
http://blog.csdn.net/ni_hao_ya/article/details/9344779
http://www.cnblogs.com/hellowood23/p/5210267.html
這篇我將探討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
XML/HTML代碼
- <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
Java代碼
- 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 = new CacheManager(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
XML/HTML代碼
- <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
Java代碼
- 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 = new CacheManager(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);
- }
- }
-
- }