org.apache.catalina.ha.session

Class SimpleTcpReplicationManager

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.

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 CatalinaClustercluster
protected booleandefaultMode
protected booleandistributable
protected HashMapinvalidatedSessions
static Loglog
protected StringmChannelConfig
protected booleanmChannelStarted
protected booleanmExpireSessionsOnShutdown
Set to true if we don't want the sessions to expire on shutdown
protected StringmGroupName
protected booleanmManagerRunning
protected booleanmPrintToScreen
protected Stringname
protected booleanstateTransferred
Flag to keep track if the state has been transferred or not Assumes false.
protected booleansynchronousReplication
Use synchronous rather than asynchronous replication.
protected booleanuseDirtyFlag
Constructor Summary
SimpleTcpReplicationManager()
Constructor, just calls super()
Method Summary
ClusterManagercloneFromTemplate()
protected SessioncreateSession(String sessionId, boolean notify, boolean setId)
Creates a HTTP session.
SessioncreateSession(String sessionId)
Construct and return a new session object, based on the default settings specified by this Manager's properties.
booleandoDomainReplication()
CatalinaClustergetCluster()
booleangetDistributable()
booleangetExpireSessionsOnShutdown()
String[]getInvalidatedSessions()
StringgetName()
ReplicationStreamgetReplicationStream(byte[] data)
Open Stream and use correct ClassLoader (Container) Switch ThreadClassLoader
ReplicationStreamgetReplicationStream(byte[] data, int offset, int length)
booleanisDefaultMode()
booleanisManagerRunning()
booleanisNotifyListenersOnReplication()
booleanisStateTransferred()
voidmessageDataReceived(ClusterMessage cmsg)
protected voidmessageReceived(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 SessionreadSession(byte[] data, String sessionId)
Reinstantiates a serialized session from the data passed in.
ClusterMessagerequestCompleted(String sessionId)
voidsessionInvalidated(String sessionId)
voidsetCluster(CatalinaCluster cluster)
voidsetDefaultMode(boolean defaultMode)
voidsetDistributable(boolean dist)
voidsetDomainReplication(boolean sendClusterDomainOnly)
voidsetExpireSessionsOnShutdown(boolean expireSessionsOnShutdown)
voidsetName(String name)
voidsetNotifyListenersOnReplication(boolean notifyListenersOnReplication)
voidsetPrintToScreen(boolean printtoscreen)
voidsetSynchronousReplication(boolean flag)
voidsetUseDirtyFlag(boolean usedirtyflag)
voidstart()
Prepare for the beginning of active use of the public methods of this component.
voidstop()
Gracefully terminate the active use of the public methods of this component.
voidunload()
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

Field Detail

cluster

protected CatalinaCluster cluster

defaultMode

protected boolean defaultMode

distributable

protected boolean distributable

invalidatedSessions

protected HashMap invalidatedSessions

log

public static Log log

mChannelConfig

protected String mChannelConfig

mChannelStarted

protected boolean mChannelStarted

mExpireSessionsOnShutdown

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

mGroupName

protected String mGroupName

mManagerRunning

protected boolean mManagerRunning

mPrintToScreen

protected boolean mPrintToScreen

name

protected String name

stateTransferred

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

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.

useDirtyFlag

protected boolean useDirtyFlag

Constructor Detail

SimpleTcpReplicationManager

public SimpleTcpReplicationManager()
Constructor, just calls super()

Method Detail

cloneFromTemplate

public ClusterManager cloneFromTemplate()

createSession

protected Session createSession(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(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.

Throws: IllegalStateException if a new session cannot be instantiated for any reason

doDomainReplication

public boolean doDomainReplication()

getCluster

public CatalinaCluster getCluster()

getDistributable

public boolean getDistributable()

getExpireSessionsOnShutdown

public boolean getExpireSessionsOnShutdown()

getInvalidatedSessions

public String[] getInvalidatedSessions()

getName

public String getName()

getReplicationStream

public ReplicationStream getReplicationStream(byte[] data)
Open Stream and use correct ClassLoader (Container) Switch ThreadClassLoader

Parameters: data

Returns: The object input stream

Throws: IOException

getReplicationStream

public ReplicationStream getReplicationStream(byte[] data, int offset, int length)

isDefaultMode

public boolean isDefaultMode()

Returns: Returns the defaultMode.

isManagerRunning

public boolean isManagerRunning()

isNotifyListenersOnReplication

public boolean isNotifyListenersOnReplication()

isStateTransferred

public boolean isStateTransferred()

messageDataReceived

public void messageDataReceived(ClusterMessage cmsg)

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

readSession

protected Session readSession(byte[] data, 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

requestCompleted

public ClusterMessage requestCompleted(String sessionId)

sessionInvalidated

public void sessionInvalidated(String sessionId)

setCluster

public void setCluster(CatalinaCluster cluster)

setDefaultMode

public void setDefaultMode(boolean defaultMode)

Parameters: defaultMode The defaultMode to set.

setDistributable

public void setDistributable(boolean dist)

setDomainReplication

public void setDomainReplication(boolean sendClusterDomainOnly)

Parameters: sendClusterDomainOnly The sendClusterDomainOnly to set.

setExpireSessionsOnShutdown

public void setExpireSessionsOnShutdown(boolean expireSessionsOnShutdown)

setName

public void setName(String name)

setNotifyListenersOnReplication

public void setNotifyListenersOnReplication(boolean notifyListenersOnReplication)

setPrintToScreen

public void setPrintToScreen(boolean printtoscreen)

setSynchronousReplication

public void setSynchronousReplication(boolean flag)

setUseDirtyFlag

public void setUseDirtyFlag(boolean usedirtyflag)

start

public void start()
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.

Throws: 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()
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.

Throws: IllegalStateException if this component has not been started LifecycleException if this component detects a fatal error that needs to be reported

unload

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

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

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