-->
<!--
- <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
+ <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
+ channelSendOptions="11">
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
* @param manager Manager
*/
public void registerManager(Manager manager);
+
+ /**
+ * Removes a manager from the cluster
+ * @param manager Manager
+ */
+ public void removeManager(Manager manager);
// --------------------------------------------------------- Cluster Wide Deployments
public Map getManagers();
public Manager getManager(String name);
- public void removeManager(String name,Manager manager);
- public void addManager(String name,Manager manager);
public String getManagerName(String name, Manager manager);
public Valve[] getValves();
public void setChannel(Channel channel);
public Channel getChannel();
+
}
/*
* stop cluster wide deployments
*
- * @see org.apache.catalina.cluster.ClusterDeployer#stop()
+ * @see org.apache.catalina.ha.ClusterDeployer#stop()
*/
public void stop() throws LifecycleException {
started = false;
/*
* Modifcation from watchDir war detected!
*
- * @see org.apache.catalina.cluster.deploy.FileChangeListener#fileModified(java.io.File)
+ * @see org.apache.catalina.ha.deploy.FileChangeListener#fileModified(java.io.File)
*/
public void fileModified(File newWar) {
try {
/*
* War remvoe from watchDir
*
- * @see org.apache.catalina.cluster.deploy.FileChangeListener#fileRemoved(java.io.File)
+ * @see org.apache.catalina.ha.deploy.FileChangeListener#fileRemoved(java.io.File)
*/
public void fileRemoved(File removeWar) {
try {
/*
* Call watcher to check for deploy changes
*
- * @see org.apache.catalina.cluster.ClusterDeployer#backgroundProcess()
+ * @see org.apache.catalina.ha.ClusterDeployer#backgroundProcess()
*/
public void backgroundProcess() {
if (started) {
*/
public void start() throws LifecycleException {
if ( this.started ) return;
+
try {
+ cluster.registerManager(this);
CatalinaCluster catclust = (CatalinaCluster)cluster;
- catclust.addManager(getName(), this);
LazyReplicatedMap map = new LazyReplicatedMap(this,
catclust.getChannel(),
DEFAULT_REPL_TIMEOUT,
map.setChannelSendOptions(mapSendOptions);
this.sessions = map;
super.start();
+ this.started = true;
} catch ( Exception x ) {
log.error("Unable to start BackupManager",x);
throw new LifecycleException("Failed to start BackupManager",x);
public String getMapName() {
CatalinaCluster catclust = (CatalinaCluster)cluster;
- String name = catclust.getManagerName(getName(),this)+"-"+"";
+ String name = catclust.getManagerName(getName(),this)+"-"+"map";
if ( log.isDebugEnabled() ) log.debug("Backup manager, Setting map name to:"+name);
return name;
}
} finally {
super.stop();
}
- cluster.removeManager(getName(),this);
+ cluster.removeManager(this);
}
if (log.isInfoEnabled()) log.info(sm.getString("deltaManager.startClustering", getName()));
//to survice context reloads, as only a stop/start is called, not
// createManager
- ((CatalinaCluster)cluster).addManager(getName(), this);
+ cluster.registerManager(this);
getAllClusterSessions();
// Require a new random number generator if we are restarted
this.random = null;
- getCluster().removeManager(getName(),this);
+ getCluster().removeManager(this);
replicationValve = null;
if (initialized) {
destroy();
import org.apache.catalina.util.StringManager;
import org.apache.catalina.session.StandardManager;
import org.apache.catalina.session.ManagerBase;
+import java.util.concurrent.atomic.AtomicInteger;
/**
*
public DeltaSession(Manager manager) {
super(manager);
+ accessCount = new AtomicInteger();
this.resetDeltaRequest();
}
isValid = ( (Boolean) stream.readObject()).booleanValue();
thisAccessedTime = ( (Long) stream.readObject()).longValue();
version = ( (Long) stream.readObject()).longValue();
+ this.accessCount = new AtomicInteger();
boolean hasPrincipal = stream.readBoolean();
principal = null;
if (hasPrincipal) {
* @author Bela Ban (modifications for synchronous replication)
* @version 1.0 for TC 4.0
* Description: The InMemoryReplicationManager is a session manager that replicated
- * session information in memory. It uses <a href="www.javagroups.com">JavaGroups</a> as
- * a communication protocol to ensure guaranteed and ordered message delivery.
- * JavaGroups also provides a very flexible protocol stack to ensure that the replication
- * can be used in any environment.
+ * session information in memory.
* <BR><BR>
* The InMemoryReplicationManager extends the StandardManager hence it allows for us
* to inherit all the basic session management features like expiration, session listeners etc
getName()+"] is not distributable. Ignoring message");
return null;
}
- //notify javagroups
try
{
if ( invalidatedSessions.get(sessionId) != null ) {
public void start() throws LifecycleException {
mManagerRunning = true;
super.start();
- //start the javagroups channel
try {
//the channel is already running
if ( mChannelStarted ) return;
log.error("Starting... no cluster associated with this context:"+getName());
return;
}
- cluster.addManager(getName(),this);
+ cluster.registerManager(this);
if (cluster.getMembers().length > 0) {
Member mbr = cluster.getMembers()[0];
mManagerRunning = false;
mChannelStarted = false;
super.stop();
- //stop the javagroup channel
try
{
this.sessions.clear();
- cluster.removeManager(getName(),this);
-// mReplicationListener.stopListening();
-// mReplicationTransmitter.stop();
-// service.stop();
-// service = null;
+ cluster.removeManager(this);
}
catch ( Exception x )
{
this.managerTemplate = managerTemplate;
}
+ public void setChannelSendOptions(int channelSendOptions) {
+ this.channelSendOptions = channelSendOptions;
+ }
+
/**
* has members
*/
return managerTemplate;
}
+ public int getChannelSendOptions() {
+ return channelSendOptions;
+ }
+
/**
* Create new Manager without add to cluster (comes with start the manager)
*
Manager manager = null;
try {
manager = managerTemplate.cloneFromTemplate();
+ ((ClusterManager)manager).setName(name);
} catch (Exception 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();
}
public void registerManager(Manager manager) {
- manager.setDistributable(true);
- if (manager instanceof ClusterManager) {
- ClusterManager cmanager = (ClusterManager) manager ;
- cmanager.setDefaultMode(false);
- cmanager.setName(getManagerName(((ClusterManager)manager).getName(),manager));
- cmanager.setCluster(this);
+
+ if (! (manager instanceof ClusterManager)) {
+ log.warn("Manager [ " + manager + "] does not implement ClusterManager, addition to cluster has been aborted.");
+ return;
}
+ ClusterManager cmanager = (ClusterManager) manager ;
+ cmanager.setDistributable(true);
+ // Notify our interested LifecycleListeners
+ lifecycle.fireLifecycleEvent(BEFORE_MANAGERREGISTER_EVENT, manager);
+ String clusterName = getManagerName(cmanager.getName(), manager);
+ cmanager.setName(clusterName);
+ cmanager.setCluster(this);
+ cmanager.setDefaultMode(false);
+
+ managers.put(clusterName, manager);
+ // Notify our interested LifecycleListeners
+ lifecycle.fireLifecycleEvent(AFTER_MANAGERREGISTER_EVENT, manager);
}
/**
*
* @see org.apache.catalina.ha.CatalinaCluster#removeManager(java.lang.String,Manager)
*/
- public void removeManager(String name,Manager manager) {
- if (manager != null) {
+ public void removeManager(Manager manager) {
+ if (manager != null && manager instanceof ClusterManager ) {
+ ClusterManager cmgr = (ClusterManager) manager;
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(BEFORE_MANAGERUNREGISTER_EVENT,manager);
- managers.remove(getManagerName(name,manager));
- if (manager instanceof ClusterManager) ((ClusterManager) manager).setCluster(null);
+ managers.remove(getManagerName(cmgr.getName(),manager));
+ cmgr.setCluster(null);
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(AFTER_MANAGERUNREGISTER_EVENT, manager);
}
}
/**
- * add an application to cluster replication bus
- *
- * @param name
- * of the context
- * @param manager
- * manager to register
- * @see org.apache.catalina.ha.CatalinaCluster#addManager(java.lang.String,
- * org.apache.catalina.Manager)
- */
- public void addManager(String name, Manager manager) {
- if (!manager.getDistributable()) {
- log.warn("Manager with name " + name + " is not distributable, can't add as cluster manager");
- return;
- }
- // Notify our interested LifecycleListeners
- lifecycle.fireLifecycleEvent(BEFORE_MANAGERREGISTER_EVENT, manager);
- String clusterName = getManagerName(name, manager);
- if (manager instanceof ClusterManager) {
- ClusterManager cmanager = (ClusterManager) manager ;
- cmanager.setName(clusterName);
- cmanager.setCluster(this);
- //not needed anymore, we have an explicit Manager element
- //if(cmanager.isDefaultMode()) transferProperty("manager",cmanager);
- }
- managers.put(clusterName, manager);
- // Notify our interested LifecycleListeners
- lifecycle.fireLifecycleEvent(AFTER_MANAGERREGISTER_EVENT, manager);
- }
-
- /**
* @param name
* @param manager
* @return
registry.loadDescriptors("org.apache.catalina.session", cl);
registry.loadDescriptors("org.apache.catalina.startup", cl);
registry.loadDescriptors("org.apache.catalina.users", cl);
- registry.loadDescriptors("org.apache.catalina.cluster", cl);
+ registry.loadDescriptors("org.apache.catalina.ha", cl);
registry.loadDescriptors("org.apache.catalina.connector", cl);
registry.loadDescriptors("org.apache.catalina.valves", cl);
}
if (!this.channelListeners.contains(channelListener) ) {
this.channelListeners.add(channelListener);
} else {
- throw new IllegalArgumentException("Listener already exists:"+channelListener);
+ throw new IllegalArgumentException("Listener already exists:"+channelListener+"["+channelListener.getClass().getName()+"]");
}
}
description="Tcp Cluster implementation"
domain="Catalina"
group="Cluster"
- type="org.apache.catalina.cluster.tcp.SimpleTcpCluster">
+ type="org.apache.catalina.ha.tcp.SimpleTcpCluster">
<attribute name="protocolStack"
description="JavaGroups protocol stack selection"
description="Clustered implementation of the Manager interface"
domain="Catalina"
group="Manager"
- type="org.apache.catalina.cluster.tcp.SimpleTcpReplicationManager">
+ type="org.apache.catalina.ha.tcp.SimpleTcpReplicationManager">
<attribute name="algorithm"
description="The message digest algorithm to be used when generating
description="Valve for simple tcp replication"
domain="Catalina"
group="Valve"
- type="org.apache.catalina.cluster.tcp.ReplicationValve">
+ type="org.apache.catalina.ha.tcp.ReplicationValve">
<attribute name="className"
description="Fully qualified class name of the managed object"
description="Cluster Membership service implementation"
domain="Catalina"
group="Cluster"
- type="org.apache.catalina.cluster.mcast.McastService">
+ type="org.apache.catalina.ha.mcast.McastService">
<attribute name="info"
description="Class version info"
type="java.lang.String"
if ( log.isTraceEnabled() )
log.trace("Replicate invoked on key:"+key);
MapEntry entry = (MapEntry)super.get(key);
+ if ( entry == null ) return;
if ( !entry.isSerializable() ) return;
if (entry != null && entry.isPrimary() && entry.getBackupNodes()!= null && entry.getBackupNodes().length > 0) {
Object value = entry.getValue();
description="Tcp Cluster implementation"
domain="Catalina"
group="Cluster"
- type="org.apache.catalina.cluster.tcp.SimpleTcpCluster">
+ type="org.apache.catalina.ha.tcp.SimpleTcpCluster">
<attribute name="info"
description="Class version info"
type="java.lang.String"
returnType="void">
<parameter name="message"
description="replication message"
- type="org.apache.catalina.cluster.ClusterMessage"/>
+ type="org.apache.catalina.ha.ClusterMessage"/>
</operation>
<operation name="sendClusterDomain"
returnType="void">
<parameter name="message"
description="replication message"
- type="org.apache.catalina.cluster.ClusterMessage"/>
+ type="org.apache.catalina.ha.ClusterMessage"/>
</operation>
<operation name="sendToMember"
description="Tcp Cluster NioReceiver implementation"
domain="Catalina"
group="Cluster"
- type="org.apache.catalina.cluster.tcp.ClusterReceiverBase">
+ type="org.apache.catalina.ha.tcp.ClusterReceiverBase">
<attribute name="info"
description="Class version info"
type="java.lang.String"
description="Tcp Cluster SocketReplicationListener implementation"
domain="Catalina"
group="Cluster"
- type="org.apache.catalina.cluster.tcp.SocketReplicationListener">
+ type="org.apache.catalina.ha.tcp.SocketReplicationListener">
<attribute name="info"
description="Class version info"
type="java.lang.String"
description="Tcp replication transmitter"
domain="Catalina"
group="ClusterSender"
- type="org.apache.catalina.cluster.tcp.ReplicationTransmitter">
+ type="org.apache.catalina.ha.tcp.ReplicationTransmitter">
<attribute name="info"
description="Class version info"
type="java.lang.String"
description="Async Cluster Sender"
domain="Catalina"
group="IDataSender"
- type="org.apache.catalina.cluster.tcp.AsyncSocketSender">
+ type="org.apache.catalina.ha.tcp.AsyncSocketSender">
<attribute name="info"
description="Class version info"
type="java.lang.String"
description="Multi Socket Sender, more than one socket per member"
domain="Catalina"
group="IDataSender"
- type="org.apache.catalina.cluster.tcp.PooledSocketSender">
+ type="org.apache.catalina.ha.tcp.PooledSocketSender">
<attribute name="address"
description="sender ip address"
type="java.net.InetAddress"
description="Sync Cluster Sender"
domain="Catalina"
group="IDataSender"
- type="org.apache.catalina.cluster.tcp.SocketSender">
+ type="org.apache.catalina.ha.tcp.SocketSender">
<attribute name="address"
description="sender ip address"
type="java.net.InetAddress"
description="Valve for simple tcp replication"
domain="Catalina"
group="Valve"
- type="org.apache.catalina.cluster.tcp.ReplicationValve">
+ type="org.apache.catalina.ha.tcp.ReplicationValve">
<attribute name="info"
description="Class version info"
type="java.lang.String"
<code>org.apache.catalina.ha.tcp.SimpleTcpCluster</code>
</p>
</attribute>
+ <attribute name="channelSendOptions" required="true">
+ <p>The Tribes channel send options, default is 11
+ <source>
+ int options= Channel.SEND_OPTIONS_ASYNCHRONOUS |
+ Channel.SEND_OPTIONS_SYNCHRONIZED_ACK |
+ Channel.SEND_OPTIONS_USE_ACK;
+ </source>
+ Some of the values are:<br/>
+ <code>Channel.SEND_OPTIONS_SYNCHRONIZED_ACK = 0x0004</code><br/>
+ <code>Channel.SEND_OPTIONS_ASYNCHRONOUS = 0x0008</code><br/>
+ <code>Channel.SEND_OPTIONS_USE_ACK = 0x0002</code><br/>
+ </p>
+ </attribute>
+
<attribute name="doClusterLog" required="false">
<p><b>Deprecated since 6.0.0</b></p>
<p>Possible values are <code>true</code> or <code>false</code><br/>