【问题标题】:Hazelcast: How to refresh the Hazelcast Instance?Hazelcast:如何刷新 Hazelcast 实例?
【发布时间】:2016-06-03 12:29:44
【问题描述】:

我正在创建一个服务 (ReST),它会一直启动并运行。所以在这个服务中,我从我的 spring 上下文中调用 init 方法,该方法命中数据库并将所需的数据加载到 hazelcast 实例中。

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

有没有很好的干净方法来实现这一点?

【问题讨论】:

    标签: java hazelcast


    【解决方案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
        }
    }
    

    让我知道这是否有意义。

    【讨论】:

    【解决方案2】:

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

    &lt;time-to-live-seconds&gt;3600&lt;/time-to-live-seconds&gt;

    每 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也可以清空了。

    【讨论】:

    • 您好 Sandeep,感谢您的回复。我确实知道这一点,即使用配置 xml 配置 TTL 和驱逐策略等 hazelcast 属性,但我无法理解的是,如果地图内容已过期,那么它将如何调用 init 方法,然后重新加载地图。
    • 那件事需要在你的代码中处理。您的 Rest Api 方法将调用服务层方法,该方法将从 hazelcast 获取地图并将其返回。在将地图返回给调用方方法之前,请检查其是否为空。如果 null 表示 hazelcast 缓存为空,请调用您的 init 方法来加载数据并将其放入 hazelcast 然后返回。下次在 6 小时内调用,map 不会为空,因此不会进行 DB 调用,6 小时后缓存将被清理,并且您的 init mehtod 将基于空映射调用。如果有帮助,请告诉我
    • 谢谢桑迪普。这个想法很好。唯一的问题是在第 6 小时之后发生的特定请求的响应会很慢,因为该进程将开始访问数据库进行缓存。另一方面,我希望 hazelcast 有任何内置机制(如任何 Aware 类)以识别地图已变为空。
    • 不确定,如果支持或不支持此类功能,您可能可以通过 Hazelcast 文档查看。但是使用计划作业,您可以很容易地实现此行为,其中作业将在计划时间后运行,清除缓存并调用服务方法再次填充新数据。
    • 现在使用 Payara 5.192 和带有域发现的内置数据网格,与 hazelcast-config.xml 不兼容。因此看来我现在必须使用 MapListener。见stackoverflow.com/questions/58956155/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多