Update configurations options, this new feature allows a specific <Context> to overwr...
authorfhanik <fhanik@13f79535-47bb-0310-9956-ffa450edef68>
Fri, 29 Sep 2006 16:32:32 +0000 (16:32 +0000)
committerfhanik <fhanik@13f79535-47bb-0310-9956-ffa450edef68>
Fri, 29 Sep 2006 16:32:32 +0000 (16:32 +0000)
This allows for a cleaner config, as the cluster does no longer have to forward all manager settings, and allows documentation to be much clearer on what settings are available.

git-svn-id: https://svn.apache.org/repos/asf/tomcat/tc6.0.x/trunk@451343 13f79535-47bb-0310-9956-ffa450edef68

conf/server.xml
java/org/apache/catalina/Cluster.java
java/org/apache/catalina/core/StandardContext.java
java/org/apache/catalina/ha/ClusterManager.java
java/org/apache/catalina/ha/ClusterRuleSet.java
java/org/apache/catalina/ha/session/BackupManager.java
java/org/apache/catalina/ha/session/DeltaManager.java
java/org/apache/catalina/ha/session/SimpleTcpReplicationManager.java
java/org/apache/catalina/ha/tcp/SimpleTcpCluster.java
java/org/apache/catalina/tribes/MembershipListener.java

index 6d3d9cd..50caa85 100644 (file)
         -->
         
         <!--
-        <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
-                managerClassName="org.apache.catalina.cluster.session.DeltaManager"
-                 expireSessionsOnShutdown="false"
-                 useDirtyFlag="true"
-                 notifyListenersOnReplication="true">
+        <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
+          <Manager className="org.apache.catalina.ha.session.DeltaManager"
+                   expireSessionsOnShutdown="false"
+                   notifyListenersOnReplication="true"/>
+        
           <Channel className="org.apache.catalina.tribes.group.GroupChannel">
             <Membership className="org.apache.catalina.tribes.membership.McastService"
                         mcastAddr="228.0.0.4"
             <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
             <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
             <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
-         </Channel>
+          </Channel>
 
           <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                  filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>
index bb4ef14..b860e01 100644 (file)
@@ -100,6 +100,14 @@ public interface Cluster {
      * associated
      */
     public Manager createManager(String name);
+    
+    /**
+     * Register a manager with the cluster. If the cluster is not responsible 
+     * for creating a manager, then the container will at least notify the 
+     * cluster that this mananger is participating in the cluster.
+     * @param manager Manager
+     */
+    public void registerManager(Manager manager);
 
     // --------------------------------------------------------- Cluster Wide Deployments
     
index 4c77d82..3110f2c 100644 (file)
@@ -4193,6 +4193,10 @@ public class StandardContext
                } else {
                        contextManager = new StandardManager();
                }
+        } else if ((getCluster() != null) && distributable) {
+            //let the cluster know that there is a context that is distributable
+            //and that it has its own manager
+            getCluster().registerManager(manager);
         }
         
         
index 67e662d..3f69cf1 100644 (file)
@@ -107,4 +107,5 @@ public interface ClusterManager extends Manager {
    
    public boolean isNotifyListenersOnReplication();
 
+   public ClusterManager cloneFromTemplate();
 }
