JCS在过期/删除时通知

时间:2010-12-17 18:07:53

标签: java notify jcs

我们非常简单地使用JCS。不分发或任何东西,简单地说:

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

我正在尝试注册某种类型的侦听器,当某个元素从缓存中删除或过期时,该侦听器可用于接收通知/事件...

我一直在挖掘JCS javadoc一段时间了,我尝试过: - 将IElementEventHandler的实现添加到缓存的默认ElementAttributes ......它永远不会被调用。 - 使用ICacheObserver的各种实现注册ICacheListener,但永远不会被调用。我不一定确定这一点是正确的做法,因为我认为这是用于JCS的更高级用途......

是否有人知道如何(或者是否可能)注册某种听众/障碍者/任何可以实现此目的的人?我的最终目标是能够被告知什么时候基本上从缓存中删除了什么......我并不特别关心如何提供它不是一个巨大的kludge:P

2 个答案:

答案 0 :(得分:0)

通过对JCS源的简短回顾后我可以看出,看起来这些接口只与远程缓存相关联 - 我从未使用过。另外,我检查了LRUMemoryCache和其他几个,看起来删除的调用没有链接到任何事件处理程序。长话短说,我在JCS中找不到任何符合你要求的东西。

我不会说这是不可能的,但我认为这看起来不太可能。

您可以查看来源here并进一步了解。

祝你好运。

答案 1 :(得分: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);