org.apache.catalina.cluster.session
Class SimpleTcpReplicationManager

java.lang.Object
  extended byorg.apache.catalina.session.ManagerBase
      extended byorg.apache.catalina.session.StandardManager
          extended byorg.apache.catalina.cluster.session.SimpleTcpReplicationManager
All Implemented Interfaces:
ClusterManager, java.util.EventListener, Lifecycle, Manager, javax.management.MBeanRegistration, java.beans.PropertyChangeListener

public class SimpleTcpReplicationManager
extends StandardManager
implements ClusterManager

Title: Tomcat Session Replication for Tomcat 4.0
Description: A very simple straight forward implementation of session replication of servers in a cluster.
This session replication is implemented "live". By live I mean, when a session attribute is added into a session on Node A a message is broadcasted to other messages and setAttribute is called on the replicated sessions.
A full description of this implementation can be found under Filip's Tomcat Page
Copyright: See apache license Company: www.filip.net

Version:
1.0 for TC 4.0 Description: The InMemoryReplicationManager is a session manager that replicated session information in memory. It uses JavaGroups 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.

The InMemoryReplicationManager extends the StandardManager hence it allows for us to inherit all the basic session management features like expiration, session listeners etc

To communicate with other nodes in the cluster, the InMemoryReplicationManager sends out 7 different type of multicast messages all defined in the SessionMessage class.
When a session is replicated (not an attribute added/removed) the session is serialized into a byte array using the StandardSession.readObjectData, StandardSession.writeObjectData methods.
Author:
Filip Hanik, Bela Ban (modifications for synchronous replication)

Field Summary
protected  CatalinaCluster cluster
           
protected  boolean defaultMode
           
protected  boolean distributable
           
protected  java.util.HashMap invalidatedSessions
           
static org.apache.commons.logging.Log log
           
protected  java.lang.String mChannelConfig
           
protected  boolean mChannelStarted
           
protected  boolean mExpireSessionsOnShutdown
          Set to true if we don't want the sessions to expire on shutdown
protected  java.lang.String mGroupName
           
protected  boolean mManagerRunning
           
protected  boolean mPrintToScreen
           
protected  java.lang.String name
           
protected  boolean stateTransferred
          Flag to keep track if the state has been transferred or not Assumes false.
protected  boolean synchronousReplication
          Use synchronous rather than asynchronous replication.
protected  boolean useDirtyFlag
           
 
Fields inherited from class org.apache.catalina.session.StandardManager
info, lifecycle, maxActiveSessions, pathname, processingTime, rejectedSessions, started
 
Fields inherited from class org.apache.catalina.session.ManagerBase
algorithm, container, DEFAULT_ALGORITHM, devRandomSource, digest, domain, duplicates, entropy, expiredSessions, initialized, maxActive, maxInactiveInterval, mserver, oname, processExpiresFrequency, random, randomClass, randomIS, sessionAverageAliveTime, sessionCounter, sessionIdLength, sessionMaxAliveTime, sessions, sm, support
 
Fields inherited from interface org.apache.catalina.Lifecycle
AFTER_START_EVENT, AFTER_STOP_EVENT, BEFORE_START_EVENT, BEFORE_STOP_EVENT, DESTROY_EVENT, INIT_EVENT, PERIODIC_EVENT, START_EVENT, STOP_EVENT
 
Constructor Summary
SimpleTcpReplicationManager()
          Constructor, just calls super()
 
Method Summary
 Session createSession(java.lang.String sessionId)
          Construct and return a new session object, based on the default settings specified by this Manager's properties.
protected  Session createSession(java.lang.String sessionId, boolean notify, boolean setId)
          Creates a HTTP session.
 CatalinaCluster getCluster()
           
 boolean getDistributable()
          Return the distributable flag for the sessions supported by this Manager.
 boolean getExpireSessionsOnShutdown()
           
 java.lang.String[] getInvalidatedSessions()
          When the manager expires session not tied to a request.
 java.lang.String getName()
          Return the name of the manager, at host /context name and at engine hostname+/context.
 boolean isDefaultMode()
           
 boolean isManagerRunning()
           
 boolean isNotifyListenersOnReplication()
           
 boolean isSendClusterDomainOnly()
           
 boolean isStateTransferred()
           
 void messageDataReceived(ClusterMessage cmsg)
          A message was received from another node, this is the callback method to implement if you are interested in receiving replication messages.
