我有一个跨两台机器复制的 ehcache 缓存。一旦两个对等点都启动,对等点就会正确地找到彼此并进行复制。但是,如果第一个对等点首先启动,并接收多个元素,然后第二个对等点稍后开始......第二个对等点永远不会看到在它还没有活动时添加的元素。
这是确切的顺序:
- 缓存 A 启动
- 将“1234”添加到缓存 A
- 缓存 B 启动
- 从缓存 B 中获取“1234”->未找到
我的期望:如果复制了 2 个缓存,那么获取现有元素将为任一缓存返回相同的值。
我的缓存元素只是原始的字符串/整数类型。
GitHub 中有一个示例:https ://github.com/HamletDRC/EhcachePOC
Ehcache 配置在这里:https ://github.com/HamletDRC/EhcachePOC/tree/master/src/main/resources
在示例项目中,为 ehcache 类启用了 log4j,以便您可以看到对等点确实找到彼此并进行复制,但只有自对等组启动以来添加的元素,而不是之前存在的元素。
您只需要安装 JDK 和 Maven 即可构建它。
重现:
- 运行 ReplicatedCacheWriter
- 等待 6 秒,让作者创建元素 [1, 2, 3, 4, 5, 6]
- 运行 ReplicatedCacheListener
- 侦听器找到所有在它激活后“放置”的元素,但没有找到在它激活之前“放置”的元素。
这是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 "/>
(很明显,两个节点的Listener Port不同)
如何让缓存在启动时同步?