Package org.apache.catalina.ha.tcp
Class ReplicationValve
- java.lang.Object
-
- org.apache.catalina.util.LifecycleBase
-
- org.apache.catalina.util.LifecycleMBeanBase
-
- org.apache.catalina.valves.ValveBase
-
- org.apache.catalina.ha.tcp.ReplicationValve
-
- All Implemented Interfaces:
javax.management.MBeanRegistration
,Contained
,ClusterValve
,JmxEnabled
,Lifecycle
,Valve
public class ReplicationValve extends ValveBase implements ClusterValve
Implementation of a Valve that logs interesting contents from the specified Request (before processing) and the corresponding Response (after processing). It is especially useful in debugging problems related to headers and cookies.
This Valve may be attached to any Container, depending on the granularity of the logging you wish to perform.
primaryIndicator=true, then the request attribute org.apache.catalina.ha.tcp.isPrimarySession. is set true, when request processing is at sessions primary node.
- Author:
- Craig R. McClanahan, Peter Rossbach
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from interface org.apache.catalina.Lifecycle
Lifecycle.SingleUse
-
-
Field Summary
Fields Modifier and Type Field Description protected java.lang.ThreadLocal<java.util.ArrayList<DeltaSession>>
crossContextSessions
crossContext session containerprotected boolean
doProcessingStats
doProcessingStats (default = off)protected java.util.regex.Pattern
filter
Filter expressionprotected long
lastSendTime
protected long
nrOfCrossContextSendRequests
protected long
nrOfFilterRequests
protected long
nrOfRequests
protected long
nrOfSendRequests
protected boolean
primaryIndicator
must primary change indicator setprotected java.lang.String
primaryIndicatorName
Name of primary change indicator as request attributeprotected static StringManager
sm
The StringManager for this package.protected long
totalRequestTime
protected long
totalSendTime
-
Fields inherited from class org.apache.catalina.valves.ValveBase
asyncSupported, container, containerLog, next
-
Fields inherited from interface org.apache.catalina.Lifecycle
AFTER_DESTROY_EVENT, AFTER_INIT_EVENT, AFTER_START_EVENT, AFTER_STOP_EVENT, BEFORE_DESTROY_EVENT, BEFORE_INIT_EVENT, BEFORE_START_EVENT, BEFORE_STOP_EVENT, CONFIGURE_START_EVENT, CONFIGURE_STOP_EVENT, PERIODIC_EVENT, START_EVENT, STOP_EVENT
-
-
Constructor Summary
Constructors Constructor Description ReplicationValve()
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description protected void
createPrimaryIndicator(Request request)
Mark Request that processed at primary node with attribute primaryIndicatorNameboolean
doStatistics()
Calc processing statsCatalinaCluster
getCluster()
Returns the cluster the cluster deployer is associated withjava.lang.String
getFilter()
long
getLastSendTime()
long
getNrOfCrossContextSendRequests()
long
getNrOfFilterRequests()
long
getNrOfRequests()
long
getNrOfSendRequests()
java.lang.String
getPrimaryIndicatorName()
long
getTotalRequestTime()
long
getTotalSendTime()
void
invoke(Request request, Response response)
Log the interesting request parameters, invoke the next Valve in the sequence, and log the interesting response parameters.boolean
isPrimaryIndicator()
protected boolean
isRequestWithoutSessionChange(java.lang.String uri)
is request without possible session changevoid
registerReplicationSession(DeltaSession session)
Register all cross context sessions inside endAccess.protected void
resetDeltaRequest(Session session)
Reset DeltaRequest from sessionprotected void
resetReplicationRequest(Request request, boolean isCrossContext)
Fix memory leak for long sessions with many changes, when no backup member exists!void
resetStatistics()
reset the active statisticsprotected void
send(ClusterManager manager, java.lang.String sessionId)
send manager requestCompleted message to clusterprotected void
sendCrossContextSession()
Send all changed cross context sessions to backupsprotected void
sendInvalidSessions(ClusterManager manager)
check for session invalidationsprotected void
sendMessage(Session session, ClusterManager manager)
Send message delta message from request sessionprotected void
sendReplicationMessage(Request request, long totalstart, boolean isCrossContext, ClusterManager clusterManager)
protected void
sendSessionReplicationMessage(Request request, ClusterManager manager)
Send Cluster Replication Requestvoid
setCluster(CatalinaCluster cluster)
Associates the cluster deployer with a clustervoid
setFilter(java.lang.String filter)
compile filter string to regular expressionvoid
setPrimaryIndicator(boolean primaryIndicator)
void
setPrimaryIndicatorName(java.lang.String primaryIndicatorName)
void
setStatistics(boolean doProcessingStats)
Set Calc processing statsprotected void
startInternal()
Start this component and implement the requirements ofLifecycleBase.startInternal()
.protected void
updateStats(long requestTime, long clusterTime)
Protocol cluster replications stats-
Methods inherited from class org.apache.catalina.valves.ValveBase
backgroundProcess, getContainer, getDomainInternal, getNext, getObjectNameKeyProperties, initInternal, isAsyncSupported, setAsyncSupported, setContainer, setNext, stopInternal, toString
-
Methods inherited from class org.apache.catalina.util.LifecycleMBeanBase
destroyInternal, getDomain, getObjectName, postDeregister, postRegister, preDeregister, preRegister, register, setDomain, unregister, unregister
-
Methods inherited from class org.apache.catalina.util.LifecycleBase
addLifecycleListener, destroy, findLifecycleListeners, fireLifecycleEvent, getState, getStateName, getThrowOnFailure, init, removeLifecycleListener, setState, setState, setThrowOnFailure, start, stop
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
-
Methods inherited from interface org.apache.catalina.Valve
backgroundProcess, getNext, isAsyncSupported, setNext
-
-
-
-
Field Detail
-
sm
protected static final StringManager sm
The StringManager for this package.
-
filter
protected java.util.regex.Pattern filter
Filter expression
-
crossContextSessions
protected final java.lang.ThreadLocal<java.util.ArrayList<DeltaSession>> crossContextSessions
crossContext session container
-
doProcessingStats
protected boolean doProcessingStats
doProcessingStats (default = off)
-
totalRequestTime
protected volatile long totalRequestTime
-
totalSendTime
protected volatile long totalSendTime
-
nrOfRequests
protected volatile long nrOfRequests
-
lastSendTime
protected volatile long lastSendTime
-
nrOfFilterRequests
protected volatile long nrOfFilterRequests
-
nrOfSendRequests
protected volatile long nrOfSendRequests
-
nrOfCrossContextSendRequests
protected volatile long nrOfCrossContextSendRequests
-
primaryIndicator
protected boolean primaryIndicator
must primary change indicator set
-
primaryIndicatorName
protected java.lang.String primaryIndicatorName
Name of primary change indicator as request attribute
-
-
Method Detail
-
getCluster
public CatalinaCluster getCluster()
Description copied from interface:ClusterValve
Returns the cluster the cluster deployer is associated with- Specified by:
getCluster
in interfaceClusterValve
- Returns:
- the cluster.
-
setCluster
public void setCluster(CatalinaCluster cluster)
Description copied from interface:ClusterValve
Associates the cluster deployer with a cluster- Specified by:
setCluster
in interfaceClusterValve
- Parameters:
cluster
- The cluster to set.
-
getFilter
public java.lang.String getFilter()
- Returns:
- the filter
-
setFilter
public void setFilter(java.lang.String filter)
compile filter string to regular expression- Parameters:
filter
- The filter to set.- See Also:
Pattern.compile(java.lang.String)
-
isPrimaryIndicator
public boolean isPrimaryIndicator()
- Returns:
- the primaryIndicator.
-
setPrimaryIndicator
public void setPrimaryIndicator(boolean primaryIndicator)
- Parameters:
primaryIndicator
- The primaryIndicator to set.
-
getPrimaryIndicatorName
public java.lang.String getPrimaryIndicatorName()
- Returns:
- the primaryIndicatorName.
-
setPrimaryIndicatorName
public void setPrimaryIndicatorName(java.lang.String primaryIndicatorName)
- Parameters:
primaryIndicatorName
- The primaryIndicatorName to set.
-
doStatistics
public boolean doStatistics()
Calc processing stats- Returns:
true
if statistics are enabled
-
setStatistics
public void setStatistics(boolean doProcessingStats)
Set Calc processing stats- Parameters:
doProcessingStats
- New flag value- See Also:
resetStatistics()
-
getLastSendTime
public long getLastSendTime()
- Returns:
- the lastSendTime.
-
getNrOfRequests
public long getNrOfRequests()
- Returns:
- the nrOfRequests.
-
getNrOfFilterRequests
public long getNrOfFilterRequests()
- Returns:
- the nrOfFilterRequests.
-
getNrOfCrossContextSendRequests
public long getNrOfCrossContextSendRequests()
- Returns:
- the nrOfCrossContextSendRequests.
-
getNrOfSendRequests
public long getNrOfSendRequests()
- Returns:
- the nrOfSendRequests.
-
getTotalRequestTime
public long getTotalRequestTime()
- Returns:
- the totalRequestTime.
-
getTotalSendTime
public long getTotalSendTime()
- Returns:
- the totalSendTime.
-
registerReplicationSession
public void registerReplicationSession(DeltaSession session)
Register all cross context sessions inside endAccess. Use a list with contains check, that the Portlet API can include a lot of fragments from same or different applications with session changes.- Parameters:
session
- cross context session
-
invoke
public void invoke(Request request, Response response) throws java.io.IOException, ServletException
Log the interesting request parameters, invoke the next Valve in the sequence, and log the interesting response parameters.- Specified by:
invoke
in interfaceValve
- Parameters:
request
- The servlet request to be processedresponse
- The servlet response to be created- Throws:
java.io.IOException
- if an input/output error occursServletException
- if a servlet error occurs
-
resetStatistics
public void resetStatistics()
reset the active statistics
-
startInternal
protected void startInternal() throws LifecycleException
Start this component and implement the requirements ofLifecycleBase.startInternal()
.- Overrides:
startInternal
in classValveBase
- Throws:
LifecycleException
- if this component detects a fatal error that prevents this component from being used
-
sendReplicationMessage
protected void sendReplicationMessage(Request request, long totalstart, boolean isCrossContext, ClusterManager clusterManager)
-
sendCrossContextSession
protected void sendCrossContextSession()
Send all changed cross context sessions to backups
-
resetReplicationRequest
protected void resetReplicationRequest(Request request, boolean isCrossContext)
Fix memory leak for long sessions with many changes, when no backup member exists!- Parameters:
request
- current request after response is generatedisCrossContext
- check crosscontext threadlocal
-
resetDeltaRequest
protected void resetDeltaRequest(Session session)
Reset DeltaRequest from session- Parameters:
session
- HttpSession from current request or cross context session
-
sendSessionReplicationMessage
protected void sendSessionReplicationMessage(Request request, ClusterManager manager)
Send Cluster Replication Request- Parameters:
request
- current requestmanager
- session manager
-
sendMessage
protected void sendMessage(Session session, ClusterManager manager)
Send message delta message from request session- Parameters:
session
- current sessionmanager
- session manager
-
send
protected void send(ClusterManager manager, java.lang.String sessionId)
send manager requestCompleted message to cluster- Parameters:
manager
- SessionManagersessionId
- sessionid from the manager- See Also:
DeltaManager.requestCompleted(String)
,SimpleTcpCluster.send(ClusterMessage)
-
sendInvalidSessions
protected void sendInvalidSessions(ClusterManager manager)
check for session invalidations- Parameters:
manager
- Associated manager
-
isRequestWithoutSessionChange
protected boolean isRequestWithoutSessionChange(java.lang.String uri)
is request without possible session change- Parameters:
uri
- The request uri- Returns:
- True if no session change
-
updateStats
protected void updateStats(long requestTime, long clusterTime)
Protocol cluster replications stats- Parameters:
requestTime
- Request timeclusterTime
- Cluster time
-
createPrimaryIndicator
protected void createPrimaryIndicator(Request request) throws java.io.IOException
Mark Request that processed at primary node with attribute primaryIndicatorName- Parameters:
request
- The Servlet request- Throws:
java.io.IOException
- IO error finding session
-
-