Я пытаюсь создать 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
, которое переопределяет evict с помощью remove.
@Override
public void evict(Fqn fqn) throws Exception {
cache_.remove(fqn);
}
Эта новая политика не оставляет позади joss:internal:uninitialized: null
, но удаляет узел /my_region
при достижении maxNodes
. Когда я положил LRUPolicy
обратно, я заметил, что сам узел региона фактически выселяется и получает тег unitialized
, но 100 последних использованных потомков все еще остаются.
Как я могу предотвратить выселение самого региона? Есть ли какой-нибудь лучший способ сделать удаление вместо выселения, не отделяя выселение от истечения ?
Я использую jboss-cache версии 1.3.0.SP4.