|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object org.apache.catalina.session.ManagerBase org.apache.catalina.cluster.session.DeltaManager
The DeltaManager manages replicated sessions by only replicating the deltas
in data. For applications written to handle this, the DeltaManager is the
optimal way of replicating data.
This code is almost identical to StandardManager with a difference in how it
persists sessions and some modifications to it.
IMPLEMENTATION NOTE : Correct behavior of session storing and
reloading depends upon external calls to the start()
and
stop()
methods of this class at the correct times.
Field Summary | |
protected boolean |
defaultMode
|
protected LifecycleSupport |
lifecycle
The lifecycle event support for this component. |
static org.apache.commons.logging.Log |
log
|
protected static java.lang.String |
managerName
The descriptive name of this Manager implementation (for logging). |
protected java.lang.String |
name
|
protected static StringManager |
sm
The string manager for this package. |
Fields inherited from class org.apache.catalina.session.ManagerBase |
algorithm, container, DEFAULT_ALGORITHM, devRandomSource, digest, distributable, domain, duplicates, entropy, expiredSessions, initialized, maxActive, maxInactiveInterval, mserver, oname, processExpiresFrequency, random, randomClass, randomIS, sessionAverageAliveTime, sessionCounter, sessionIdLength, sessionMaxAliveTime, sessions, 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 | |
DeltaManager()
|
Method Summary | |
void |
addLifecycleListener(LifecycleListener listener)
Add a lifecycle event listener to this component. |
void |
changeSessionId(Session session)
Change the session ID of the current session to a new randomly generated session ID. |
void |
changeSessionId(Session session,
boolean notify)
|
protected boolean |
checkSenderDomain(SessionMessage msg,
Member sender)
Test that sender and local domain is the same |
Session |
createEmptySession()
Create DeltaSession |
Session |
createSession(java.lang.String sessionId)
Construct and return a new session object, based on the default settings specified by this Manager's properties. |
Session |
createSession(java.lang.String sessionId,
boolean distribute)
create new session with check maxActiveSessions and send session creation to other cluster nodes. |
protected java.lang.String |
deserializeSessionId(byte[] data)
Load sessionID |
protected void |
deserializeSessions(byte[] data)
Load sessions from other cluster node. |
void |
expireAllLocalSessions()
Exipre all find sessions. |
LifecycleListener[] |
findLifecycleListeners()
Get the lifecycle listeners associated with this lifecycle. |
protected Member |
findSessionMasterMember()
Find the master of the session state |
void |
getAllClusterSessions()
get from first session master the backup from all clustered sessions |
static java.lang.ClassLoader[] |
getClassLoaders(Container container)
|
CatalinaCluster |
getCluster()
|
int |
getCounterNoStateTransfered()
|
long |
getCounterReceive_EVT_ALL_SESSION_DATA()
|
int |
getCounterReceive_EVT_ALL_SESSION_TRANSFERCOMPLETE()
|
long |
getCounterReceive_EVT_CHANGE_SESSION_ID()
|
long |
getCounterReceive_EVT_GET_ALL_SESSIONS()
|
long |
getCounterReceive_EVT_SESSION_ACCESSED()
|
long |
getCounterReceive_EVT_SESSION_CREATED()
|
long |
getCounterReceive_EVT_SESSION_DELTA()
|
long |
getCounterReceive_EVT_SESSION_EXPIRED()
|
long |
getCounterSend_EVT_ALL_SESSION_DATA()
|
int |
getCounterSend_EVT_ALL_SESSION_TRANSFERCOMPLETE()
|
long |
getCounterSend_EVT_CHANGE_SESSION_ID()
|
long |
getCounterSend_EVT_GET_ALL_SESSIONS()
|
long |
getCounterSend_EVT_SESSION_ACCESSED()
|
long |
getCounterSend_EVT_SESSION_CREATED()
|
long |
getCounterSend_EVT_SESSION_DELTA()
|
long |
getCounterSend_EVT_SESSION_EXPIRED()
|
int |
getExpireTolerance()
|
java.lang.String |
getInfo()
Return descriptive information about this Manager implementation and the corresponding version number, in the format <description>/<version> . |
java.lang.String[] |
getInvalidatedSessions()
When the manager expires session not tied to a request. |
int |
getMaxActiveSessions()
Return the maximum number of active Sessions allowed, or -1 for no limit. |
java.lang.String |
getName()
Return the descriptive short name of this Manager implementation. |
protected DeltaSession |
getNewDeltaSession()
Get new session class to be used in the doLoad() method. |
long |
getProcessingTime()
|
int |
getReceivedQueueSize()
|
int |
getRejectedSessions()
Number of session creations that failed due to maxActiveSessions |
int |
getSendAllSessionsSize()
|
int |
getSendAllSessionsWaitTime()
|
long |
getSessionReplaceCounter()
|
boolean |
getStateTransfered()
is session state transfered complete? |
int |
getStateTransferTimeout()
|
int |
getUpdateActiveInterval()
|
protected void |
handleALL_SESSION_DATA(SessionMessage msg,
Member sender)
handle receive sessions from other not ( restart ) |
protected void |
handleALL_SESSION_TRANSFERCOMPLETE(SessionMessage msg,
Member sender)
handle receive session state is complete transfered |
protected void |
handleCHANGE_SESSION_ID(SessionMessage msg,
Member sender)
handle receive change sessionID at other node |
protected void |
handleGET_ALL_SESSIONS(SessionMessage msg,
Member sender)
handle receive that other node want all sessions ( restart ) a) send all sessions with one message b) send session at blocks After sending send state is complete transfered |
protected void |
handleSESSION_ACCESSED(SessionMessage msg,
Member sender)
handle receive session is access at other node ( primary session is now false) |
protected void |
handleSESSION_CREATED(SessionMessage msg,
Member sender)
handle receive new session is created at other node (create backup - primary false) |
protected void |
handleSESSION_DELTA(SessionMessage msg,
Member sender)
handle receive session delta |
protected void |
handleSESSION_EXPIRED(SessionMessage msg,
Member sender)
handle receive session is expire at other node ( expire session also here) |
boolean |
isDefaultMode()
|
boolean |
isExpireSessionsOnShutdown()
|
boolean |
isNotifyListenersOnReplication()
|
boolean |
isNotifySessionListenersOnReplication()
|
boolean |
isSendAllSessions()
|
boolean |
isSendClusterDomainOnly()
|
boolean |
isStateTimestampDrop()
|
void |
load()
Load any currently active sessions that were previously unloaded to the appropriate persistence mechanism, if any. |
protected DeltaRequest |
loadDeltaRequest(DeltaSession session,
byte[] data)
Load Deltarequest from external node Load the Class at container classloader |
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 java.io.ObjectInputStream |
openDeserializeObjectStream(byte[] data)
Open Stream and use correct ClassLoader (Container) Switch ThreadClassLoader |
void |
propertyChange(java.beans.PropertyChangeEvent event)
Process property change events from our associated Context. |
protected void |
registerSessionAtReplicationValve(DeltaSession session)
Register cross context session at replication valve thread local |
void |
removeLifecycleListener(LifecycleListener listener)
Remove a lifecycle event listener from this component. |
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. |
ClusterMessage |
requestCompleted(java.lang.String sessionId,
boolean expires)
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 |
resetStatistics()
Reset manager statistics |
protected void |
send(SessionMessage msg)
Send messages to other backup member (domain or all) |
protected void |
sendCreateSession(java.lang.String sessionId,
DeltaSession session)
Send create session evt to all backup node |
protected void |
sendSessions(Member sender,
Session[] currentSessions,
long sendTimestamp)
send a block of session to sender |
protected byte[] |
serializeSessionId(java.lang.String sessionId)
serialize sessionID |
protected byte[] |
serializeSessions(Session[] currentSessions)
Save any currently active sessions in the appropriate persistence mechanism, if any. |
protected void |
sessionExpired(java.lang.String id)
send session expired to other cluster nodes |
void |
setCluster(CatalinaCluster cluster)
|
void |
setContainer(Container container)
Set the Container with which this Manager has been associated. |
void |
setDefaultMode(boolean defaultMode)
|
void |
setExpireSessionsOnShutdown(boolean expireSessionsOnShutdown)
|
void |
setExpireTolerance(int expireTolerance)
|
void |
setMaxActiveSessions(int max)
Set the maximum number of actives Sessions allowed, or -1 for no limit. |
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 |
setNotifySessionListenersOnReplication(boolean notifyListenersCreateSessionOnReplication)
|
void |
setRejectedSessions(int rejectedSessions)
Sets the number of sessions that were not created because the maximum number of active sessions was reached. |
void |
setSendAllSessions(boolean sendAllSessions)
|
void |
setSendAllSessionsSize(int sendAllSessionsSize)
|
void |
setSendAllSessionsWaitTime(int sendAllSessionsWaitTime)
|
void |
setSendClusterDomainOnly(boolean sendClusterDomainOnly)
|
void |
setStateTimestampDrop(boolean isTimestampDrop)
|
void |
setStateTransfered(boolean stateTransfered)
set that state ist complete transfered |
void |
setStateTransferTimeout(int timeoutAllSession)
|
void |
setUpdateActiveInterval(int updateActiveInterval)
|
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()
Save any currently active sessions in the appropriate persistence mechanism, if any. |
protected byte[] |
unloadDeltaRequest(DeltaRequest deltaRequest)
serialize DeltaRequest |
protected void |
waitForSendAllSessions(long beforeSendTime)
Wait that cluster session state is transfer or timeout after 60 Sec With stateTransferTimeout == -1 wait that backup is transfered (forever mode) |
Methods inherited from class java.lang.Object |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Field Detail |
public static org.apache.commons.logging.Log log
protected static StringManager sm
protected static java.lang.String managerName
protected java.lang.String name
protected boolean defaultMode
protected LifecycleSupport lifecycle
Constructor Detail |
public DeltaManager()
Method Detail |
public static java.lang.ClassLoader[] getClassLoaders(Container container)
public java.lang.String getInfo()
<description>/<version>
.
getInfo
in interface Manager
getInfo
in class ManagerBase
public void setName(java.lang.String name)
ClusterManager
setName
in interface ClusterManager
name
- public java.lang.String getName()
getName
in interface ClusterManager
getName
in class ManagerBase
public int getUpdateActiveInterval()
public void setUpdateActiveInterval(int updateActiveInterval)
public int getExpireTolerance()
public void setExpireTolerance(int expireTolerance)
public long getCounterSend_EVT_GET_ALL_SESSIONS()
public long getCounterSend_EVT_SESSION_ACCESSED()
public long getCounterSend_EVT_SESSION_CREATED()
public long getCounterSend_EVT_SESSION_DELTA()
public long getCounterSend_EVT_SESSION_EXPIRED()
public long getCounterSend_EVT_ALL_SESSION_DATA()
public int getCounterSend_EVT_ALL_SESSION_TRANSFERCOMPLETE()
public long getCounterSend_EVT_CHANGE_SESSION_ID()
public long getCounterReceive_EVT_ALL_SESSION_DATA()
public long getCounterReceive_EVT_GET_ALL_SESSIONS()
public long getCounterReceive_EVT_SESSION_ACCESSED()
public long getCounterReceive_EVT_SESSION_CREATED()
public long getCounterReceive_EVT_SESSION_DELTA()
public long getCounterReceive_EVT_SESSION_EXPIRED()
public int getCounterReceive_EVT_ALL_SESSION_TRANSFERCOMPLETE()
public long getCounterReceive_EVT_CHANGE_SESSION_ID()
public long getProcessingTime()
getProcessingTime
in class ManagerBase
public long getSessionReplaceCounter()
public int getRejectedSessions()
getRejectedSessions
in interface Manager
public void setRejectedSessions(int rejectedSessions)
Manager
setRejectedSessions
in interface Manager
rejectedSessions
- Number of rejected sessionspublic int getCounterNoStateTransfered()
public int getReceivedQueueSize()
public int getStateTransferTimeout()
public void setStateTransferTimeout(int timeoutAllSession)
timeoutAllSession
- The timeoutpublic boolean getStateTransfered()
public void setStateTransfered(boolean stateTransfered)
stateTransfered
- public int getSendAllSessionsWaitTime()
public void setSendAllSessionsWaitTime(int sendAllSessionsWaitTime)
sendAllSessionsWaitTime
- The sendAllSessionsWaitTime to set at msec.public boolean isSendClusterDomainOnly()
isSendClusterDomainOnly
in interface ClusterManager
public void setSendClusterDomainOnly(boolean sendClusterDomainOnly)
setSendClusterDomainOnly
in interface ClusterManager
sendClusterDomainOnly
- The sendClusterDomainOnly to set.public boolean isStateTimestampDrop()
public void setStateTimestampDrop(boolean isTimestampDrop)
isTimestampDrop
- The new flag valuepublic int getMaxActiveSessions()
public void setMaxActiveSessions(int max)
max
- The new maximum number of sessionspublic boolean isSendAllSessions()
public void setSendAllSessions(boolean sendAllSessions)
sendAllSessions
- The sendAllSessions to set.public int getSendAllSessionsSize()
public void setSendAllSessionsSize(int sendAllSessionsSize)
sendAllSessionsSize
- The sendAllSessionsSize to set.public boolean isNotifySessionListenersOnReplication()
public void setNotifySessionListenersOnReplication(boolean notifyListenersCreateSessionOnReplication)
notifyListenersCreateSessionOnReplication
- The notifySessionListenersOnReplication to set.public boolean isExpireSessionsOnShutdown()
public void setExpireSessionsOnShutdown(boolean expireSessionsOnShutdown)
public boolean isNotifyListenersOnReplication()
public void setNotifyListenersOnReplication(boolean notifyListenersOnReplication)
public boolean isDefaultMode()
isDefaultMode
in interface ClusterManager
public void setDefaultMode(boolean defaultMode)
setDefaultMode
in interface ClusterManager
defaultMode
- The defaultMode to set.public CatalinaCluster getCluster()
getCluster
in interface ClusterManager
public void setCluster(CatalinaCluster cluster)
setCluster
in interface ClusterManager
public void setContainer(Container container)
setContainer
in interface Manager
setContainer
in class ManagerBase
container
- The associated Containerpublic Session createSession(java.lang.String sessionId)
null
.
createSession
in interface Manager
createSession
in class ManagerBase
sessionId
- The session id which should be used to create the
new session; if null
, a new session id will be
generated
java.lang.IllegalStateException
- if a new session cannot be instantiated for any reason
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
.
java.lang.IllegalStateException
- if a new session cannot be instantiated for any reasonpublic Session createSession(java.lang.String sessionId, boolean distribute)
distribute
-
protected void sendCreateSession(java.lang.String sessionId, DeltaSession session)
sessionId
- session
- protected void send(SessionMessage msg)
msg
- Session messagepublic Session createEmptySession()
createEmptySession
in interface Manager
createEmptySession
in class ManagerBase
Manager.createEmptySession()
protected DeltaSession getNewDeltaSession()
public void changeSessionId(Session session)
changeSessionId
in interface Manager
changeSessionId
in class ManagerBase
session
- The session to change the session ID forpublic void changeSessionId(Session session, boolean notify)
protected byte[] serializeSessionId(java.lang.String sessionId) throws java.io.IOException
java.io.IOException
- if an input/output error occursprotected java.lang.String deserializeSessionId(byte[] data) throws java.io.IOException
java.io.IOException
- if an input/output error occursprotected DeltaRequest loadDeltaRequest(DeltaSession session, byte[] data) throws java.lang.ClassNotFoundException, java.io.IOException
session
- data
- message data
java.lang.ClassNotFoundException
java.io.IOException
DeltaRequest.readExternal(java.io.ObjectInput)
protected byte[] unloadDeltaRequest(DeltaRequest deltaRequest) throws java.io.IOException
deltaRequest
-
java.io.IOException
DeltaRequest.writeExternal(java.io.ObjectOutput)
protected void deserializeSessions(byte[] data) throws java.lang.ClassNotFoundException, java.io.IOException
java.lang.ClassNotFoundException
- if a serialized class cannot be found during the reload
java.io.IOException
- if an input/output error occursprotected java.io.ObjectInputStream openDeserializeObjectStream(byte[] data) throws java.io.IOException
data
-
java.io.IOException
protected byte[] serializeSessions(Session[] currentSessions) throws java.io.IOException
java.io.IOException
- if an input/output error occurspublic void addLifecycleListener(LifecycleListener listener)
addLifecycleListener
in interface Lifecycle
listener
- The listener to addpublic LifecycleListener[] findLifecycleListeners()
findLifecycleListeners
in interface Lifecycle
public void removeLifecycleListener(LifecycleListener listener)
removeLifecycleListener
in interface Lifecycle
listener
- The listener to removepublic void start() throws LifecycleException
configure()
,
and before any of the public methods of the component are utilized.
start
in interface Lifecycle
LifecycleException
- if this component detects a fatal error that prevents this
component from being usedpublic void getAllClusterSessions()
findSessionMasterMember()
protected void registerSessionAtReplicationValve(DeltaSession session)
session
- cross context sessionprotected Member findSessionMasterMember()
protected void waitForSendAllSessions(long beforeSendTime)
public void stop() throws LifecycleException
stop
in interface Lifecycle
LifecycleException
- if this component detects a fatal error that needs to be
reportedpublic void propertyChange(java.beans.PropertyChangeEvent event)
propertyChange
in interface java.beans.PropertyChangeListener
event
- The property change event that has occurredpublic void messageDataReceived(ClusterMessage cmsg)
messageDataReceived
in interface ClusterManager
cmsg
- -
the message received.public ClusterMessage requestCompleted(java.lang.String sessionId)
requestCompleted
in interface ClusterManager
sessionId
- -
the sessionId that just completed.
public ClusterMessage requestCompleted(java.lang.String sessionId, boolean expires)
sessionId
- -
the sessionId that just completed.expires
- -
whether this method has been called during session expiration
public void resetStatistics()
public void load()
Manager
load
in interface Manager
public void unload()
Manager
unload
in interface Manager
protected void sessionExpired(java.lang.String id)
id
- session idpublic void expireAllLocalSessions()
public java.lang.String[] getInvalidatedSessions()
getInvalidatedSessions
in interface ClusterManager
protected boolean checkSenderDomain(SessionMessage msg, Member sender)
protected void messageReceived(SessionMessage msg, Member sender)
msg
- -
the message receivedsender
- -
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 nodeprotected void handleALL_SESSION_TRANSFERCOMPLETE(SessionMessage msg, Member sender)
msg
- sender
- protected void handleSESSION_DELTA(SessionMessage msg, Member sender) throws java.io.IOException, java.lang.ClassNotFoundException
msg
- sender
-
java.io.IOException
java.lang.ClassNotFoundException
protected void handleSESSION_ACCESSED(SessionMessage msg, Member sender) throws java.io.IOException
msg
- sender
-
java.io.IOException
protected void handleSESSION_EXPIRED(SessionMessage msg, Member sender) throws java.io.IOException
msg
- sender
-
java.io.IOException
protected void handleSESSION_CREATED(SessionMessage msg, Member sender)
msg
- sender
- protected void handleALL_SESSION_DATA(SessionMessage msg, Member sender) throws java.lang.ClassNotFoundException, java.io.IOException
msg
- sender
-
java.lang.ClassNotFoundException
java.io.IOException
protected void handleGET_ALL_SESSIONS(SessionMessage msg, Member sender) throws java.io.IOException
msg
- sender
-
java.io.IOException
protected void handleCHANGE_SESSION_ID(SessionMessage msg, Member sender) throws java.io.IOException
msg
- sender
-
java.io.IOException
protected void sendSessions(Member sender, Session[] currentSessions, long sendTimestamp) throws java.io.IOException
sender
- currentSessions
- sendTimestamp
-
java.io.IOException
|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |