Ehcache复制缓存在启动时未同步

时间:2013-05-30 19:33:20

标签: replication cluster-computing ehcache

我在两台机器上复制了一个ehcache Cache。一旦两个对等体都启动,对等体就能正确找到对方并进行复制。但是,如果第一个对等体首先开始,并且接收到多个元素,然后第二个对等体稍后开始......第二个对等体永远不会看到在它尚未存活时添加的元素。

这正是顺序:

  1. 启动缓存A
  2. 将“1234”添加到缓存A
  3. 启动缓存B
  4. 从缓存B获取“1234” - > 未找到
  5. 我的期望:如果复制了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 "/>
    

    (显然,两个节点之间的监听器端口不同)

    如何在启动时让缓存同步?

1 个答案:

答案 0 :(得分:4)

ehcache_listener.xml中需要bootstrapCacheLoaderFactory。例如:

<cache name="myCache" ...>
   ...
   <bootstrapCacheLoaderFactory
            class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"
            properties="bootstrapAsynchronously=true"
            propertySeparator="," />    
</cache>