2012-08-06 14 views
6

Ich benutze Spring3.1 in Standalone Env. Ich speichere meinen Eintrag mit @Cachable Annotation.Wie auf einen Cache-Einträge Iterieren

Manchmal muss ich auf die Zwischenspeicherungsliste iterieren, um spezifischen Wert (nicht Schlüssel) zu bekommen.

So gelang es mir, die zwischengespeicherte Liste abzurufen, aber wie konnte ich iterate auf seine Elemente.

private ClientDTO getClientDTOByClientId(Integer clientId) 
{ 

    Cache clientCache = null; 
    try 
    { 
     clientCache = ehCacheCacheManager.getCache("client"); 

      //need here to iterate on clientCache. how? 


    } 
    catch (Exception e) 
    { 
     log.error("Couldnt retrieve client from cache. clientId=" + clientId); 
    } 
    return clientDTO; 
} 

Ich benutze ehcache Mechanismus.

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager" 
     p:cache-manager-ref="ehcache" /> 

    <bean id="ehcache" 
     class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" 
     p:config-location="classpath:ehcache.xml" /> 

danke, ray.

Antwort

12

CacheManager.getCache() gibt einen net.sf.ehcache.Cache zurück, der über eine getKeys() -Methode verfügt, die eine Liste von Cache-Schlüsseln zurückgibt, über die Sie iterieren können. Verwenden Sie das Element.getObjectValue(), um das tatsächliche Objekt abzurufen, das (im Gegensatz zu dem Wrapped net.sf.ehcache.Element) gespeichert worden ist.

EDIT: Nach Spring it doesn't look like they will ever support Cache.getKeys(), so müssen Sie auf den zugrunde liegenden Anbieter zu werfen.

Etwas wie folgt aus:

public boolean contains(String cacheName, Object o) { 
    net.sf.ehcache.EhCache cache = (net.sf.ehcache.EhCache) org.springframework.cache.CacheManager.getCache(cacheName).getNativeCache(); 
    for (Object key: cache.getKeys()) { 
    Element element = cache.get(key); 
    if (element != null && element.getObjectValue().equals(o)) { 
     return true; 
    } 
    } 
    return false; 
} 
+2

aber ich nicht cache.getKeys haben() -Methode. Ich benutze org.springframework.cache.Cache – rayman

+0

Haben Sie irgendeine Lösung gefunden? Wie man über Infinispan Cache iteriert. Ich brauche Schlüssel. –

+1

Wurden Sie zum zugrunde liegenden Anbieter umgewandelt? –