protected  void messageReceived(SessionMessage msg, Member sender)
          This method is called by the received thread when a SessionMessage has been received from one of the other nodes in the cluster.
protected  Session readSession(byte[] data, java.lang.String sessionId)
          Reinstantiates a serialized session from the data passed in.
 ClusterMessage requestCompleted(java.lang.String sessionId)
          When the request has been completed, the replication valve will notify the manager, and the manager will decide whether any replication is needed or not.
 void sessionInvalidated(java.lang.String sessionId)
           
 void setCluster(CatalinaCluster cluster)
           
 void setDefaultMode(boolean defaultMode)
           
 void setDistributable(boolean dist)
          Set the distributable flag for the sessions supported by this Manager.
 void setExpireSessionsOnShutdown(boolean expireSessionsOnShutdown)
           
 void setName(java.lang.String name)
          Set the name of the manager, at host /context name and at engine hostname+/context
 void setNotifyListenersOnReplication(boolean notifyListenersOnReplication)
           
 void setPrintToScreen(boolean printtoscreen)
           
 void setSendClusterDomainOnly(boolean sendClusterDomainOnly)
           
 void setSynchronousReplication(boolean flag)
           
 void setUseDirtyFlag(boolean usedirtyflag)
           
 void start()
          Prepare for the beginning of active use of the public methods of this component.
 void stop()
          Gracefully terminate the active use of the public methods of this component.
 void unload()
          Override persistence since they don't go hand in hand with replication for now.
protected  byte[] writeSession(Session session)
          Serialize a session into a byte array
This method simple calls the writeObjectData method on the session and returns the byte data from that call
 
Methods inherited from class org.apache.catalina.session.StandardManager
addLifecycleListener, doLoad, doUnload, file, findLifecycleListeners, getInfo, getMaxActiveSessions, getPathname, getRejectedSessions, load, propertyChange, removeLifecycleListener, setContainer, setMaxActiveSessions, setPathname, setRejectedSessions
 
Methods inherited from class org.apache.catalina.session.ManagerBase
add, addPropertyChangeListener, backgroundProcess, changeSessionId, createEmptySession, createSession, destroy, expireSession, findSession, findSessions, generateSessionId, getActiveSessions, getAlgorithm, getClassName, getContainer, getCreationTime, getDigest, getDomain, getDuplicates, getEngine, getEntropy, getExpiredSessions, getJvmRoute, getLastAccessedTime, getMaxActive, getMaxInactiveInterval, getNewSession, getObjectName, getProcessExpiresFrequency, getProcessingTime, getRandom, getRandomBytes, getRandomClass, getRandomFile, getSession, getSessionAttribute, getSessionAverageAliveTime, getSessionCounter, getSessionIdLength, getSessionMaxAliveTime, init, listSessionIds, postDeregister, postRegister, preDeregister, preRegister, processExpires, remove, removePropertyChangeListener, setAlgorithm, setDuplicates, setEntropy, setExpiredSessions, setMaxActive, setMaxInactiveInterval, setProcessExpiresFrequency, setProcessingTime, setRandomClass, setRandomFile, setSessionAverageAliveTime, setSessionCounter, setSessionIdLength, setSessionMaxAliveTime
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
Methods inherited from interface org.apache.catalina.Manager
add, addPropertyChangeListener, backgroundProcess, changeSessionId, createEmptySession, createSession, findSession, findSessions, getActiveSessions, getContainer, getExpiredSessions, getInfo, getMaxActive, getMaxInactiveInterval, getRejectedSessions, getSessionAverageAliveTime, getSessionCounter, getSessionIdLength, getSessionMaxAliveTime, load, remove, removePropertyChangeListener, setContainer, setExpiredSessions, setMaxActive, setMaxInactiveInterval, setRejectedSessions, setSessionAverageAliveTime, setSessionCounter, setSessionIdLength, setSessionMaxAliveTime
 

Field Detail

log

public static org.apache.commons.logging.Log log

mChannelConfig

