Я пытаюсь создать 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
, когда достигается maxNodes
. Когда я положил LRUPolicy
обратно, я заметил, что сам региональный узел фактически вытесняется и получает тег unitialized
, но 100 последних использованных дочерних элементов все еще остаются.
Как я могу предотвратить выселение самого региона? Есть ли лучший способ выполнить удаление вместо выселения, не отделяя выселение от истечения срока?
Я использую jboss-cache версии 1.3.0.SP4.