Using ExpirationAlgorithm in EvictionConfig not working in JBoss 5.1
temenosthofmann Nov 15, 2012 9:28 AMI'm using JBoss Cache Malagueta 3.2.5.GA in JBoss 5.1. There is a cache configuration without any eviction config:
<entry><key>prodb-expiration-cache</key>
<value>
<bean name="ProDBExpirationCacheConfig" class="org.jboss.cache.config.Configuration">
<property name="transactionManagerLookupClass">org.jboss.cache.transaction.JBossTransactionManagerLookup</property>
<property name="clusterName">${jboss.partition.name:DefaultPartition}-ProDBExpirationCache</property>
<property name="multiplexerStack">${jboss.default.jgroups.stack:udp}</property>
<property name="fetchInMemoryState">true</property>
<property name="nodeLockingScheme">MVCC</property>
<property name="isolationLevel">REPEATABLE_READ</property>
<property name="useLockStriping">false</property>
<property name="cacheMode">REPL_SYNC</property>
<property name="syncReplTimeout">17500</property>
<property name="lockAcquisitionTimeout">15000</property>
<property name="stateRetrievalTimeout">60000</property>
<property name="exposeManagementStatistics">true</property>
</bean>
</value>
</entry>
The eviction is configured dynamically, and following entries are put into the cache: Key_1=value_1, Key_2=value_2,Key_3=value_3
CacheManager cacheManager = com.bspartners.util.ServiceLocator.getCacheManager();
Cache expirationCache = cacheManager.getCache("prodb-expiration-cache", true);
Node rootNode = expirationCache.getRoot();
Fqn cacheFqn = Fqn.fromString("/OTTO");
Region region = expirationCache.getRegion(cacheFqn, true);
ExpirationAlgorithmConfig expirationAlgorithmConfig = new ExpirationAlgorithmConfig();
expirationAlgorithmConfig.setExpirationKeyName(ExpirationAlgorithmConfig.EXPIRATION_KEY);
EvictionRegionConfig erc = new EvictionRegionConfig(cacheFqn, expirationAlgorithmConfig);
region.setEvictionRegionConfig(erc);
EvictionConfig evictionConfig = new EvictionConfig();
List<EvictionRegionConfig> ercs = new ArrayList<EvictionRegionConfig>();
ercs.add(erc);
evictionConfig.setEvictionRegionConfigs(ercs);
evictionConfig.setWakeupInterval(500);
expirationCache.getConfiguration().setEvictionConfig(evictionConfig);
Node cacheNode = rootNode.getChild(cacheFqn);
Long future = new Long(System.currentTimeMillis() + 10000);
// put value into cache
Fqn keyFqn = Fqn.fromElements("key_1");
cacheNode.addChild(keyFqn).put(ExpirationAlgorithmConfig.EXPIRATION_KEY, future);
cacheNode.getChild(keyFqn).put("key_1", "value_1");
keyFqn = Fqn.fromElements("key_2");
cacheNode.addChild(keyFqn).put(ExpirationAlgorithmConfig.EXPIRATION_KEY, future);
cacheNode.getChild(keyFqn).put("key_2", "value_2");
keyFqn = Fqn.fromElements("key_3");
cacheNode.addChild(keyFqn).put(ExpirationAlgorithmConfig.EXPIRATION_KEY, future);
cacheNode.getChild(keyFqn).put("key_3", "value_3");
Thread.sleep(15000);
// get value from cache -> should be evicted because value is expired!
Object value = rootNode.getChild(cacheFqn).getChild(Fqn.fromElements("key_1)).get("key_1");
After getting the value for key "key_1" after 15 seconds there is the value in the cache. The expiration or the eviction respectively did not start.
The RegionManager in JBoss web-console dumps the region. Why is evitionQueueSize 0?
Region RegionImpl{fqn=/OTTO; classloader=null; status=ACTIVE; eviction=true; evictionQueueSize=0}
Dumping the cache in JBoss web-console lists
--- Cache1 ---
/ null
/OTTO null
/key_2 {expiration=1352982716472, key_2=value_2}
/key_0 {expiration=1352982716472, key_0=value_0}
/key_1 {expiration=1352982716472, key_1=value_1}
------------