Echache 3.2.0 Не найден Store.Provider для обработки настроенных типов ресурсов [offheap, disk] исключение

Я недавно переключился с более старой реализации ehcache на версию 3.2, поэтому у меня есть следующий файл конфигурации xml для проекта:

<eh:config xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
  xmlns:eh='http://www.ehcache.org/v3'
  xsi:schemaLocation="http://www.ehcache.org/v3    
  http://www.ehcache.org/schema/ehcache-core-3.0.xsd">
<eh:persistence directory="C:\foo\bar\Cache-Persistence"/>
<eh:thread-pools> 
  <eh:thread-pool alias="defaultDiskPool" min-size="1" max-size="3"/>
</eh:thread-pools> 
<eh:disk-store thread-pool="defaultDiskPool"/>
<eh:cache-template name="PROC_REQTemplate">
  <eh:key-type>java.lang.String</eh:key-type>
  <eh:value-type>java.lang.String</eh:value-type>
  <eh:expiry>
    <eh:ttl>640</eh:ttl>
  </eh:expiry> 
  <eh:resources> 
    <eh:offheap unit="MB">500</eh:offheap>
    <eh:disk unit="GB" persistent="true">3</eh:disk>
  </eh:resources>
  <eh:disk-store-settings thread-pool="defaultDiskPool"/>
</eh:cache-template>
<eh:cache alias="proc_req_cache" uses-template="PROC_REQTemplate"/>
</eh:config> 

с показанной выше конфигурацией я получаю следующую трассировку исключений, которую я усекаю, чтобы сохранить немного места, но ясно показываю ошибку:

java.lang.IllegalStateException: No Store.Provider found to handle configured resource types [offheap, disk] from {org.ehcache.impl.internal.store.heap.OnHeapStore$Provider, org.ehcache.impl.internal.store.tiering.TieredStore$Provider, org.ehcache.impl.internal.store.offheap.OffHeapStore$Provider, org.ehcache.impl.internal.store.disk.OffHeapDiskStore$Provider}
at org.ehcache.core.internal.store.StoreSupport.selectStoreProvider(StoreSupport.java:80) ~[?:?]
at org.ehcache.core.EhcacheManager.getStore(EhcacheManager.java:440) ~[?:?]
at org.ehcache.core.EhcacheManager.createNewEhcache(EhcacheManager.java:311) ~[?:?]
at org.ehcache.core.EhcacheManager.createCache(EhcacheManager.java:260) ~[?:?]
at org.ehcache.core.EhcacheManager.init(EhcacheManager.java:567) ~[?:?]

Я думал, что в соответствии с текущей документацией 3.2 вы можете использовать любую комбинацию уровней хранения данных, но, видимо, это не тот случай, как показывает вышеуказанная ошибка. Так что...

  1. Я могу только заставить вышеупомянутую конфигурацию hown работать, если я закомментирую ресурс offheap и оставлю только диск, но не оба. Это нормально? что мне не хватает?
  2. Что касается версии 2.7.8, то в документации (см. Здесь ehcache-2.8-storage-options) упоминается BigMemory как хранилище offHeap, однако в ehcache-3.2.0.jar, если я правильно вижу, есть какая-то внутренняя карта для эта цель. Может ли указанная выше ошибка быть связана с тем, что я не включаю BigMemory в проект? Я думаю, нет, но было бы неплохо, если кто-то может уточнить?

Любая помощь будет принята с благодарностью. Заранее спасибо.

2 ответа

Решение

Проблема в том, что более высокий уровень кэширования (в настоящее время вне кэша) должен быть уровнем кэширования (наша терминология для почти кэширования). Прямо сейчас нет. Так что вам нужен уровень onheap, как только у вас появятся слои. Вот рабочая конфигурация.

Я также установил ehcache в качестве пространства имен по умолчанию, чтобы сделать XML более читабельным. И установить defaultThreadPool по умолчанию, чтобы вам не приходилось устанавливать его везде (и альтернативой является добавление <event-dispatch thread-pool="defaultDiskPool"/> потому что для отправки события нужен пул потоков, а по умолчанию не было).

<config xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
           xmlns='http://www.ehcache.org/v3'
           xsi:schemaLocation="http://www.ehcache.org/v3
  http://www.ehcache.org/schema/ehcache-core-3.0.xsd">

    <persistence directory="C:\foo\bar\Cache-Persistence"/>

    <thread-pools>
        <thread-pool alias="defaultDiskPool" min-size="1" max-size="3" default="true"/>
    </thread-pools>

    <cache-template name="PROC_REQTemplate">
        <key-type>java.lang.String</key-type>
        <value-type>java.lang.String</value-type>
        <expiry>
            <ttl>640</ttl>
        </expiry>
        <resources>
            <heap unit="entries">1</heap>
            <offheap unit="MB">500</offheap>
            <disk unit="GB" persistent="true">3</disk>
        </resources>
    </cache-template>

    <cache alias="proc_req_cache" uses-template="PROC_REQTemplate"/>
</config>

Короче говоря, в настоящее время нет поддержки наличия уровня диска только с уровнем offheap. Текущая поддержка Ehcache 3.x для многоуровневого уровня требует наличия кучи в тот момент, когда вы хотите иметь несколько уровней.

Поддерживаемая комбинация в этот день (Ehcache 3.1.x и выше):

  • куча или внешняя куча или диск или кластер (один уровень)
  • куча + вне куча
  • куча + диск
  • куча + offheap + диск
  • куча + кластерный
  • куча + offheap + кластеризованный

Ошибка не имеет ничего общего с BigMemory который был коммерческим предложением поверх Ehcache 2.x.

Другие вопросы по тегам