1

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

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

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

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

有谁知道如何(或者如果可能的话)注册某种听众/观察者/任何可以实现这一目标的东西?我的最终目标是能够在基本上从缓存中删除某些内容时收到通知......我并不特别关心它如何不是一个巨大的混乱:P

4

2 回答 2

0

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

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

您可以在此处查看源代码并进一步查看。

祝你好运。

于 2010-12-17T21:11:02.630 回答
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);
于 2012-05-30T02:49:38.830 回答