Ehcache更新元素值而不改变他的timetolive

时间:2016-06-22 06:35:28

标签: java caching ehcache

我正在尝试将我的Cache中每个元素的àtimeToLive设置为60 seconde,以便我这样做:

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借调后过期?

目标是检查尝试是否等于阈值,以及我是否无法从缓存中获取元素。

我对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>

在控制台中,我可以看到创建时间和到期时间总是在变化

  

尝试:59,创建时间为:1466576506096,到期时间为:1466576566096   尝试:60,创建时间为:1466576507096,到期时间为:1466576567096   尝试:61,创建时间为:1466576508096,到期时间为:1466576568096   尝试:62,创建时间为:1466576509096,到期时间为:1466576569096   尝试:63,创建时间为:1466576510097,到期时间为:1466576570097   尝试:64,创建时间为:1466576511097,到期时间为:1466576571097   尝试:65,创建时间为:1466576512097,到期时间为:1466576572097

1 个答案:

答案 0 :(得分:1)

每次将一个元素放入缓存中时,都会将其设置为60秒的生存时间。该级别的 new put update 之间没有区别。因此,在放置/更新之后,您总是告诉值60秒过期。

根据您的描述,您的putElementInCache方法需要采用第四个参数,该参数是您可以根据您从缓存中检索的先前Element计算的剩余过期时间,具体取决于{之间的差异{1}}和现在