2010-12-17 76 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);