【发布时间】:2016-06-03 12:29:44
【问题描述】:
我正在创建一个服务 (ReST),它会一直启动并运行。所以在这个服务中,我从我的 spring 上下文中调用 init 方法,该方法命中数据库并将所需的数据加载到 hazelcast 实例中。
现在我必须确保通过调用 init 方法来刷新 hazelcast 实例。假设刷新周期是每 6 小时一次。
有没有很好的干净方法来实现这一点?
【问题讨论】:
我正在创建一个服务 (ReST),它会一直启动并运行。所以在这个服务中,我从我的 spring 上下文中调用 init 方法,该方法命中数据库并将所需的数据加载到 hazelcast 实例中。
现在我必须确保通过调用 init 方法来刷新 hazelcast 实例。假设刷新周期是每 6 小时一次。
有没有很好的干净方法来实现这一点?
【问题讨论】:
这可以通过实现 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
}
}
让我知道这是否有意义。
【讨论】:
MapEvictedListener 和MapClearedListener。
您可以使用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>
...
或者你可以在添加数据到cache map的时候加上时间,指定的时间过后,特定的cache map也可以清空了。
【讨论】: