2011-07-08 34 views
5

Tôi đang cố gắng chỉ lấy các đối tượng hợp lệ từ bộ nhớ cache. nếu tôi làm List list = cache.getKeys();, nó cũng sẽ trả lại các khóa đã hết hạn. Tôi mặc dù thêm một người nghe và cố gắng để loại bỏ chìa khóa bản thân mình, nhưng người nghe của tôi notifyElementExpired không bao giờ được gọi.Ehcache cách xóa khóa khi phần tử hết hạn?

Đây là mã của tôi:

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

} 

Trả lời

0

Tôi đã thêm mã listener của bạn để bộ nhớ cache của tôi. Và nhận thấy rằng elementExpired sự kiện cháy khi tôi cố gắng lấy phần tử từ bộ nhớ cache. Vì vậy, đó là hành động lười hoặc theo yêu cầu.

Bạn có thể sử dụng phương thức .getKeysWithExpiryCheck() để xóa các phần tử đã hết hạn khỏi danh sách.

1

Trước khi nhận số lượng khóa từ bộ nhớ cache, bạn có thể gỡ bỏ các thành phần đã hết hạn như dưới đây. cache.evictExpiredElements();

Vì vậy, bạn sẽ chỉ nhận được các phím hoạt động.

Các vấn đề liên quan