ehcache有几种方式实现集群:rmi、jgroup、jms,这里讲一下ehcache使用rmi的实现方式。
主要有三个配置:
1、cacheManagerPeerProviderFactory配置:
<cacheManagerPeerProviderFactory
class= “net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory”
properties= “peerDiscovery=automatic, multicastGroupAddress=230.0.0.1, multicastGroupPort=4446, timeToLive=1”/>
timeToLive的值指的是数据包可以传递的域或是范围。约定如下:
0是限制在同一个服务器
1是限制在同一个子网(默认)
32是限制在同一个网站
64是限制在同一个region
128是限制在同一个大洲
255是不限制
2、cacheManagerPeerListenerFactory配置:
<cacheManagerPeerListenerFactory
class= “net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory”
properties= “hostName=192.168.1.101, port=40001, socketTimeoutMillis=2000”/>
hostName说明:为本机IP,不指定时hostname将使用InetAddress.getLocalHost().getHostAddress()来得到。当在同一台机器上有多个CacheManager的时候,应该用localhost来配置。
3、cacheEventListenerFactory配置:
<cacheEventListenerFactory
class= “net.sf.ehcache.distribution.RMICacheReplicatorFactory”
properties= “replicateAsynchronously=true,
replicatePuts=true,
replicateUpdates=true,
replicateUpdatesViaCopy=true,
replicateRemovals=true” />
可以使用默认配置:
<cacheEventListenerFactory class=”net.sf.ehcache.distribution.RMICacheReplicatorFactory”/>
参数说明:
replicateAsynchronously=true | false – 复制方式是异步的(指定为true时)还是同步的(指定为false时)。默认是true。
replicatePuts=true | false – 当一个新元素增加到缓存中的时候是否要复制到其他的peers。默认是true。
replicateUpdates=true | false – 当一个已经在缓存中存在的元素被覆盖时是否要进行复制。默认是true。
replicateUpdatesViaCopy=true | false – 当一个元素被拷贝到其他的cache中时是否进行复制(指定为true时为复制)。默认是true。
replicateRemovals= true | false – 当元素移除的时候是否进行复制。默认是true。
附上实例:
假设你在集群中有两台服务器。你要同步sampleCache1和sampleCache2。下面是每个服务器需要的配置:
配置server1
<cacheManagerPeerProviderFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory" properties="peerDiscovery=manual, rmiUrls=//server2:40001/MyCache|//server2:40001/其他缓存的name"/>
配置server2
<cacheManagerPeerProviderFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory" properties="peerDiscovery=manual, rmiUrls=//server1:40001/MyCache|//server1:40001/其他缓存的name"/>
接着配置上面红色2,3步骤就可以了。
<cacheManagerPeerListenerFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory" properties="hostName=192.168.1.253, port=40001, socketTimeoutMillis=2000"/>
<cache name="MyCache" maxElementsInMemory="50" eternal="true" > <cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"/> </cache>
在使用手动发现成员配置的时候有一个特别需要注意的地方。 就是在配置 rmiUrls=//server1:40001/MyCahce|//server1:40001/其他缓存名称" 这里的时候 需要把你希望参与到集群的缓存名称配置进去 比如下面用到的MyCache.
CacheManagerPeerListener 上面的步骤2的配置说明
<cacheManagerPeerListenerFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory" properties="hostName=localhost, port=40001, socketTimeoutMillis=2000"/>
properties 有效的属性是: hostname (可选) – 运行监听器的服务器名称。标明了做为集群群组的成员的地址,同时也是你想要控制的从集群中接收消息的接口。 在CacheManager初始化的时候会检查hostname是否可用。 如果hostName不可用,CacheManager将拒绝启动并抛出一个连接被拒绝的异常。 如果指定,hostname将使用InetAddress.getLocalHost().getHostAddress()来得到。 警告:不要将localhost配置为本地地址127.0.0.1,因为它在网络中不可见将会导致不能从远程服务器接收信息从而不能复制。在同一台机器上有多个CacheManager的时候,你应该只用localhost来配置。 port – 监听器监听的端口。 socketTimeoutMillis (可选) – Socket超时的时间。默认是2000ms。当你socket同步缓存请求地址比较远,不是本地局域网。你可能需要把这个时间配置大些,不然很可能延时导致同步缓存失败。
Configuring Cache Replicators 上面配置3的说明
<cache name="sampleCache2" maxEntriesLocalHeap="10" eternal="false" timeToIdleSeconds="100" timeToLiveSeconds="100" overflowToDisk="false"> <cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory" properties="replicateAsynchronously=true, replicatePuts=true, replicateUpdates=true, replicateUpdatesViaCopy=false, replicateRemovals=true "/> </cache>
class – 使用net.sf.ehcache.distribution.RMICacheReplicatorFactory 这个工厂支持以下属性: replicatePuts=true | false – 当一个新元素增加到缓存中的时候是否要复制到其他的peers. 默认是true。 replicateUpdates=true | false – 当一个已经在缓存中存在的元素被覆盖时是否要进行复制。默认是true。 replicateRemovals= true | false – 当元素移除的时候是否进行复制。默认是true。 replicateAsynchronously=true | false – 复制方式是异步的(指定为true时)还是同步的(指定为false时)。默认是true。 replicatePutsViaCopy=true | false – 当一个新增元素被拷贝到其他的cache中时是否进行复制指定为true时为复制,默认是true。 replicateUpdatesViaCopy=true | false – 当一个元素被拷贝到其他的cache中时是否进行复制(指定为true时为复制),默认是true。 你可以使用ehcache的默认行为从而减少配置的工作量,默认的行为是以异步的方式复制每件事;你可以像下面的例子一样减少RMICacheReplicatorFactory的属性配置:
<cache name="sampleCache4" maxEntriesLocalHeap="10" eternal="true" overflowToDisk="false" memoryStoreEvictionPolicy="LFU"> <cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"/> </cache>