Я устанавливаю кеш в игровой среде 2.5.6 и борюсь со свойством timeToIdle.
Моя конфигурация соответствует конфигурации, представленной в официальной документации.
conf/ehcache.xml:
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="false"
monitoring="autodetect" dynamicConfig="true">
<diskStore path="java.io.tmpdir" />
<cache name="userSession"
maxEntriesLocalHeap="100000"
maxEntriesLocalDisk="10000"
eternal="false"
diskSpoolBufferSizeMB="30"
memoryStoreEvictionPolicy="LRU"
timeToIdleSeconds="3"
transactionalMode="off">
<persistence strategy="localTempSwap" />
</cache>
</ehcache>
conf/application.conf:
play.cache {
bindCaches = ["userSession"]
createBoundCaches = false
}
В коде я получаю кеш путем инъекции с помощью @Inject @NamedCache("userSession")
.
Кэш вводится и его можно использовать, но из того, что я наблюдаю, timeToIdleInSeconds не используется.
Моя конфигурация наверняка разрешена, потому что в журналах я могу найти:
2016-10-21 11:46:46,086 DEBUG n.s.e.config.ConfigurationFactory ForkJoinPool-1-worker-1 [] - Configuring ehcache from URL: file:/src/LR/lr-facade/target/scala-2.11/classes/ehcache.xml
Я пытался отлаживать коды и обнаружил, что в игровой реализации EhCache есть:
play-cache_2.11-2.5.6-sources.jar!/play/api/cache/Cache.scala
:
def set(key: String, value: Any, expiration: Duration) = {
val element = new Element(key, value)
expiration match {
case infinite: Duration.Infinite => element.setEternal(true)
case finite: FiniteDuration =>
val seconds = finite.toSeconds
if (seconds <= 0) {
element.setTimeToLive(1)
} else if (seconds > Int.MaxValue) {
element.setTimeToLive(Int.MaxValue)
} else {
element.setTimeToLive(seconds.toInt)
}
}
cache.put(element)
}
Как видите, если я не укажу, для ttl eternal
будет установлено значение true. Из того, что я прочитал в EhCache docs, если установлено значение ever , для всего кеша ttl и tti больше не имеют значения. Из кодов я вижу, что если для Element
установлено значение ever, то для tti
и ttl
установлено значение 0
:
ehcache-core-2.6.11-sources.jar!/net/sf/ehcache/Element.java
:
public void setEternal(final boolean eternal) {
if (eternal) {
this.cacheDefaultLifespan = false;
this.timeToIdle = 0;
this.timeToLive = 0;
} else if (isEternal()) {
this.cacheDefaultLifespan = false;
this.timeToIdle = Integer.MIN_VALUE;
this.timeToLive = Integer.MIN_VALUE;
}
}
У кого-нибудь была такая же проблема? Кто-нибудь нашел решение для него?
Конечно, я знаю, что могу решить эту проблему, установив временную метку в кеше и проверив, истекает ли срок ее действия с помощью myslef.
[Обновить]
забудьте, что я изменил во время тестирования conf и удалил на мгновение вечное свойство из . Но все тесты, которые я сделал ранее, доказали, что либо это установлено, либо нет, вечное свойство всегда верно (как оно исходит из кодов playCache).