Author: fhanik
Date: Fri Mar 10 17:35:20 2006
New Revision: 384984

URL: http://svn.apache.org/viewcvs?rev=384984&view=rev
Log:
started to document the replicated map.


Modified:
    
tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/tipis/LazyReplicatedMap.java
    
tomcat/container/tc5.5.x/modules/groupcom/test/org/apache/catalina/tribes/demos/MapDemo.java

Modified: 
tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/tipis/LazyReplicatedMap.java
URL: 
http://svn.apache.org/viewcvs/tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/tipis/LazyReplicatedMap.java?rev=384984&r1=384983&r2=384984&view=diff
==============================================================================
--- 
tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/tipis/LazyReplicatedMap.java
 (original)
+++ 
tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/tipis/LazyReplicatedMap.java
 Fri Mar 10 17:35:20 2006
@@ -25,6 +25,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
@@ -41,19 +42,48 @@
 import org.apache.catalina.tribes.mcast.McastMember;
 
 /**
- * @todo implement periodic sync/transfer 
+ * A smart implementation of a stateful replicated map. uses primary/secondary 
backup strategy. 
+ * One node is always the primary and one node is always the backup.
+ * This map is synchronized across a cluster, and only has one backup 
member.<br/>
+ * A perfect usage for this map would be a session map for a session manager 
in a clustered environment.<br/>
+ * The only way to modify this list is to use the <code>put, putAll, 
remove</code> methods.
+ * entrySet, entrySetFull, keySet, keySetFull, returns all non modifiable 
sets.<br><br>
+ * If objects (values) in the map change without invoking <code>put()</code> 
or <code>remove()</code>
+ * the data can be distributed using two different methods:<br>
+ * <code>replicate(boolean)</code> and <code>replicate(Object, 
boolean)</code><br>
+ * These two methods are very important two understand. The map can work with 
two set of value objects:<br>
+ * 1. Serializable - the entire object gets serialized each time it is 
replicated<br>
+ * 2. ReplicatedMapEntry - this interface allows for a isDirty() flag and to 
replicate diffs if desired.<br>
+ * Implementing the <code>ReplicatedMapEntry</code> interface allows you to 
decide what objects 
+ * get replicated and how much data gets replicated each time.<br>
+ * If you implement a smart AOP mechanism to detect changes in underlying 
objects, you can replicate
+ * only those changes by implementing the ReplicatedMapEntry interface, and 
return true when isDiffable()
+ * is invoked.<br><br>
+ * 
+ * This map implementation doesn't have a background thread running to 
replicate changes.
+ * If you do have changes without invoking put/remove then you need to invoke 
one of the following methods:
+ * <ul>
+ * <li><code>replicate(Object,boolean)</code> - replicates only the object 
that belongs to the key</li>
+ * <li><code>replicate(boolean)</code> - Scans the entire map for changes and 
replicates data</li>
+ *  </ul>
+ * the <code>boolean</code> value in the <code>replicate</code> method used to 
decide 
+ * whether to only replicate objects that implement the 
<code>ReplicatedMapEntry</code> interface
+ * or to replicate all objects. If an object doesn't implement the 
<code>ReplicatedMapEntry</code> interface
+ * each time the object gets replicated the entire object gets serialized, 
hence a call to <code>replicate(true)</code>
+ * will replicate all objects in this map that are using this node as primary.
+ * 
+ * @todo implement periodic sync/transfer thread
  * @author Filip Hanik
  * @version 1.0
  */
 public class LazyReplicatedMap extends LinkedHashMap 
     implements RpcCallback, ChannelListener, MembershipListener {
     protected static org.apache.commons.logging.Log log = 
org.apache.commons.logging.LogFactory.getLog(LazyReplicatedMap.class);
-    protected static long TIME_OUT = 15000;//hard coded timeout
     
 
//------------------------------------------------------------------------------
    
 //              INSTANCE VARIABLES
 
//------------------------------------------------------------------------------
   
-
+    private transient long rpcTimeout = 5000;
     private transient Channel channel;
     private transient RpcChannel rpcChannel;
     private transient byte[] mapContextName;
@@ -64,24 +94,25 @@
 
//------------------------------------------------------------------------------
    
 //              CONSTRUCTORS / DESTRUCTORS
 
//------------------------------------------------------------------------------
   
-    public LazyReplicatedMap(Channel channel, String mapContextName, int 
initialCapacity, float loadFactor) {
+    public LazyReplicatedMap(Channel channel, long timeout, String 
mapContextName, int initialCapacity, float loadFactor) {
         super(initialCapacity,loadFactor);
-        init(channel,mapContextName);
+        init(channel,mapContextName,timeout);
     }
 
-    public LazyReplicatedMap(Channel channel, String mapContextName, int 
initialCapacity) {
+    public LazyReplicatedMap(Channel channel, long timeout, String 
mapContextName, int initialCapacity) {
         super(initialCapacity);
-        init(channel,mapContextName);
+        init(channel,mapContextName, timeout);
     }
 
-    public LazyReplicatedMap(Channel channel, String mapContextName) {
+    public LazyReplicatedMap(Channel channel, long timeout, String 
mapContextName) {
         super();
-        init(channel,mapContextName);
+        init(channel,mapContextName,timeout);
     }
     
-    void init(Channel channel, String mapContextName) {
+    void init(Channel channel, String mapContextName, long timeout) {
         final String chset = "ISO-8859-1";
         this.channel = channel;
+        this.rpcTimeout = timeout;
         try {
             this.mapContextName = mapContextName.getBytes(chset);
         }catch (UnsupportedEncodingException x) {
@@ -92,7 +123,6 @@
         this.channel.addChannelListener(this);
         this.channel.addMembershipListener(this);
         transferState();
-        
     }
     
     public void breakDown() {
@@ -179,7 +209,7 @@
             if ( backup != null ) {
                 MapMessage msg = new 
MapMessage(mapContextName,MapMessage.MSG_STATE,false,
                                                 null,null,null,null);
-                Response[] resp = rpcChannel.send(new Member[] 
{backup},msg,rpcChannel.FIRST_REPLY,TIME_OUT);
+                Response[] resp = rpcChannel.send(new Member[] 
{backup},msg,rpcChannel.FIRST_REPLY,rpcTimeout);
                 if ( resp.length > 0 ) {
                     msg = (MapMessage)resp[0].getMessage();
                     ArrayList list = (ArrayList)msg.getValue();
@@ -398,7 +428,7 @@
                 MapMessage msg = new MapMessage(mapContextName, 
MapMessage.MSG_RETRIEVE_BACKUP, false,
                                                 (Serializable) key, null, 
null, null);
                 Response[] resp = rpcChannel.send(new Member[] 
{entry.getBackupNode()},
-                                                  msg, 
this.rpcChannel.FIRST_REPLY, TIME_OUT);
+                                                  msg, 
this.rpcChannel.FIRST_REPLY, rpcTimeout);
                 if (resp == null || resp.length == 0) {
                     //no responses
                     log.warn("Unable to retrieve object for key:" + key);
@@ -517,7 +547,7 @@
             MapEntry entry = (MapEntry)e.getValue();
             if ( entry.isPrimary() ) set.add(entry.getValue());
         }
-        return set;
+        return Collections.unmodifiableSet(set);
     }
     
     public Set keySet() {
@@ -530,7 +560,7 @@
             MapEntry entry = (MapEntry)e.getValue();
             if ( entry.isPrimary() ) set.add(entry.getKey());
         }
-        return set;
+        return Collections.unmodifiableSet(set);
     }
     
     public int sizeFull() {
@@ -566,7 +596,7 @@
             MapEntry entry = (MapEntry)e.getValue();
             if ( entry.isPrimary() ) values.add(entry.getValue());
         }
-        return values;
+        return Collections.unmodifiableCollection(values);
     }
     
 

Modified: 
tomcat/container/tc5.5.x/modules/groupcom/test/org/apache/catalina/tribes/demos/MapDemo.java
URL: 
http://svn.apache.org/viewcvs/tomcat/container/tc5.5.x/modules/groupcom/test/org/apache/catalina/tribes/demos/MapDemo.java?rev=384984&r1=384983&r2=384984&view=diff
==============================================================================
--- 
tomcat/container/tc5.5.x/modules/groupcom/test/org/apache/catalina/tribes/demos/MapDemo.java
 (original)
+++ 
tomcat/container/tc5.5.x/modules/groupcom/test/org/apache/catalina/tribes/demos/MapDemo.java
 Fri Mar 10 17:35:20 2006
@@ -54,7 +54,7 @@
     protected SimpleTableDemo table;
     
     public MapDemo(Channel channel ) {
-        map = new LazyReplicatedMap(channel,"MapDemo");
+        map = new LazyReplicatedMap(channel,5000, "MapDemo");
         table = 
SimpleTableDemo.createAndShowGUI(map,channel.getLocalMember().getName());
         channel.addChannelListener(this);
         channel.addMembershipListener(this);



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to