Я устанавливаю кеш в play framework 2.5.6 и борется с свойством timeToIdle.CacheApi не против конфигурации EhCache для timeToIdle
Моя конфигурация следует один, представленную в официальном documentation
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, если установлен вечный, для всего кеша ttl и tti больше не имеет значения. Из кодов я вижу, что если вечна установлен для Element
, 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.
[обновление]
забыть, что я изменил в ходе тестирования конф и удалены на момент вечной собственности от. Но все тесты, которые я сделал до того, как доказали, что либо установлено, либо нет, вечное свойство всегда истинно (как это происходит из кодов playCache).