2012-05-15 44 views
4

我正在评估Hazelcast作为我正在处理的应用程序的分布式数据网格解决方案。 Hazelcast是一个分布式的集群上安装和我的应用程序使用了Spring这样定义一个Hazelcast客户端:使用MapLoader在客户端内使用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。但我不确定,如果我的应用程序应该是群集的一部分,这在逻辑上是正确的 - 它基本上是数据网格的客户端。

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

谢谢!

回答

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。

相关问题