JBoss Cache 2.0.0 "Habanero" designs


JDK baseline?


There is a discussion around whether Habanero should use Java 5 as a baseline, and JBossRetro as a means to providing Java 1.4.x compatible builds.  See JBossCacheHabaneroJava1.4 for more details.


Habanero will use Java 5 as it's baseline and make full use of Java 5 language and API features, particularly in place of Doug Lea's concurrent.jar, albeit with some caveats listed on the JBossRetroPitfalls page. 


JGroups dependency


In addition, Habanero will ship with and depend on JGroups 2.5, which too is baselined on Java 5.


JSR-107 JCache compliant interfaces


While sticking to a JSR is probably a good thing, for several reasons Habanero will not be JSR-107 compliant:


  • JSR-107 is incomplete and is still in flux

  • JSR-107 defines a flat, map-like cache.  JBoss Cache uses a tree-structured cache.


As such, one of the goals of Habanero is to glean good design ideas off JSR-107 (such as cache factories, interfaces and listeners), follow close naming conventions, and perhaps once the JSR is complete, provide an interface to JBoss Cache that is JSR-107 compliant.


See discussion on this subject.


Preliminary interfaces


Other discussions on the Cache and Node interfaces and Listeners and Cache Loaders have also been ongoing.  Here's one on the CacheFactory interface.


In it's current state, we have a concept as follows:



  • This raises the Node object as a top-level construct in the cache.

  • The cache itself is a wrapper around the root node, providing some additional cache-wide operations.

  • All operations performed on the node are relative to the node.

  • Cache and Node interfaces are minimalist, providing basic cache functionality.

  • SPI interfaces are available to both cache and node, that allow access to some internals.

    • Intended to be used by plugin authors and people extending JBoss Cache

    • Not indended for use by applications directly.

  • New construction mechanism and lifecycle management by the CacheFactory


Please see the latest Habanero javadocs, published here.  Lots of javadoc comments detail the operation of each method.


Using the new interfaces


Simple usage example:


   // create a factory
   CacheFactory factory = new CacheFactoryImpl();

   // create and start the cache
   Cache c = factory.createCache("META-INF/replSync-service.xml"); 

   // add a child node, and put some data in it
   c.addChild("/a/b/c").put("key", "value");

   // retrieve the child node from the cache
   Node abc = c.getChild("/a/b/c");

   // create a new child 
   Node n123 = c.addChild("/1/2/3");

   // move nodes around
   abc.getFqn(); // expecting "/1/2/3/a/b/c"

   // add a new child, relative to current node
   n123.addChild("/4/5/6").put("key2", "value2");

   c.getChild("/1/2/3/4/5/6").get("key2"); // should equal value2



Implementing Habanero


For Habanero, these new interfaces and APIs will be implemented as simple wrappers around the existing, proven TreeCache.  In a later release, possibly JBoss Cache 2.1.0, the internals of how the cache and tree is organised may change, but the interfaces and API defined here will be adhered to.