CacheApi не возражает против конфигурации EhCache для timeToIdle

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


person jtyb    schedule 21.10.2016    source источник


Ответы (1)


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

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

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

person Louis Jacomet    schedule 22.10.2016