2011-07-08 13 views
5

キャッシュから有効なオブジェクトだけを取得しようとしています。 List list = cache.getKeys();を実行すると、期限切れのキーも返されます。私はリスナーを追加して自分自身でキーを削除しようとしましたが、リスナーnotifyElementExpiredは決して呼び出されません。私はキャッシュにリスナーのコードを追加しましたEhcache要素が期限切れになったときにキーを削除する方法?

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

} 

答えて

0

は、ここに私のコードです。そして、私がキャッシュから要素を取得しようとすると、elementExpiredイベントが発生することに気づいた。だから、怠惰な、またはオンデマンドのアクションです。

.getKeysWithExpiryCheck()メソッドを使用すると、期限切れの要素をリストから削除できます。

1

キャッシュからキーの数を取得する前に、以下のように期限切れの要素を取り除くことができます。 cache.evictExpiredElements();

アクティブなキーのみが表示されます。

関連する問題