Java Hazelcast:如何刷新Hazelcast实例?

Java Hazelcast:如何刷新Hazelcast实例?,java,hazelcast,Java,Hazelcast,我正在创建一个服务(ReST),它将一直启动并运行。因此,在这个服务中,我从我的spring上下文调用init方法,该方法访问数据库并将所需数据加载到hazelcast实例中 现在,我必须确保通过调用init方法刷新hazelcast实例。假设刷新周期为每6小时一次 有没有一个好的干净的方法来实现这一点?您可以用它来解决这个问题 3600 它每1小时清除一次地图内容,当收到任何请求时,它会从加载程序重新加载该地图内容 以下是Hazelcast地图配置之一 ... <!--

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

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

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

您可以用它来解决这个问题

3600

它每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
...
或者,您可以在向缓存映射添加数据时添加时间,在指定的时间之后,特定的缓存映射也可以是干净的。

您可以用于解决此问题

3600

它每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
...

或者您可以在向缓存映射添加数据时添加时间,在指定的时间之后,特定的缓存映射也可以是干净的。

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

IMap map=hzInstance.getMap(“mapName”);
addEntryListener(新的MyMapEventListener());
公共类MyMapEventListener实现EntryListener{
@凌驾
公共无效映射已清除(MapEvent MapEvent){
//在这里面进行初始化调用
}
@凌驾
public void mapReceived(MapEvent MapEvent){
//在这里面进行初始化调用
}
}

让我知道这是否有意义。

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

IMap map=hzInstance.getMap(“mapName”);
addEntryListener(新的MyMapEventListener());
公共类MyMapEventListener实现EntryListener{
@凌驾
公共无效映射已清除(MapEvent MapEvent){
//在这里面进行初始化调用
}
@凌驾
public void mapReceived(MapEvent MapEvent){
//在这里面进行初始化调用
}
}

让我知道这是否合理。

你好,Sandeep,谢谢你的回复。我确实知道这一点,即使用配置xml配置hazelcast属性,如TTL和逐出策略,但我不明白的是,如果映射内容已过期,那么它将如何调用init方法,然后重新加载映射。这需要在代码中处理。您的RESTAPI方法将调用服务层方法,该方法将从hazelcast获取映射并返回它。在将映射返回给调用方方法之前,请检查其是否为null。如果null表示hazelcast缓存为空,则调用init方法加载数据并将其放入hazelcast,然后返回。下次在6小时内调用时,map将不为null,因此不会进行DB调用,6小时后缓存将被清除,并且将基于null map调用init方法。如果对汉克斯·桑德普有帮助,请告诉我。这个主意很好。唯一的问题是,对于特定的请求,响应速度会很慢,因为该进程将在6小时后开始访问数据库进行缓存。另一方面,我希望hazelcast是否有任何内置机制(如任何Aware类)来识别映射已变为空。对此不确定,如果支持或不支持此功能,您可以通过Hazelcast文档查看。但使用计划作业,您可以非常轻松地实现此行为,作业将在计划时间后运行,清除缓存并调用服务方法以再次填充新数据。立即使用Payara 5.192和内置的数据网格和域发现,这与hazelcast-config.xml不兼容。因此,我现在似乎必须使用MapListener。您好,Sandeep,谢谢您的回复。我确实知道这一点,即使用配置xml配置hazelcast属性,如TTL和逐出策略,但我不明白的是,如果映射内容已过期,那么它将如何调用init方法,然后重新加载映射。这需要在代码中处理。您的RESTAPI方法将调用服务层方法,该方法将从hazelcast获取映射并返回它。在将映射返回给调用方方法之前,请检查其是否为null。如果null表示hazelcast缓存为空,则调用init方法加载数据并将其放入hazelcast,然后返回。下次在6小时内调用时,map将不为null,因此不会进行DB调用,6小时后缓存将被清除,并且将基于null map调用init方法。如果对汉克斯·桑德普有帮助,请告诉我。这个主意很好。唯一的问题是,对于特定的请求,响应速度会很慢,因为该进程将在6小时后开始访问数据库进行缓存。另一方面,我希望hazelcast是否有任何内置机制(如任何Aware类)来识别映射已变为空。对此不确定,如果支持或不支持此功能,您可以通过Hazelcast文档查看。但使用计划作业,您可以非常轻松地实现此行为,作业将在计划时间后运行,清除缓存并调用服务方法以再次填充新数据。立即使用Payara 5.192和内置的数据网格和域发现,这与hazelcast-config.xml不兼容。因此,我现在似乎必须使用MapListener。请参阅。似乎已被弃用,取而代之的是MapListener:是。我们也可以使用
mapReceivedListener
MapClearedListener
。似乎已被弃用,取而代之的是MapListener:是。我们可以使用
MapReceivedListener