index 1c23183..dc94f7a 100644 (file)
@@ -85,7 +85,16 @@ public class ClusterRuleSet extends RuleSetBase {
      */
     public void addRuleInstances(Digester digester) {
         //Cluster configuration start
+        digester.addObjectCreate(prefix + "Manager",
+                                 null, // MUST be specified in the element
+                                 "className");
+        digester.addSetProperties(prefix + "Manager");
+        digester.addSetNext(prefix + "Manager",
+                            "setManagerTemplate",
+                            "org.apache.catalina.ha.ClusterManager");
         
+
+
         digester.addObjectCreate(prefix + "Channel",
                                  null, // MUST be specified in the element
                                  "className");
index fcaa1cf..c360d74 100644 (file)
@@ -19,16 +19,14 @@ import java.io.ByteArrayInputStream;
 import java.io.IOException;
 
 import org.apache.catalina.LifecycleException;
-import org.apache.catalina.Loader;
 import org.apache.catalina.Session;
 import org.apache.catalina.ha.CatalinaCluster;
 import org.apache.catalina.ha.ClusterManager;
 import org.apache.catalina.ha.ClusterMessage;
 import org.apache.catalina.session.StandardManager;
-import org.apache.catalina.tribes.Member;
+import org.apache.catalina.tribes.Channel;
 import org.apache.catalina.tribes.io.ReplicationStream;
 import org.apache.catalina.tribes.tipis.LazyReplicatedMap;
-import org.apache.catalina.tribes.Channel;
 
 /**
  *@author Filip Hanik
@@ -267,5 +265,15 @@ public class BackupManager extends StandardManager implements ClusterManager
     public String[] getInvalidatedSessions() {
         return new String[0];
     }
+    
+    public ClusterManager cloneFromTemplate() {
+        BackupManager result = new BackupManager();
+        result.mExpireSessionsOnShutdown = mExpireSessionsOnShutdown;
+        result.name = "Clone-from-"+name;
+        result.cluster = cluster;
+        result.notifyListenersOnReplication = notifyListenersOnReplication;
+        result.mapSendOptions = mapSendOptions;
+        return result;
+    }
 
 }
index 545b637..d5a2bc8 100644 (file)
@@ -43,6 +43,7 @@ import org.apache.catalina.tribes.Member;
 import org.apache.catalina.tribes.io.ReplicationStream;
 import org.apache.catalina.util.LifecycleSupport;
 import org.apache.catalina.util.StringManager;
+import org.apache.catalina.ha.ClusterManager;
 
 /**
  * The DeltaManager manages replicated sessions by only replicating the deltas
@@ -1496,4 +1497,23 @@ public class DeltaManager extends ClusterManagerBase{
         cluster.send(newmsg, sender);
     }
 
+    public ClusterManager cloneFromTemplate() {
+        DeltaManager result = new DeltaManager();
+        result.name = "Clone-from-"+name;
+        result.cluster = cluster;
+        result.replicationValve = replicationValve;
+        result.maxActiveSessions = maxActiveSessions;
+        result.expireSessionsOnShutdown = expireSessionsOnShutdown;
+        result.notifyListenersOnReplication = notifyListenersOnReplication;
+        result.notifySessionListenersOnReplication = notifySessionListenersOnReplication;
+        result.stateTransferTimeout = stateTransferTimeout;
+        result.sendAllSessions = sendAllSessions;
+        result.sendClusterDomainOnly = sendClusterDomainOnly ;
+        result.sendAllSessionsSize = sendAllSessionsSize;
+        result.sendAllSessionsWaitTime = sendAllSessionsWaitTime ; 
+        result.receiverQueue = receiverQueue ;
+        result.stateTimestampDrop = stateTimestampDrop ;
+        result.stateTransferCreateSendTime = stateTransferCreateSendTime; 
+        return result;
+    }
 }
index 6dfb769..d5f83c3 100644 (file)
@@ -687,4 +687,8 @@ public class SimpleTcpReplicationManager extends StandardManager implements Clus
         return cluster;
     }
 
+    public ClusterManager cloneFromTemplate() {
+        throw new UnsupportedOperationException();
+    }
+
 }
index 3e6a589..4f9f880 100644 (file)
@@ -37,18 +37,17 @@ import org.apache.catalina.LifecycleListener;
 import org.apache.catalina.Manager;
 import org.apache.catalina.Valve;
 import org.apache.catalina.ha.CatalinaCluster;
-import org.apache.catalina.tribes.Channel;
-import org.apache.catalina.tribes.ChannelListener;
 import org.apache.catalina.ha.ClusterListener;
 import org.apache.catalina.ha.ClusterManager;
 import org.apache.catalina.ha.ClusterMessage;
 import org.apache.catalina.ha.ClusterValve;
+import org.apache.catalina.ha.session.DeltaManager;
+import org.apache.catalina.ha.util.IDynamicProperty;
+import org.apache.catalina.tribes.Channel;
+import org.apache.catalina.tribes.ChannelListener;
 import org.apache.catalina.tribes.Member;
 import org.apache.catalina.tribes.MembershipListener;
 import org.apache.catalina.tribes.group.GroupChannel;
-
-import org.apache.catalina.ha.session.DeltaManager;
-import org.apache.catalina.ha.util.IDynamicProperty;
 import org.apache.catalina.util.LifecycleSupport;
 import org.apache.catalina.util.StringManager;
 import org.apache.commons.logging.Log;
@@ -147,8 +146,7 @@ public class SimpleTcpCluster
      */
     protected Map managers = new HashMap();
 
-    private String managerClassName = "org.apache.catalina.ha.session.DeltaManager";
-
+    protected ClusterManager managerTemplate = new DeltaManager();
 
     private List valves = new ArrayList();
 
@@ -252,14 +250,20 @@ public class SimpleTcpCluster
                 this.notifyLifecycleListenerOnFailure);
     }
 
