2012-08-06 6 views
6

私は、スタンドアロン環境でSpring3.1を使用しています。 @Cachableアノテーションを使用してエントリをキャッシュしています。キャッシュエントリを反復する方法

特定の値(キーではない)を取得するために、キャッシングリストを繰り返し処理する必要がある場合があります。

私はキャッシュされたリストを取得することができましたが、それをどのように反復することができますか?

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

私はehcacheメカニズムを使用しています。

<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" /> 

ありがとう、 ray。

答えて

12

CacheManager.getCache()は、反復処理できるキャッシュキーのリストを返すgetKeys()メソッドを持つnet.sf.ehcache.Cacheを返します。格納されている実際のオブジェクトを取得するには(wrapped net.sf.ehcache.Elementとは対照的に)、Element.getObjectValue()を使用します。

編集: Spring it doesn't look like they will ever support Cache.getKeys()によると、基本プロバイダにキャストする必要があります。

このような何か:

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

しかし、私はcache.getKeys()メソッドを持っていけません。 org.springframework.cache.Cacheを使用しています – rayman

+0

解決策は見つかりましたか? infinispanキャッシュを反復処理する方法。私は鍵が必要です。 –

+1

基礎となるプロバイダにキャストしましたか? –

関連する問題