[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