2014-02-27 79 views
7

我正在使用Infinispan緩存。有什麼辦法在運行時獲得TTL(或lifepsan)條目嗎?我認爲作爲一個getLifespan() API接口CacheEntry,但我不知道怎麼去CacheEntry接口上的手柄,在運行時使用infinispan獲取TTL

感謝

+0

你有沒有嘗試我的答案。請讓我知道如果它不工作。 – Braj

回答

6

爲了得到壽命爲整個高速緩存的配置,你可以使用:

cache.getCacheConfiguration().expiration().lifespan(); 

,並獲得特定條目的壽命,你可以使用:

cache.getAdvancedCache().getCacheEntry("key").getLifespan(); 

希望幫助!

+0

謝謝,但我只能看到AdvanceCache上的getEntry(Object,EnumSet,ClassLoader)。任何其他想法? –

+1

如果您使用Infinispan <5.3,getCacheEntry(K key)實際上不存在,但getCacheEntry(key,null,null)應檢索相同的結果。 –

2

每個高速緩存條目包含以下信息:

  • 上次使用
  • 交費
  • 到期時間

Expiry Time = Max Idle + Last Used

使用該信息來獲得各的壽命緩存條目。

方法CacheEntry.getLifeSpan()未按預期工作,檢索此條目的使用壽命。它返回-1意味着無限的使用壽命。

這裏是一個示例代碼:

import org.infinispan.Cache; 
import org.infinispan.configuration.cache.CacheMode; 
import org.infinispan.configuration.cache.ConfigurationBuilder; 
import org.infinispan.container.entries.CacheEntry; 
import org.infinispan.container.entries.TransientCacheEntry; 
import org.infinispan.manager.DefaultCacheManager; 
import org.infinispan.manager.EmbeddedCacheManager; 

public class InfinispanTTL { 

    public static void main(String[] args) throws InterruptedException { 
     System.out.println("start"); 

     ConfigurationBuilder confBuilder = new ConfigurationBuilder(); 
     // confBuilder.eviction().strategy(EvictionStrategy.NONE).maxEntries(3); 
     confBuilder.expiration().lifespan(5000); 
     confBuilder.clustering().cacheMode(CacheMode.LOCAL); 

     EmbeddedCacheManager cacheManager = new DefaultCacheManager(confBuilder.build()); 
     cacheManager.start(); 

     Cache<String, CacheEntry> sessionCache = cacheManager.getCache("session"); 
     System.out.println("Strategy used by container=" 
       + sessionCache.getCacheConfiguration().eviction().strategy()); 
     System.out.println("Lifespan of container=" 
       + sessionCache.getCacheConfiguration().expiration().lifespan()); 

     TransientCacheEntry cacheEntry = new TransientCacheEntry("a", "1", 1000, 2000); 

     System.out.println("Expiry Time = Max Idle + Last Used"); 
     System.out.println("Max Idle=" + cacheEntry.getMaxIdle()); 
     System.out.println("Last Used=" + cacheEntry.getLastUsed()); 
     System.out.println("Expiry Time=" + cacheEntry.getExpiryTime()); 

     sessionCache.put("a", cacheEntry); 

     System.out.println("Expirt Time from session cache=" 
       + ((TransientCacheEntry) sessionCache.get("a")).getExpiryTime()); 
     System.out.println("Old value=" + sessionCache.get("a").getValue()); 
     System.out.println("Set value"); 
     sessionCache.get("a").setValue("3"); 
     System.out.println("New value=" + sessionCache.get("a").getValue()); 

     System.out.println("Expirt Time from session cache=" 
       + ((TransientCacheEntry) sessionCache.get("a")).getExpiryTime()); 
     System.out.println("finish"); 
    } 

} 

輸出:

Strategy used by container=NONE 
Lifespan of container=5000 
Expiry Time = Max Idle + Last Used 
Max Idle=1000 
Last Used=2000 
Expiry Time=3000 
Life span from session cache=-1 
Expiry Time from session cache=3000 
Old value=1 
Set value 
New value=3 
Expiry Time from session cache=3000