Hazelcast mapstore基于地图名称

时间:2015-12-04 19:47:13

标签: hazelcast hazelcast-imap

我有一个Hazelcast实例,它根据地图名称组织数据。地图名称是动态的,所以在Hazelcast实例已经启动之前我不知道它们会是什么。我现在想通过MapStore功能将这些数据存储在数据库中,但保留我使用地图名称设置的组织。在查看MapStore功能时,我看不到任何方法来检索对象来自的地图或地图名称。看起来我得到的只是MapStore实现中的键值对。

更广泛的说明,有没有办法获取有关需要存储的键值对的任何信息(不仅仅是地图名称)?我想转移一些关于如何存储数据的知识......当我调用map.put(..)时我知道这些信息,但我不知道如何将这些信息传递给MapStore调用...

2 个答案:

答案 0 :(得分:1)

我只是需要类似的东西,发现你可以实现 com.hazelcast.core.MapStoreFactory 界面,其中' newMapStore ' method为您提供config中的地图名称和属性。从那里'新'您自己的MapStore实现传递地图名称。

public class MyMapStoreFactory implements MapStoreFactory {

    @Override
    public MapStore newMapStore(String mapName, Properties properties) {
        return new MyMapStoreImplementation(mapName, properties);
    }
}

并在hazelcast.xml配置中配置此工厂类,如下所示:

<map name="MapX*">
    <map-store enabled="true" initial-mode="EAGER">
        <factory-class-name>MyMapStoreFactory</factory-class-name>
    </map-store>
</map>

注意地图名称上的通配符以及&lt; class-name&gt;设置&lt; factory-class-name&gt;。

后,元素不得出现

使用Hazelcast 3.6.1进行测试,效果非常好。

答案 1 :(得分:0)

根据我的理解,在hazelcast中没有开箱即用的支持。以下是我能想到的几种解决方法:

  1. 在上下文对象中封装额外信息(地图名称,如何存储数据等),并将其存储在与您的密钥不同的Java映射中。稍后在MapStore实现中使用此映射来检索相应的信息,这些信息将帮助您保留键值对。
  2. 你把操作看起来像。

    hzMap.put(key, value);
    Context context = new Context();
    context.setHowToStoreData();
    context.setMapName();
    // any othe rother information
    context.xxx();
    // create a unique context key which can be later deduced from (key,value) pair.
    contextKey = getUniqueContextKey(key, value);
    contextMap.put(contextKey, context);
    

    在MapStore实现中,您可以使用此contextMap来检索其他值。

    1. 第二种方法是将信息封装在(key,value)对中。您可以创建一个名为CacheEntry的新类来存储缓存值以及其他信息。然后,您可以稍后从iMap本身检索缓存值以及其他信息。
    2. 你把操作看起来像。

      CacheEntry<YourValueClass> cacheEntry = new CacheEntry<YourValueClass>();
      cacheEntry.setValue(value);
      cacheEntry.howToStoreData(..);
      cacheEntry.setMapName(..);
      imap.put(key, cacheEntry);
      

      在MapStore实现中,您可以使用该值(可以是CacheEntry对象)本身来检索其他信息以及实际的valueYourValueClass的实例)。