Как избежать того, чтобы район JBoss-Cache не был выселен?

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

Кэш организован следующим образом:

/my_region
    /session_1
        /datanode_1
          attribute1: value1
        /datanode_2
          attribute2: value2
    /session_2
        ...
    /session_3
        ...
    ...
    ...

И моя конфигурация политики высева выглядит следующим образом:

<attribute name="EvictionPolicyClass">org.jboss.cache.eviction.LRUPolicy</attribute> 
<attribute name="EvictionPolicyConfig">
   <config>
      <attribute name="wakeUpIntervalSeconds">5</attribute>     
         <region name="/my_region">
     <attribute name="maxNodes">100</attribute>
     <attribute name="timeToLiveSeconds">1800</attribute>
        </region>
   </config>
</attribute>

Это работает: когда /my_region получает более 100 детей, младшие дети, которые были недавно использованы, выселяются, поэтому область сокращается до 100 детей.

Проблема с LRUPolicy заключается в том, что когда выведенные узлы имеют дочерние элементы, они не полностью удалены, но помечены jboss:internal:uninitialized: null вместо. Такое поведение имеет смысл для кэшируемых объектов, чтобы избежать их сбора из постоянного хранилища, но он не подходит для кэширования объектов, которые не сохраняются и больше никогда не будут доступны.

Итак, чтобы удалить узлы, я создал расширение LRUPolicy, которое переопределяет выселение с удалением.

@Override
public void evict(Fqn fqn) throws Exception {
    cache_.remove(fqn);
}

Эта новая политика не оставляет joss:internal:uninitialized: null позади, но удаляет /my_region node, когда достигается maxNodes. Когда я положил LRUPolicy назад, я заметил, что сама область node фактически выведена и получает тег unitialized, но все еще 100 последних детей все еще остаются.

Как я могу запретить выселение региона? Есть ли лучший способ сделать удаление вместо выселения без разделения выселения из истечения срока действия?

Я использую jboss-cache версии 1.3.0.SP4.

Ответ 2

Программно вы можете установить область кэша в качестве резидента:

this.cache.getNode(fqn).setResident(true);