[jboss-user] [JBoss Cache] New message: "Re: How to manage empty data with a CacheLoader?"
Nicolas Filotto
do-not-reply at jboss.com
Wed Feb 10 05:39:43 EST 2010
User development,
A new message was posted in the thread "How to manage empty data with a CacheLoader?":
http://community.jboss.org/message/525362#525362
Author : Nicolas Filotto
Profile : http://community.jboss.org/people/nfilotto
Message:
--------------------------------------------------------------
To solve my issue I had to write a decorator on the top of the current CacheLoader in order to rewrite the methods corresponding to read operations. Since I load everything at startup, I can by-pass the CacheLoader call when the cache is started.
See below the code:
{code:java}
public class ControllerCacheLoader implements CacheLoader
{
/**
* The nested cache loader
*/
private final CacheLoader cl;
...
/**
* @see org.jboss.cache.loader.CacheLoader#exists(org.jboss.cache.Fqn)
*/
public boolean exists(Fqn name) throws Exception
{
if (cache.getCacheStatus() == CacheStatus.STARTING)
{
// Before calling the nested cache loader we first check if the data exists in the local cache
// in order to prevent multiple call to the cache store
NodeSPI<?, ?> node = cache.peek(name, false);
if (node != null)
{
// The node already exists in the local cache, so we return true
return true;
}
else
{
// The node doesn't exist in the local cache, so we need to check through the nested
// cache loader
return cl.exists(name);
}
}
// All the data is loaded at startup, so no need to call the nested cache loader for another
// cache status other than CacheStatus.STARTING
return false;
}
/**
* @see org.jboss.cache.loader.CacheLoader#get(org.jboss.cache.Fqn)
*/
public Map<Object, Object> get(Fqn name) throws Exception
{
if (cache.getCacheStatus() == CacheStatus.STARTING)
{
// Before calling the nested cache loader we first check if the data exists in the local cache
// in order to prevent multiple call to the cache store
NodeSPI node = cache.peek(name, false);
if (node != null)
{
// The node already exists in the local cache, so we return the corresponding data
return node.getDataDirect();
}
else
{
// The node doesn't exist in the local cache, so we need to check through the nested
// cache loader
return cl.get(name);
}
}
// All the data is loaded at startup, so no need to call the nested cache loader for another
// cache status other than CacheStatus.STARTING
return null;
}
/**
* @see org.jboss.cache.loader.CacheLoader#getChildrenNames(org.jboss.cache.Fqn)
*/
public Set<?> getChildrenNames(Fqn fqn) throws Exception
{
if (cache.getCacheStatus() == CacheStatus.STARTING)
{
// Try to get the list of children name from the nested cache loader
return cl.getChildrenNames(fqn);
}
// All the data is loaded at startup, so no need to call the nested cache loader for another
// cache status other than CacheStatus.STARTING
return null;
}
...
{code}
Se below the config
{code:xml}
<?xml version="1.0" encoding="UTF-8"?>
<jbosscache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:jboss:jbosscache-core:config:3.1">
..
<loaders passivation="false" shared="true">
<!-- All the data of the JCR locks needs to be loaded at startup -->
<preload>
<node fqn="/" />
</preload>
..
{code}
--------------------------------------------------------------
To reply to this message visit the message page: http://community.jboss.org/message/525362#525362
More information about the jboss-user
mailing list