我在两台机器上复制了一个ehcache Cache。一旦两个对等体都启动,对等体就能正确找到对方并进行复制。但是,如果第一个对等体首先开始,并且接收到多个元素,然后第二个对等体稍后开始......第二个对等体永远不会看到在它尚未存活时添加的元素。
这正是顺序:
我的期望:如果复制了2个缓存,那么获取现有元素会为任一缓存返回相同的值。
我的缓存元素只是原始字符串/整数类型。
示例在GitHub中:https://github.com/HamletDRC/EhcachePOC
Ehcache配置在这里:https://github.com/HamletDRC/EhcachePOC/tree/master/src/main/resources
在示例项目中,为ehcache类启用了log4j,以便您可以看到对等方确实找到了对方并进行了复制,但只查看了自对等组启动以来添加的元素,而不是之前存在的元素。
您只需安装JDK和Maven即可构建它。
重现:
这是ehcache.xml
<cacheManagerPeerProviderFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
properties="peerDiscovery=automatic, multicastGroupAddress=231.0.0.1,
multicastGroupPort=4446, timeToLive=32"/>
<cacheManagerPeerListenerFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
properties="port=40002, socketTimeoutMillis=2000"/>
...
<cacheEventListenerFactory
class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
properties="replicateAsynchronously=true, replicatePuts=true, replicateUpdates=true,
replicateUpdatesViaCopy=false, replicateRemovals=true "/>
(显然,两个节点之间的监听器端口不同)
如何在启动时让缓存同步?
答案 0 :(得分:4)
ehcache_listener.xml
中需要bootstrapCacheLoaderFactory。例如:
<cache name="myCache" ...>
...
<bootstrapCacheLoaderFactory
class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"
properties="bootstrapAsynchronously=true"
propertySeparator="," />
</cache>