2016-06-22 32 views
2

我想在我的缓存中的每个元素上设置的传输TimeToLive 60 Seconde系列做的,我做这样的:的Ehcache更新元素的值

private void putElementInCache(Cache cache, String key, Integer value) { 
    Element element = new Element(key, value); 
    element.setTimeToLive(60); 
    cache.put(element); 
} 

后,我检查我的钥匙在我的缓存中,如果它在这里,我想更新值。为此,我使用前面的函数,但是我的元素永远不会在60秒后过期。

要检查,我使用此代码

while (true) { 
     Element element = cache.get(key); 
     Integer attempts = (Integer) element.getObjectValue() + 1; 
     System.out.println("attemps : " + attempts + " and creation time is : " + element.getCreationTime() + " and expiration time is : " + element.getExpirationTime()); 
     putElementInCache(cache, key, attempts); 
     try { 
      Thread.sleep(1000); // Sleep 1 second 
     } catch (InterruptedException ie) { 
      Thread.currentThread().interrupt(); 
     } 
    } 

而且我从来没有NullPointerException异常。

如果我的睡眠时间大于timeToLive,我得到一个NullPointerException。

如何让我的元素在60秒后过期?

的目的是检查是否attemps等于阈值,如果我不能得到缓存元素摆在

我的Ehcache的全局配置是:

<defaultCache maxElementsInMemory="400000" eternal="true" overflowToDisk="false" memoryStoreEvictionPolicy="LRU"> 
    <cacheEventListenerFactory 
     class="net.sf.ehcache.distribution.jgroups.JGroupsCacheReplicatorFactory" 
     properties="replicateAsynchronously=true, replicatePuts=false, 
     replicateUpdates=false, replicateUpdatesViaCopy=false, replicateRemovals=true" /> 
    <bootstrapCacheLoaderFactory class="net.sf.ehcache.distribution.jgroups.JGroupsBootstrapCacheLoaderFactory" properties="bootstrapAsynchronously=false" /> 
</defaultCache> 

在控制台我可以看到,创建时间和过期时间随时改变

attemps:59和创建时间为:1466576506096和过期时间为:1466576566096个 attemps:60和CRE时间为:1466576507096,到期时间为:1466576567096 企图:61,创建时间为:1466576508096,到期时间为:1466576568096 企图:62,创建时间为:1466576509096,到期时间为:1466576569096 企图:63和创建时间是:1466576510097和过期时间为:1466576570097个 attemps:64和创建时间为:1466576511097和过期时间为:1466576571097个 attemps:65和创建时间为:1466576512097和过期时间为:1466576572097

回答

1

每次将一个元素放入缓存中,您将其设置为60秒的生存时间。 新投入更新在该级别没有区别。所以你总是告诉它在之后60秒的价值到期/更新。

鉴于你的描述,你的putElementInCache方法需要采取第四个参数是可以计算基于您从缓存中检索基于getExpirationTime现在的区别以前的Element剩余到期时间。

+0

谢谢你的回答。如果我理解它,我必须通过做这样的事情来获得剩余的到期时间:'Date remainingTime = new Date()。getTime() - element.getExpirationTime()'?我已经通过在缓存中添加一个对象作为值。此对象包含创建日期和它的生命结束日期,之后我可以将日期与其生命的结束日期进行比较。 –