protected java.lang.String mChannelConfig

mGroupName

protected java.lang.String mGroupName

mChannelStarted

protected boolean mChannelStarted

mPrintToScreen

protected boolean mPrintToScreen

defaultMode

protected boolean defaultMode

mManagerRunning

protected boolean mManagerRunning

synchronousReplication

protected boolean synchronousReplication
Use synchronous rather than asynchronous replication. Every session modification (creation, change, removal etc) will be sent to all members. The call will then wait for max milliseconds, or forever (if timeout is 0) for all responses.


mExpireSessionsOnShutdown

protected boolean mExpireSessionsOnShutdown
Set to true if we don't want the sessions to expire on shutdown


useDirtyFlag

protected boolean useDirtyFlag

name

protected java.lang.String name

distributable

protected boolean distributable

cluster

protected CatalinaCluster cluster

invalidatedSessions

protected java.util.HashMap invalidatedSessions

stateTransferred

protected boolean stateTransferred
Flag to keep track if the state has been transferred or not Assumes false.

Constructor Detail

SimpleTcpReplicationManager

public SimpleTcpReplicationManager()
Constructor, just calls super()

Method Detail

isSendClusterDomainOnly

public boolean isSendClusterDomainOnly()
Specified by:
isSendClusterDomainOnly in interface ClusterManager
Returns:
Manager send only to same cluster domain.

setSendClusterDomainOnly

public void setSendClusterDomainOnly(boolean sendClusterDomainOnly)
Specified by:
setSendClusterDomainOnly in interface ClusterManager
Parameters:
sendClusterDomainOnly - The sendClusterDomainOnly to set.

isDefaultMode

public boolean isDefaultMode()
Specified by:
isDefaultMode in interface ClusterManager
Returns:
Returns the defaultMode.

setDefaultMode

public void setDefaultMode(boolean defaultMode)
Specified by:
setDefaultMode in interface ClusterManager
Parameters:
defaultMode - The defaultMode to set.

isManagerRunning

public boolean isManagerRunning()

setUseDirtyFlag

public void setUseDirtyFlag(boolean usedirtyflag)

setExpireSessionsOnShutdown

public void setExpireSessionsOnShutdown(boolean expireSessionsOnShutdown)

setCluster

public void setCluster(CatalinaCluster cluster)
Specified by:
setCluster in interface ClusterManager

getExpireSessionsOnShutdown

public boolean getExpireSessionsOnShutdown()

setPrintToScreen

public void setPrintToScreen(boolean printtoscreen)

setSynchronousReplication

public void setSynchronousReplication(boolean flag)

unload

public void unload()
            throws java.io.IOException
Override persistence since they don't go hand in hand with replication for now.

Specified by:
unload in interface Manager
Overrides:
unload in class StandardManager
Throws:
java.io.IOException - if an input/output error occurs

createSession

protected Session createSession(java.lang.String sessionId,
                                boolean notify,
                                boolean setId)
Creates a HTTP session. Most of the code in here is copied from the StandardManager. This is not pretty, yeah I know, but it was necessary since the StandardManager had hard coded the session instantiation to the a StandardSession, when we actually want to instantiate a ReplicatedSession
If the call comes from the Tomcat servlet engine, a SessionMessage goes out to the other nodes in the cluster that this session has been created.

Parameters:
notify - - if set to true the other nodes in the cluster will be notified. This flag is needed so that we can create a session before we deserialize a replicated one
See Also:
ReplicatedSession

createSession

public Session createSession(java.lang.String sessionId)
Construct and return a new session object, based on the default settings specified by this Manager's properties. The session id will be assigned by this method, and available via the getId() method of the returned session. If a new session cannot be created for any reason, return null.

Specified by:
createSession in interface Manager
Overrides:
createSession in class StandardManager
Throws:
java.lang.IllegalStateException - if a new session cannot be instantiated for any reason

sessionInvalidated

public void sessionInvalidated(java.lang.String sessionId)

getInvalidatedSessions

public java.lang.String[] getInvalidatedSessions()
Description copied from interface: ClusterManager
When the manager expires session not tied to a request. The cluster will periodically ask for a list of sessions that should expire and that should be sent across the wire.

