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]