Я пытаюсь создать кеш 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.