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

Я пытаюсь получить из кэша только действительные объекты. если я сделаю 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);

}

Ответы [ 2 ]

1 голос
/ 14 декабря 2015

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

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

0 голосов
/ 16 января 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...