当充满乐趣的时间到期时做点什么[infinispan]

nil*_*n59 3 java jboss caching infinispan

介绍

这是关于infinispan缓存,但我认为这是一个通用的问题.

在我的infinispan缓存中,我使用putIfAbsent方法将项目输入缓存,并使用remove方法删除它们.(jboss doc here)

基本行为

我可以将项目放入缓存中,并使用id从缓存中删除项目.但是,如果我没有明确删除缓存项,infinispan将在指定的生命周期传递后自动删除它.

在我的删除方法中,我删除之前运行一些自定义代码.但是当我没有调用remove方法时,由于提供的生命周期到期,infinispan会删除缓存条目.

在自动删除方案中,我无法运行自定义代码,因为它发生在引擎盖下.(通过infinispan).那可能的方法是什么?以下代码将更有希望地解释这一点.

我相信我很清楚.请给我一些见解.谢谢.

void putToCache(String id){
   myCache.putIfAbsent(id,value,LIFESPAN_DURATION,timeUnit);
}

void removeFromCache(String id){
  //MY CUSTOM CODE - WANT TO RUN THIS IN LIFE SPAN DURATION EXPIRY ALSO
   myCache.remove(id);
}
Run Code Online (Sandbox Code Playgroud)

Mud*_*man 5

在进入答案之前,我想在驱逐和到期之间澄清.

赶出

驱逐是指从内存容器中删除条目,因为它超出了配置的最大大小(max-entries).驱逐只能在配置时启用,并且不会在运行时控制,到期时可以,请参见此处.请注意,如果您已经配置了一个条目,则驱逐永远不会从商店中删除条目,因此如果您不想要,则不会因为太多而丢失条目.

Infinispan 7和更早的版本有一个你已经找到的Eviction监听器,所引发的事件就是这个.

呼气

到期定义在一段不活动或设定的持续时间后删除的条目.这可以通过配置进行配置,也可以像在示例中一样使用API​​覆盖配置的值.

现在回答您的问题,在Infinispan 8中添加了Infinispan Expiration事件.此处详细介绍.请注意,一个重要的部分是,对于即将到期的键,锁定到期事件(除非您的侦听器被定义为异步).这对于保证正确的订购非常重要.

此外,您应该记住,到期事件不能保证在条目到期时准确触发.而是仅在访问所述过期条目时或者如果到期收割者线程找到过期条目时才触发该事件.到期收割机默认为每分钟运行一次,您可以通过更改到期间隔配置设置来禁用此功能或更改时间.