在客户端中使用MapLoader作为Hazelcast分布式地图

时间:2012-05-15 14:47:03

标签: spring hazelcast

我正在评估Hazelcast作为我正在开发的应用程序的分布式数据网格解决方案。 Hazelcast是在分布式集群上设置的,我的应用程序使用Spring以这种方式定义Hazelcast客户端:

<hz:client id="hazelcastClient" group-name="dev" group-password="dev-pass">
  <hz:member>localhost:5701</hz:member>
</hz:client>

在我的Hazelcast节点上,在hazelcast.xml文件中我设置了一个地图,其中包含所有需要的配置。我们假设这张地图叫做myMap。使用Hazelcast webapp进行监控(mancenter)时,我可以正确设置此地图。

我现在要配置地图以在应用程序端注入我的bean。如果我做了像

这样的事情
<hz:map id="myMap" instance-ref="hazelcastClient" name="myMap" />

我将这张地图注入我的包含获取逻辑的bean中,我没有遇到任何问题。

但是,我还编写了一个实现MapLoader接口的类,以便处理缓存中丢失的数据。我现在的问题是我不知道如何将此Maploader绑定到我定义的缓存。如果我尝试像

那样的话
<hz:map id="myMap" instance-ref="hazelcastClient" name="myMap">
  <hz:map-store enabled="true" implementation="myMapLoader"/>
</hz:map>

我收到一个XML解析错误,因为似乎当hz:map用作顶级元素(例如,不在hz:config内)时,您无法指定内部元素。这使我认为您需要定义hz:config元素。但是,如果您可以为客户端定义hz:config元素,则从文档中不太清楚。对我来说,如果您希望应用程序成为群集的一部分,则似乎需要使用hz:config。我不确定我的应用程序应该是集群的一部分在逻辑上是否正确 - 它基本上是数据网格的客户端。

您对如何配置我的应用以实现我想要的行为有任何想法吗?

谢谢!

1 个答案:

答案 0 :(得分:13)

无法在客户端配置地图。您应该在Hazelcast节点上配置myMap及其MapLoader/MapStore。 MapStore / MapLoader操作由拥有数据的Hazelcast节点执行,而不是由客户端执行。

  

Hazelcast节点

<hz:config>
    ...
    <hz:map name="myMap" backup-count="1" max-size="0">
        <hz:map-store enabled="true" implementation="myMapLoader" />
    </hz:map>
    ...
</hz:config>

-OR-使用hazelcast.xml

<map name="myMap">
    <backup-count>1</backup-count>
    <time-to-live-seconds>0</time-to-live-seconds>
    <max-idle-seconds>0</max-idle-seconds>

    <map-store enabled="true">
        <class-name>foo.bar.MyMapLoader</class-name>
        <write-delay-seconds>0</write-delay-seconds>
    </map-store>
</map>

在客户端,只需实例化myMap;

<hz:map id="myMap" instance-ref="hazelcastClient" name="myMap" />

当客户端放入/获取该映射时,该节点处理客户端的请求将调用MapLoader / MapStore。