Ehcache how to remove keys when element is expired?
I'm trying to get only valid objects from the cache. if I do List list = cache.getKeys();
it will return keys that are expired too. I though of adding a listener and try to remove the key myself, but my listener notifyElementExpired
is never called.
Here is my code:
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
CacheManager.getInstance().addCache("test");
Cache cache = CacheManager.getInstance().getCache("test");
cache.getCacheConfiguration().setTimeToLiveSeconds(10);
cache.getCacheEventNotificationService().registerListener(new CacheEventListener() {
public void notifyRemoveAll(Ehcache arg0) {
// TODO Auto-generated method stub
System.out.println("notifyRemoveAll cache=" + arg0);
}
public void notifyElementUpdated(Ehcache arg0, Element arg1)
throws CacheException {
// TODO Auto-generated method stub
System.out.println("notifyElementUpdated cache=" + arg0 + " element=" + arg1);
}
public void notifyElementRemoved(Ehcache ar开发者_StackOverflowg0, Element arg1)
throws CacheException {
// TODO Auto-generated method stub
System.out.println("notifyElementRemoved cache=" + arg0 + " element=" + arg1);
}
public void notifyElementPut(Ehcache arg0, Element arg1)
throws CacheException {
// TODO Auto-generated method stub
System.out.println("notifyElementPut cache=" + arg0 + " element=" + arg1);
}
public void notifyElementExpired(Ehcache arg0, Element arg1) {
// TODO Auto-generated method stub
System.out.println("notifyElementExpired cache=" + arg0 + " element=" + arg1);
}
public void notifyElementEvicted(Ehcache arg0, Element arg1) {
// TODO Auto-generated method stub
System.out.println("notifyElementEvicted cache=" + arg0 + " element=" + arg1);
}
public void dispose() {
// TODO Auto-generated method stub
System.out.println("dispose");
}
public Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException();
}
});
//cache.getCacheConfiguration().setTimeToLiveSeconds(0);
String key = "key";
String value = "value1";
System.out.println("created at = " + new Date());
//cache.put(new Element(key, value, false, new Integer(1), new Integer(5)));
cache.put(new Element(key, value, false, new Integer(1), new Integer(5)));
System.out.println("key=" + key + "will expired at object=" + new Date(cache.get(key).getExpirationTime()));
Thread.sleep(7000);
@SuppressWarnings("unchecked")
List list = cache.getKeys();
System.out.println("current time = " + new Date());
for (Object item : list) {
System.out.println("created at = " + new Date());
//System.out.println("key=" + item + " object=" + new Date(cache.get(item).getExpirationTime()));
//System.out.println(item + " isExpired=" + cache.get(item).isExpired());
}
Thread.sleep(30000);
}
Before getting the count of keys from cache, you can evict the expired elements like below. cache.evictExpiredElements();
So that, you will be getting only active keys.
I've added your listener code to my cache. And noticed that elementExpired
event fire when I try to get element from cache. So it's lazy or on-demand action.
You can use .getKeysWithExpiryCheck()
method to remove expired elements from list.
精彩评论