2016-10-21 4 views
1

Я устанавливаю кеш в 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).

ответ

0

Я могу только подтвердить, что это поведение абстракции Cache в режиме воспроизведения с использованием Ehcache.

Если вы явно не определить срок действия Duration при вводе записей в Cache, отображения сконфигурированы так, чтобы вечна на уровне отображения. Это означает, что любая конфигурация истечения уровня Cache фактически игнорируется, поскольку отображения всегда будут указывать настройку для каждого сопоставления.

Заметим также, что Play предлагает только поддержку времени к проживанию/TTL, не времени в режиме холостого хода/TTI который я считаю, это хорошая вещь, потому что TTI действительно ближе к управлению мощностью, чем свежесть.

Смежные вопросы