我正在创建一个服务(ReST),它可以随时启动并运行。所以在这个服务中,我从我的spring上下文中调用了init方法,该方法命中数据库并将所需数据加载到hazelcast实例中。Hazelcast:如何刷新Hazelcast实例?
现在我必须确保通过调用init方法来刷新hazelcast实例。假设刷新周期是每6小时一次。
有没有一个很好的干净的方式来实现这一目标?
我正在创建一个服务(ReST),它可以随时启动并运行。所以在这个服务中,我从我的spring上下文中调用了init方法,该方法命中数据库并将所需数据加载到hazelcast实例中。Hazelcast:如何刷新Hazelcast实例?
现在我必须确保通过调用init方法来刷新hazelcast实例。假设刷新周期是每6小时一次。
有没有一个很好的干净的方式来实现这一目标?
您可以使用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>
...
之一,您可以添加时间,而将数据添加到缓存地图,指定的时间后,特定的缓存地图也可以是干净的。
这可以通过实施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
}
}
让我知道这是否合理。
似乎已被弃用,并由MapListener取而代之:http://docs.hazelcast.org/docs/latest-development/manual/html/Distributed_Events/Event_Listener_for_Members/Listening_for_Map_Events.html –
是的。我们也可以使用'MapEvictedListener'和'MapClearedListener'。 –
嗨Sandeep,谢谢你的回复。我确实知道这一点,即使用config xml配置像TTL这样的hazelcast属性和驱逐策略,但是我不明白的是如果映射内容过期,那么它将如何调用init方法,然后重新加载映射。 –
这件事需要在你的代码中处理。您的Rest Api方法将调用服务层方法,该方法将从hazelcast获取地图并将其返回。在将地图返回给调用方法之前,检查它是否为null。如果null表示hazelcast缓存为空,请调用init方法加载数据并将其放入hazelcast,然后返回。下次在6小时内调用,映射将不会为空,因此不会进行数据库调用,6小时后缓存将被清理,并且您的init mehtod将根据空映射调用。请让我知道它是否有帮助 – Sandeep
谢谢Sandeep。这个想法很好。唯一的问题是,对于特定请求的响应速度会很慢,因为该进程将在第6小时后开始触发数据库进行缓存。另一方面,我希望如果hazelcast有任何内置机制(就像任何Aware类)以确定地图已变空。 –