Failure to configure a cache with a TimeToLive expiration
mortenhattesen Apr 1, 2009 9:42 AMUsing JBoss Cache 3.0.3-GA, I have not been able to configure a simple cache with a "TimeToLive" expiration.
Firstly, whenever the eviction thread wakes up, a warning is logged:
WARN org.jboss.cache.eviction.ExpirationAlgorithm - No expiration key 'expiration' for Node: /
Secondly, no eviction is being performed.
The configuration is reproduced in this unit-test code (the production code has the cache wired up using a Spring IOC context configuration):
import static org.junit.Assert.assertEquals;
import org.apache.log4j.Logger;
import org.jboss.cache.Cache;
import org.jboss.cache.DefaultCacheFactory;
import org.jboss.cache.Node;
import org.jboss.cache.config.Configuration;
import org.jboss.cache.config.EvictionConfig;
import org.jboss.cache.config.EvictionRegionConfig;
import org.jboss.cache.eviction.ExpirationAlgorithmConfig;
import org.junit.Test;
public class TestJbossCacheConfig {
private static final Logger logger = Logger.getLogger(TestJbossCacheConfig.class);
final Cache<String, String> cache;
private final long TIME_TO_LIVE = 1000;
private Node<String, String> root;
public TestJbossCacheConfig() {
ExpirationAlgorithmConfig eac = new ExpirationAlgorithmConfig();
eac.setTimeToLive(TIME_TO_LIVE);
EvictionRegionConfig erc = new EvictionRegionConfig();
erc.setRegionName("/");
erc.setEvictionAlgorithmConfig(eac);
EvictionConfig ec = new EvictionConfig();
ec.setWakeupInterval(TIME_TO_LIVE / 2); //msec
ec.setDefaultEvictionRegionConfig(erc);
Configuration config = new Configuration();
config.setEvictionConfig(ec);
cache = new DefaultCacheFactory<String, String>().createCache(config);
root = cache.getRoot();
}
@Test
//@Ignore
public void testEviction() throws InterruptedException {
root.put("1", "one");
root.put("2", "two");
assertEquals("one", root.get("1"));
assertEquals(2, root.dataSize());
logger.info("Sleeps while eviction kicks in");
Thread.sleep(TIME_TO_LIVE * 2);
/*
* During sleep:
* "WARN org.jboss.cache.eviction.ExpirationAlgorithm - No expiration key 'expiration' for Node: /"
*/
/*
* java.lang.AssertionError: expected:<0> but was:<2>
*/
assertEquals(0, root.dataSize());
}
}What am I doing wrong here?
Another point: Although I know that JBoss cache is typically configured using an XML, or an IOC framework, it seems a little excessive to require four levels of nested configuration objects to configure a simple cache:
configuration = new Configuration(new EvictionConfig(new EvictionRegionConfig(new ExpirationAlgorithmConfig())))