我正在創建一個服務(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類)以確定地圖已變空。 –