2016-02-22 130 views
0

我正在創建一個服務(ReST),它可以隨時啓動並運行。所以在這個服務中,我從我的spring上下文中調用了init方法,該方法命中數據庫並將所需數據加載到hazelcast實例中。Hazelcast:如何刷新Hazelcast實例?

現在我必須確保通過調用init方法來刷新hazelcast實例。假設刷新週期是每6小時一次。

有沒有一個很好的乾淨的方式來實現這一目標?

回答

1

您可以使用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> 
... 

之一,您可以添加時間,而將數據添加到緩存地圖,指定的時間後,特定的緩存地圖也可以是乾淨的。

+0

嗨Sandeep,謝謝你的回覆。我確實知道這一點,即使用config xml配置像TTL這樣的hazelcast屬性和驅逐策略,但是我不明白的是如果映射內容過期,那麼它將如何調用init方法,然後重新加載映射。 –

+0

這件事需要在你的代碼中處理。您的Rest Api方法將調用服務層方法,該方法將從hazelcast獲取地圖並將其返回。在將地圖返回給調用方法之前,檢查它是否爲null。如果null表示hazelcast緩存爲空,請調用init方法加載數據並將其放入hazelcast,然後返回。下次在6小時內調用,映射將不會爲空,因此不會進行數據庫調用,6小時後緩存將被清理,並且您的init mehtod將根據空映射調用。請讓我知道它是否有幫助 – Sandeep

+0

謝謝Sandeep。這個想法很好。唯一的問題是,對於特定請求的響應速度會很慢,因爲該進程將在第6小時後開始觸發數據庫進行緩存。另一方面,我希望如果hazelcast有任何內置機制(就像任何Aware類)以確定地圖已變空。 –

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 
    } 
} 

讓我知道這是否合理。

+0

似乎已被棄用,並由MapListener取而代之:http://docs.hazelcast.org/docs/latest-development/manual/html/Distributed_Events/Event_Listener_for_Members/Listening_for_Map_Events.html –

+0

是的。我們也可以使用'MapEvictedListener'和'MapClearedListener'。 –