Ehcache, как удалить ключи, когда срок действия элемента истек?

Я пытаюсь получить только действительные объекты из кеша. если я сделаю List list = cache.getKeys();, он также вернет ключи, срок действия которых истек. Я хотел добавить слушателя и попытаться удалить ключ самостоятельно, но мой слушатель notifyElementExpired никогда не вызывается.

Вот мой код:

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 arg0, 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);

}

person Sebastien Dionne    schedule 08.07.2011    source источник


Ответы (2)


Прежде чем получить количество ключей из кеша, вы можете удалить элементы с истекшим сроком действия, как показано ниже. cache.evictExpiredElements();

Таким образом, вы будете получать только активные ключи.

person Sathish T    schedule 14.12.2015

Я добавил ваш код слушателя в свой кеш. И заметил, что событие elementExpired срабатывает, когда я пытаюсь получить элемент из кеша. Таким образом, это ленивое действие или действие по требованию.

Вы можете использовать метод .getKeysWithExpiryCheck() для удаления просроченных элементов из списка.

person coms    schedule 16.01.2012