2010-12-17 73 views
1

我們非常簡單地使用JCS。不分配或什麼的,簡單地說:JCS通知到期/刪除

JCS jcs = JCS.getInstance("region-name"); 

我嘗試註冊某種當一個元素被刪除或從緩存過期,可以用來接收通知/事件監聽器......

我一直在挖掘JCS javadoc一段時間,我試過了: - 將IElementEventHandler的實現添加到緩存的默認ElementAttributes中......它永遠不會被調用。 - 使用ICacheObserver的各種實現來註冊ICacheListener,但是永遠不會被調用。我不一定非常肯定這一點是正確的方式,因爲我認爲這是爲了更高級的JCS使用...

有誰知道如何(或者如果有可能)註冊某種類型的監聽器/ obsverver /會做什麼?我的最終目標是能夠得知何時從緩存中刪除了某些內容......我並不特別關心如何提供它不是一個大規模的混亂:P

回答

0

從我可以告訴之後對JCS源代碼的簡短回顧,它看起來像那些接口只與遠程緩存有關 - 我從來沒有用過。另外,我檢查了LRUMemoryCache和其他幾個,看起來去除的調用沒有鏈接到任何事件處理程序。長話短說,我無法在JCS中找到任何你想要的東西。

我不會說這是不可能的,但我會說它看起來不太可能。

您可以查看來源here並進一步瞭解。

祝你好運。

+0

這就是我來跟我挖了同樣的結論... :(謝謝確認。 – arw 2010-12-20 16:14:36

0

創建一個抽象類,用於註冊您感興趣的事件。這對我來說能夠捕捉到這兩個事件。

private static final Set<Integer> EVENTS = new HashSet<Integer>(); 
    { 
    EVENTS.add(IElementEventHandler.ELEMENT_EVENT_EXCEEDED_IDLETIME_BACKGROUND); 
    EVENTS.add(IElementEventHandler.ELEMENT_EVENT_EXCEEDED_MAXLIFE_BACKGROUND); 
    } 

    @Override 
    public synchronized void handleElementEvent(IElementEvent event) { 
    // Check for element expiration based on EVENTS. 
    LOG.debug("Handling event of type : " + event.getElementEvent() + "."); 
    if (EVENTS.contains(event.getElementEvent())) { 
    ElementEvent elementEvent = (ElementEvent)event; 
    CacheElement element = (CacheElement)elementEvent.getSource(); 
    handleEvent(element); 
    } 

    } 
    // Abstract method to handle events 
    protected abstract void handleEvent(CacheElement element); 
    } 

這個抽象的事件處理程序添加到JCS工廠定義如下

 JCS jcs = JCSCacheFactory.getCacheInstance(regionName); 
    IElementAttributes attributes = jcs.getDefaultElementAttributes(); 
    attributes.addElementEventHandler(handler); 
    jcs.setDefaultElementAttributes(attributes);