-->
<!--
- <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;"/>
* 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
} 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);
}
public boolean isNotifyListenersOnReplication();
+ public ClusterManager cloneFromTemplate();
}
*/
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");
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
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;
+ }
}
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
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;
+ }
}
return cluster;
}
+ public ClusterManager cloneFromTemplate() {
+ throw new UnsupportedOperationException();
+ }
+
}
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;
*/
protected Map managers = new HashMap();
- private String managerClassName = "org.apache.catalina.ha.session.DeltaManager";
-
+ protected ClusterManager managerTemplate = new DeltaManager();
private List valves = new ArrayList();
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 <Manager> 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.");
}
/**
this.channel = channel;
}
+ public void setManagerTemplate(ClusterManager managerTemplate) {
+ this.managerTemplate = managerTemplate;
+ }
+
/**
* has members
*/
return channel;
}
+ public ClusterManager getManagerTemplate() {
+ return managerTemplate;
+ }
+
/**
* Create new Manager without add to cluster (comes with start the manager)
*
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
/**
* 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
*/