org.apache.catalina.ha.session
Class SimpleTcpReplicationManager
java.lang.Object
   org.apache.catalina.session.ManagerBase
org.apache.catalina.session.ManagerBase
       org.apache.catalina.session.StandardManager
org.apache.catalina.session.StandardManager
           org.apache.catalina.ha.session.SimpleTcpReplicationManager
org.apache.catalina.ha.session.SimpleTcpReplicationManager
- All Implemented Interfaces: 
- java.beans.PropertyChangeListener, java.util.EventListener, javax.management.MBeanRegistration, ClusterManager, Lifecycle, Manager
- 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
 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.
- Version:
- 1.0 for TC 4.0
- Author:
- Filip Hanik, Bela Ban (modifications for synchronous replication)
 
 
 
 
| 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, sessionCreationTiming, sessionExpirationTiming, sessionIdLength, sessionMaxAliveTime, sessions, sm, support, TIMING_STATS_CACHE_SIZE | 
 
 
 
| Method Summary | 
|  ClusterManager | cloneFromTemplate()
 | 
|  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.
 | 
|  boolean | doDomainReplication()
 | 
|  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 descriptive short name of this Manager implementation.
 | 
|  ReplicationStream | getReplicationStream(byte[] data)Open Stream and use correct ClassLoader (Container) Switch
 ThreadClassLoader
 | 
|  ReplicationStream | getReplicationStream(byte[] data,
                     int offset,
                     int length)
 | 
|  boolean | isDefaultMode()
 | 
|  boolean | isManagerRunning()
 | 
|  boolean | isNotifyListenersOnReplication()
 | 
|  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 | setDomainReplication(boolean sendClusterDomainOnly)
 | 
|  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 | 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, getCreationTimestamp, getDigest, getDomain, getDuplicates, getEngine, getEntropy, getExpiredSessions, getJvmRoute, getLastAccessedTime, getLastAccessedTimestamp, getMaxActive, getMaxInactiveInterval, getNewSession, getObjectName, getProcessExpiresFrequency, getProcessingTime, getRandom, getRandomBytes, getRandomClass, getRandomFile, getSession, getSessionAttribute, getSessionAttributeNameFilter, getSessionAttributeNamePattern, getSessionAttributeValueClassNameFilter, getSessionAttributeValueClassNamePattern, getSessionAverageAliveTime, getSessionCounter, getSessionCreateRate, getSessionExpireRate, getSessionIdLength, getSessionMaxAliveTime, getWarnOnSessionAttributeFilterFailure, init, listSessionIds, postDeregister, postRegister, preDeregister, preRegister, processExpires, remove, removePropertyChangeListener, setAlgorithm, setDuplicates, setEntropy, setExpiredSessions, setMaxActive, setMaxInactiveInterval, setProcessExpiresFrequency, setProcessingTime, setRandomClass, setRandomFile, setSessionAttributeNameFilter, setSessionAttributeValueClassNameFilter, setSessionAverageAliveTime, setSessionCounter, setSessionIdLength, setSessionMaxAliveTime, setWarnOnSessionAttributeFilterFailure, willAttributeDistribute | 
 
| 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, willAttributeDistribute | 
 
log
public static 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.
 
 
SimpleTcpReplicationManager
public SimpleTcpReplicationManager()
- Constructor, just calls super()
 
doDomainReplication
public boolean doDomainReplication()
- 
- Specified by:
- doDomainReplicationin interface- ClusterManager
 
- 
- Returns:
- Manager send only to same cluster domain.
 
setDomainReplication
public void setDomainReplication(boolean sendClusterDomainOnly)
- 
- Specified by:
- setDomainReplicationin interface- ClusterManager
 
- 
- Parameters:
- sendClusterDomainOnly- The sendClusterDomainOnly to set.
 
isDefaultMode
public boolean isDefaultMode()
- 
- Specified by:
- isDefaultModein interface- ClusterManager
 
- 
- Returns:
- Returns the defaultMode.
 
setDefaultMode
public void setDefaultMode(boolean defaultMode)
- 
- Specified by:
- setDefaultModein 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:
- setClusterin 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:
- unloadin interface- Manager
- Overrides:
- unloadin 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:
- createSessionin interface- Manager
- Overrides:
- createSessionin class- StandardManager
 
- 
- Parameters:
- sessionId- The session id which should be used to create the
  new session; if- null, a new session id will be
  generated
- 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:
- getInvalidatedSessionsin 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:
- requestCompletedin 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
 
getReplicationStream
public ReplicationStream getReplicationStream(byte[] data)
                                       throws java.io.IOException
- Open Stream and use correct ClassLoader (Container) Switch
 ThreadClassLoader
 
- 
- Specified by:
- getReplicationStreamin interface- ClusterManager
 
- 
- Parameters:
- data-
- Returns:
- The object input stream
- Throws:
- java.io.IOException
 
getReplicationStream
public ReplicationStream getReplicationStream(byte[] data,
                                              int offset,
                                              int length)
                                       throws java.io.IOException
- 
- Specified by:
- getReplicationStreamin interface- ClusterManager
 
- 
- Throws:
- java.io.IOException
 
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 class: StandardManager
- Return the descriptive short name of this Manager implementation.
 
- 
- Specified by:
- getNamein interface- ClusterManager
- Overrides:
- getNamein class- StandardManager
 
- 
- Returns:
- The descriptive short name of this Manager implementation.
 
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:
- startin interface- Lifecycle
- Overrides:
- startin 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:
- stopin interface- Lifecycle
- Overrides:
- stopin 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:
- setDistributablein interface- Manager
- Overrides:
- setDistributablein class- ManagerBase
 
- 
- Parameters:
- dist- The new distributable flag
 
getDistributable
public boolean getDistributable()
- Description copied from class: ManagerBase
- Return the distributable flag for the sessions supported by
 this Manager.
 
- 
- Specified by:
- getDistributablein interface- Manager
- Overrides:
- getDistributablein 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:
- messageDataReceivedin 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:
- setNamein interface- ClusterManager
 
- 
 
isNotifyListenersOnReplication
public boolean isNotifyListenersOnReplication()
- 
- Specified by:
- isNotifyListenersOnReplicationin interface- ClusterManager
 
- 
 
setNotifyListenersOnReplication
public void setNotifyListenersOnReplication(boolean notifyListenersOnReplication)
- 
 
- 
 
getCluster
public CatalinaCluster getCluster()
- 
- Specified by:
- getClusterin interface- ClusterManager
 
- 
 
cloneFromTemplate
public ClusterManager cloneFromTemplate()
- 
- Specified by:
- cloneFromTemplatein interface- ClusterManager
 
- 
 
Copyright © 2000-2017 Apache Software Foundation. All Rights Reserved.