FileDocCategorySizeDatePackage
DistributedTimedCachePolicy.javaAPI DocJBoss 4.2.112026Fri Jul 13 20:52:38 BST 2007org.jboss.ha.framework.server.util

DistributedTimedCachePolicy

public class DistributedTimedCachePolicy extends TimerTask implements org.jboss.util.CachePolicy
An implementation of a timed cache. This is a cache whose entries have a limited lifetime with the ability to refresh their lifetime. The entries managed by the cache implement the TimedCachePolicy.TimedEntry interface. If an object inserted into the cache does not implement this interface, it will be wrapped in a DefaultTimedEntry and will expire without the possibility of refresh after getDefaultLifetime() seconds. This is a lazy cache policy in that objects are not checked for expiration until they are accessed.
author
Scott Stark.
version
$Revision: 57188 $

Fields Summary
protected static Timer
resolutionTimer
protected static Logger
log
protected org.jboss.ha.framework.interfaces.DistributedState
entryMap
The map of cached TimedEntry objects.
protected String
category
protected String
partitionName
protected int
defaultLifetime
The lifetime in seconds to use for objects inserted that do not implement the TimedEntry interface.
protected long
now
The caches notion of the current time
protected int
resolution
The resolution in seconds of the cach current time
Constructors Summary
public DistributedTimedCachePolicy(String category, String partitionName, int defaultLifetime)
Creates a new TimedCachePolicy with the given default entry lifetime that does not synchronized access to its policy store and uses a 60 second resolution.


                                           
       
       
   
      this(category, partitionName, defaultLifetime, 0);
   
public DistributedTimedCachePolicy(String category, String partitionName, int defaultLifetime, int resolution)
Creates a new TimedCachePolicy with the given default entry lifetime that does/does not synchronized access to its policy store depending on the value of threadSafe.

param
category the name of the catetegory used in the DistributedState access calls.
param
partitionName the name of the HAPartition who's replicated state service will be used as the cache store.
param
defaultLifetime the lifetime in seconds to use for objects inserted that do not implement the TimedEntry interface.
param
resolution the resolution in seconds of the cache timer. A cache does not query the system time on every get() invocation. Rather the cache updates its notion of the current time every 'resolution' seconds.
see
DistributedState

      this.category = category;
      this.partitionName = partitionName;
      this.defaultLifetime = defaultLifetime;
      if( resolution <= 0 )
         resolution = 60;
      this.resolution = resolution;
   
Methods Summary
public voidcreate()
Initializes the cache for use. Prior to this the cache has no store.

      // Lookup the parition
      InitialContext ctx = new InitialContext();
      String jndiName = "/HAPartition/" + partitionName;
      HAPartition partition = (HAPartition) ctx.lookup(jndiName);
      this.entryMap = partition.getDistributedStateService();
      log.debug("Obtained DistributedState from partition="+partitionName);
      now = System.currentTimeMillis();
   
public longcurrentTimeMillis()
Get the cache time.

return
the cache time last obtained from System.currentTimeMillis()

      return now;
   
public voiddestroy()
Clears the cache of all entries.

   
public voidflush()
Remove all entries from the cache.

      Collection keys = entryMap.getAllKeys(category);
      // Notify the entries of their removal
      Iterator iter = keys.iterator();
      while( iter.hasNext() )
      {
         Serializable key = (Serializable) iter.next();
         TimedEntry entry = (TimedEntry) entryMap.get(category, key);
         entry.destroy();
      }
   
public java.lang.Objectget(java.lang.Object key)
Get the cache value for key if it has not expired. If the TimedEntry is expired its destroy method is called and then removed from the cache.

return
the TimedEntry value or the original value if it was not an instance of TimedEntry if key is in the cache, null otherwise.

      Serializable skey = (Serializable) key;
      TimedEntry entry = (TimedEntry) entryMap.get(category, skey);
      if( entry == null )
         return null;

      if( entry.isCurrent(now) == false )
      {   // Try to refresh the entry
         if( entry.refresh() == false )
         {   // Failed, remove the entry and return null
            entry.destroy();
            try
            {
               entryMap.remove(category, skey);
            }
            catch(Exception e)
            {
               log.debug("Failed to remove expired entry", e);
            }
            return null;
         }
      }
      Object value = entry.getValue();
      return value;
   
public intgetDefaultLifetime()
Get the default lifetime of cache entries.

return
default lifetime in seconds of cache entries.

      return defaultLifetime;
   
public voidinsert(java.lang.Object key, java.lang.Object value)
Insert a value into the cache. In order to have the cache entry reshresh itself value would have to implement TimedEntry and implement the required refresh() method logic.

param
key the key for the cache entry
param
value Either an instance of TimedEntry that will be inserted without change, or an abitrary value that will be wrapped in a non-refreshing TimedEntry.

      Serializable skey = (Serializable) key;
      TimedEntry entry = (TimedEntry) entryMap.get(category, skey);
      if( entry != null )
         throw new IllegalStateException("Attempt to insert duplicate entry");
      if( (value instanceof TimedEntry) == false )
      {   // Wrap the value in a DefaultTimedEntry
         Serializable svalue = (Serializable) value;
         entry = new DefaultTimedEntry(defaultLifetime, svalue);
      }
      else
      {
         entry = (TimedEntry) value;
      }

      entry.init(now);
      try
      {
         entryMap.set(category, skey, entry);
      }
      catch(Exception e)
      {
         log.error("Failed to set entry", e);
      }
   
public java.lang.Objectpeek(java.lang.Object key)
Get the cache value for key. This method does not check to see if the entry has expired.

return
the TimedEntry value or the original value if it was not an instancee of TimedEntry if key is in the cache, null otherwise.

      Serializable skey = (Serializable) key;
      TimedEntry entry = (TimedEntry) entryMap.get(category, skey);
      Object value = null;
      if( entry != null )
         value = entry.getValue();
      return value;
   
public org.jboss.ha.framework.server.util.DistributedTimedCachePolicy$TimedEntrypeekEntry(java.lang.Object key)
Get the raw TimedEntry for key without performing any expiration check.

return
the TimedEntry value associated with key if one exists, null otherwise.

      Serializable skey = (Serializable) key;
      TimedEntry entry = (TimedEntry) entryMap.get(category, skey);
      return entry;
   
public voidremove(java.lang.Object key)
Remove the entry associated with key and call destroy on the entry if found.

      Serializable skey = (Serializable) key;
      try
      {
         TimedEntry entry = (TimedEntry) entryMap.remove(category, skey);
         if( entry != null )
            entry.destroy();
      }
      catch(Exception e)
      {
         log.error("Failed to remove entry", e);
      }
   
public voidrun()
The TimerTask run method. It updates the cache time to the current system time.

      now = System.currentTimeMillis();
   
public voidsetDefaultLifetime(int defaultLifetime)
Set the default lifetime of cache entries for new values added to the cache.

param
defaultLifetime lifetime in seconds of cache values that do not implement TimedEntry.

      this.defaultLifetime = defaultLifetime;
   
public intsize()

      return entryMap.getAllKeys(category).size();
   
public voidstart()
Schedules this with the class resolutionTimer Timer object for execution every resolution seconds.

      resolutionTimer.scheduleAtFixedRate(this, 0, 1000*resolution);
   
public voidstop()
Stop cancels the resolution timer and flush()es the cache.

      super.cancel();