Specified by:
getInvalidatedSessions in interface ClusterManager
Returns:
String[] The invalidated sessions

requestCompleted

public ClusterMessage requestCompleted(java.lang.String sessionId)
Description copied from interface: ClusterManager
When the request has been completed, the replication valve will notify the manager, and the manager will decide whether any replication is needed or not. If there is a need for replication, the manager will create a session message and that will be replicated. The cluster determines where it gets sent.

Specified by:
requestCompleted in interface ClusterManager
Parameters:
sessionId - - the sessionId that just completed.
Returns:
a SessionMessage to be sent.

writeSession

protected byte[] writeSession(Session session)
Serialize a session into a byte array
This method simple calls the writeObjectData method on the session and returns the byte data from that call

Parameters:
session - - the session to be serialized
Returns:
a byte array containing the session data, null if the serialization failed

readSession

protected Session readSession(byte[] data,
                              java.lang.String sessionId)
Reinstantiates a serialized session from the data passed in. This will first call createSession() so that we get a fresh instance with all the managers set and all the transient fields validated. Then it calls Session.readObjectData(byte[]) to deserialize the object

Parameters:
data - - a byte array containing session data
Returns:
a valid Session object, null if an error occurs

getName

public java.lang.String getName()
Description copied from interface: ClusterManager
Return the name of the manager, at host /context name and at engine hostname+/context.

Specified by:
getName in interface ClusterManager
Overrides:
getName in class StandardManager

start

public void start()
           throws LifecycleException
Prepare for the beginning of active use of the public methods of this component. This method should be called after configure(), and before any of the public methods of the component are utilized.
Starts the cluster communication channel, this will connect with the other nodes in the cluster, and request the current session state to be transferred to this node.

Specified by:
start in interface Lifecycle
Overrides:
start in class StandardManager
Throws:
java.lang.IllegalStateException - if this component has already been started
LifecycleException - if this component detects a fatal error that prevents this component from being used

stop

public void stop()
          throws LifecycleException
Gracefully terminate the active use of the public methods of this component. This method should be the last one called on a given instance of this component.
This will disconnect the cluster communication channel and stop the listener thread.

Specified by:
stop in interface Lifecycle
Overrides:
stop in class StandardManager
Throws:
java.lang.IllegalStateException - if this component has not been started
LifecycleException - if this component detects a fatal error that needs to be reported

setDistributable

public void setDistributable(boolean dist)
Description copied from interface: Manager
Set the distributable flag for the sessions supported by this Manager. If this flag is set, all user data objects added to sessions associated with this manager must implement Serializable.

Specified by:
setDistributable in interface Manager
Overrides:
setDistributable in class ManagerBase
Parameters:
dist - The new distributable flag

getDistributable

public boolean getDistributable()
Description copied from interface: Manager
Return the distributable flag for the sessions supported by this Manager.

Specified by:
getDistributable in interface Manager
Overrides:
getDistributable in class ManagerBase

messageReceived

protected void messageReceived(SessionMessage msg,
                               Member sender)
This method is called by the received thread when a SessionMessage has been received from one of the other nodes in the cluster.

Parameters:
msg - - the message received
sender - - the sender of the message, this is used if we receive a EVT_GET_ALL_SESSION message, so that we only reply to the requesting node

messageDataReceived

public void messageDataReceived(ClusterMessage cmsg)
Description copied from interface: ClusterManager
A message was received from another node, this is the callback method to implement if you are interested in receiving replication messages.

Specified by:
messageDataReceived in interface ClusterManager
Parameters:
cmsg - - the message received.

isStateTransferred

public boolean isStateTransferred()

setName

public void setName(java.lang.String name)
Description copied from interface: ClusterManager
Set the name of the manager, at host /context name and at engine hostname+/context

Specified by:
setName in interface ClusterManager
Parameters:
name -

isNotifyListenersOnReplication

public boolean isNotifyListenersOnReplication()

setNotifyListenersOnReplication

public void setNotifyListenersOnReplication(boolean notifyListenersOnReplication)

getCluster

public CatalinaCluster getCluster()
Specified by:
getCluster in interface ClusterManager


Copyright © 2000-2012 Apache Software Foundation. All Rights Reserved.