2016-02-22 98 views
0

我正在创建一个服务(ReST),它可以随时启动并运行。所以在这个服务中,我从我的spring上下文中调用了init方法,该方法命中数据库并将所需数据加载到hazelcast实例中。Hazelcast:如何刷新Hazelcast实例?

现在我必须确保通过调用init方法来刷新hazelcast实例。假设刷新周期是每6小时一次。

有没有一个很好的干净的方式来实现这一目标?

回答

1

您可以使用Hazelcast eviction policy解决此问题。

<time-to-live-seconds>3600</time-to-live-seconds>

它清除地图内容,每隔1小时,并且当任何请求进入它重新加载来自装载机地图内容。

下面是Hazelcast地图配置

... 
    <!-- 
     Maximum number of seconds for each entry to stay in the map. Entries that are 
     older than <time-to-live-seconds> and not updated for <time-to-live-seconds> 
     will get automatically evicted from the map. 
     Any integer between 0 and Integer.MAX_VALUE. 0 means infinite. Default is 0. 
    --> 
    <time-to-live-seconds>0</time-to-live-seconds> 
... 

之一,您可以添加时间,而将数据添加到缓存地图,指定的时间后,特定的缓存地图也可以是干净的。

+0

嗨Sandeep,谢谢你的回复。我确实知道这一点,即使用config xml配置像TTL这样的hazelcast属性和驱逐策略,但是我不明白的是如果映射内容过期,那么它将如何调用init方法,然后重新加载映射。 –

+0

这件事需要在你的代码中处理。您的Rest Api方法将调用服务层方法,该方法将从hazelcast获取地图并将其返回。在将地图返回给调用方法之前,检查它是否为null。如果null表示hazelcast缓存为空,请调用init方法加载数据并将其放入hazelcast,然后返回。下次在6小时内调用,映射将不会为空,因此不会进行数据库调用,6小时后缓存将被清理,并且您的init mehtod将根据空映射调用。请让我知道它是否有帮助 – Sandeep

+0

谢谢Sandeep。这个想法很好。唯一的问题是,对于特定请求的响应速度会很慢,因为该进程将在第6小时后开始触发数据库进行缓存。另一方面,我希望如果hazelcast有任何内置机制(就像任何Aware类)以确定地图已变空。 –

1

这可以通过实施Hazelcast提供的EntryListener接口轻松实现。
实现下面的方法并调用你的init()方法。

IMap<> map = hzInstance.getMap("mapName"); 
map.addEntryListener(new MyMapEventListener()); 

public class MyMapEventListener implements EntryListener{ 
    @Override 
    public void mapCleared(MapEvent mapEvent) { 
     //Make your init call inside this 
    } 

    @Override 
    public void mapEvicted(MapEvent mapEvent) { 
     //Make your init call inside this 
    } 
} 

让我知道这是否合理。

+0

似乎已被弃用,并由MapListener取而代之:http://docs.hazelcast.org/docs/latest-development/manual/html/Distributed_Events/Event_Listener_for_Members/Listening_for_Map_Events.html –

+0

是的。我们也可以使用'MapEvictedListener'和'MapClearedListener'。 –