+    /**
+     * @deprecated use getManagerTemplate().getClass().getName() instead.
+     * @return String
+     */
     public String getManagerClassName() {
-        if(managerClassName != null)
-            return managerClassName;
-        return (String)getProperty("manager.className");
+        return managerTemplate.getClass().getName();
     }
 
+    /**
+     * @deprecated use nested &lt;Manager&gt; element inside the cluster config instead.
+     * @param managerClassName String
+     */
     public void setManagerClassName(String managerClassName) {
-        this.managerClassName = managerClassName;
+        log.warn("setManagerClassName is deprecated, use nested <Manager> element inside the <Cluster> element instead, this request will be ignored.");
     }
 
     /**
@@ -337,6 +341,10 @@ public class SimpleTcpCluster
         this.channel = channel;
     }
 
+    public void setManagerTemplate(ClusterManager managerTemplate) {
+        this.managerTemplate = managerTemplate;
+    }
+
     /**
      * has members
      */
@@ -465,6 +473,10 @@ public class SimpleTcpCluster
         return channel;
     }
 
+    public ClusterManager getManagerTemplate() {
+        return managerTemplate;
+    }
+
     /**
      * Create new Manager without add to cluster (comes with start the manager)
      * 
@@ -477,27 +489,26 @@ public class SimpleTcpCluster
     public synchronized Manager createManager(String name) {
         if (log.isDebugEnabled()) log.debug("Creating ClusterManager for context " + name + " using class " + getManagerClassName());
         Manager manager = null;
-        ClassLoader oldCtxLoader = Thread.currentThread().getContextClassLoader();
         try {
-            Thread.currentThread().setContextClassLoader(SimpleTcpCluster.class.getClassLoader());
-            manager = (Manager) getClass().getClassLoader().loadClass(getManagerClassName()).newInstance();
+            manager = managerTemplate.cloneFromTemplate();
         } catch (Exception x) {
-            log.error("Unable to load class for replication manager", x);
+            log.error("Unable to clone cluster manager, defaulting to org.apache.catalina.ha.session.DeltaManager", x);
             manager = new org.apache.catalina.ha.session.DeltaManager();
         } finally {
-            Thread.currentThread().setContextClassLoader(oldCtxLoader);
-            if(manager != null) {
-                manager.setDistributable(true);
-                if (manager instanceof ClusterManager) {
-                    ClusterManager cmanager = (ClusterManager) manager ;
-                    cmanager.setDefaultMode(true);
-                    cmanager.setName(getManagerName(name,manager));
-                    cmanager.setCluster(this);
-                }
-            }
+            if(manager != null) registerManager(manager);
         }
         return manager;
     }
+    
+    public void registerManager(Manager manager) {
+        manager.setDistributable(true);
+        if (manager instanceof ClusterManager) {
+            ClusterManager cmanager = (ClusterManager) manager ;
+            cmanager.setDefaultMode(true);
+            cmanager.setName(getManagerName(((ClusterManager)manager).getName(),manager));
+            cmanager.setCluster(this);
+        }
+    }
 
     /**
      * remove an application form cluster replication bus
index d21b386..1c5d5fc 100644 (file)
@@ -35,7 +35,7 @@ public interface MembershipListener {
     
     /**
      * A member was removed from the group<br>
-     * If the member left voluntarily, the payload will contain the Member.SHUTDOWN_PAYLOAD data
+     * If the member left voluntarily, the Member.getCommand will contain the Member.SHUTDOWN_PAYLOAD data
      * @param member Member
      * @see Member#SHUTDOWN_PAYLOAD
      */