Package org.apache.catalina.ha.session
Class JvmRouteBinderValve
- java.lang.Object
- 
- org.apache.catalina.util.LifecycleBase
- 
- org.apache.catalina.util.LifecycleMBeanBase
- 
- org.apache.catalina.valves.ValveBase
- 
- org.apache.catalina.ha.session.JvmRouteBinderValve
 
 
 
 
- 
- All Implemented Interfaces:
- javax.management.MBeanRegistration,- Contained,- ClusterValve,- JmxEnabled,- Lifecycle,- Valve
 
 public class JvmRouteBinderValve extends ValveBase implements ClusterValve Valve to handle Tomcat jvmRoute takeover using mod_jk module after node failure. After a node crashes, subsequent requests go to other cluster nodes. That incurs a drop in performance. When this Valve is enabled on a backup node and sees a request, which was intended for another (thus failed) node, it will rewrite the cookie jsessionid information to use the route to this backup cluster node, that answered the request. After the response is delivered to the client, all subsequent client requests will go directly to the backup node. The change of sessionid is also sent to all other cluster nodes. After all that, the session stickiness will work directly to the backup node and the traffic will not go back to the failed node after it is restarted!Add this Valve to your cluster definition at conf/server.xml . <Cluster> <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve" /> </Cluster> A Trick:
 You can enable this mod_jk turnover mode via JMX before you drop a node to all backup nodes! Set enable true on all JvmRouteBinderValve backups, disable worker at mod_jk and then drop node and restart it! Then enable mod_jk worker and disable JvmRouteBinderValves again. This use case means that only requested sessions are migrated.- Author:
- Peter Rossbach
 
- 
- 
Nested Class Summary- 
Nested classes/interfaces inherited from interface org.apache.catalina.LifecycleLifecycle.SingleUse
 
- 
 - 
Field SummaryFields Modifier and Type Field Description protected CatalinaClusterclusterthe clusterprotected booleanenabledenabled this componentstatic Loglogprotected longnumberOfSessionsnumber of session that no at this tomcat instance hostedprotected java.lang.StringsessionIdAttributeprotected static StringManagersmThe string manager for this package.- 
Fields inherited from class org.apache.catalina.valves.ValveBaseasyncSupported, container, containerLog, next
 - 
Fields inherited from class org.apache.catalina.util.LifecycleMBeanBasemserver
 - 
Fields inherited from interface org.apache.catalina.LifecycleAFTER_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 SummaryConstructors Constructor Description JvmRouteBinderValve()
 - 
Method SummaryAll Methods Instance Methods Concrete Methods Modifier and Type Method Description protected voidchangeRequestSessionID(Request request, java.lang.String sessionId, java.lang.String newSessionID)Change Request Session idprotected voidchangeSessionAuthenticationNote(java.lang.String sessionId, java.lang.String newSessionID, Session catalinaSession)Change the current session ID that is stored in a session note during authentication.protected voidchangeSessionID(Request request, java.lang.String sessionId, java.lang.String newSessionID, Session catalinaSession)change session id and send to all cluster nodesCatalinaClustergetCluster()Returns the cluster the cluster deployer is associated withbooleangetEnabled()protected java.lang.StringgetLocalJvmRoute(Request request)get jvmroute from engineprotected ManagergetManager(Request request)get ClusterManagerlonggetNumberOfSessions()java.lang.StringgetSessionIdAttribute()set session id attribute to failed node for request.protected voidhandleJvmRoute(Request request, java.lang.String sessionId, java.lang.String localJvmRoute)Handle jvmRoute stickiness after tomcat instance failed.protected voidhandlePossibleTurnover(Request request)handle possible session turn over.voidinvoke(Request request, Response response)Detect possible the JVMRoute change at cluster backup node..voidsetCluster(CatalinaCluster cluster)Associates the cluster deployer with a clustervoidsetEnabled(boolean enabled)voidsetSessionIdAttribute(java.lang.String sessionIdAttribute)get name of failed request session attributeprotected voidstartInternal()Start this component and implement the requirements ofLifecycleBase.startInternal().protected voidstopInternal()Stop this component and implement the requirements ofLifecycleBase.stopInternal().- 
Methods inherited from class org.apache.catalina.valves.ValveBasebackgroundProcess, getContainer, getDomainInternal, getNext, getObjectNameKeyProperties, initInternal, isAsyncSupported, setAsyncSupported, setContainer, setNext, toString
 - 
Methods inherited from class org.apache.catalina.util.LifecycleMBeanBasedestroyInternal, getDomain, getObjectName, postDeregister, postRegister, preDeregister, preRegister, register, setDomain, unregister
 - 
Methods inherited from class org.apache.catalina.util.LifecycleBaseaddLifecycleListener, destroy, findLifecycleListeners, fireLifecycleEvent, getState, getStateName, getThrowOnFailure, init, removeLifecycleListener, setState, setState, setThrowOnFailure, start, stop
 - 
Methods inherited from class java.lang.Objectclone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 - 
Methods inherited from interface org.apache.catalina.ValvebackgroundProcess, getNext, isAsyncSupported, setNext
 
- 
 
- 
- 
- 
Field Detail- 
logpublic static final Log log 
 - 
clusterprotected CatalinaCluster cluster the cluster
 - 
smprotected static final StringManager sm The string manager for this package.
 - 
enabledprotected boolean enabled enabled this component
 - 
numberOfSessionsprotected long numberOfSessions number of session that no at this tomcat instance hosted
 - 
sessionIdAttributeprotected java.lang.String sessionIdAttribute 
 
- 
 - 
Method Detail- 
getSessionIdAttributepublic java.lang.String getSessionIdAttribute() set session id attribute to failed node for request.- Returns:
- Returns the sessionIdAttribute.
 
 - 
setSessionIdAttributepublic void setSessionIdAttribute(java.lang.String sessionIdAttribute) get name of failed request session attribute- Parameters:
- sessionIdAttribute- The sessionIdAttribute to set.
 
 - 
getNumberOfSessionspublic long getNumberOfSessions() - Returns:
- Returns the number of migrated sessions.
 
 - 
getEnabledpublic boolean getEnabled() - Returns:
- Returns the enabled.
 
 - 
setEnabledpublic void setEnabled(boolean enabled) - Parameters:
- enabled- The enabled to set.
 
 - 
invokepublic void invoke(Request request, Response response) throws java.io.IOException, ServletException Detect possible the JVMRoute change at cluster backup node..- Specified by:
- invokein interface- Valve
- Parameters:
- request- tomcat request being processed
- response- tomcat response being processed
- Throws:
- java.io.IOException- if an input/output error has occurred
- ServletException- if a servlet error has occurred
 
 - 
handlePossibleTurnoverprotected void handlePossibleTurnover(Request request) handle possible session turn over.- Parameters:
- request- current request
- See Also:
- handleJvmRoute(Request, String, String)
 
 - 
getLocalJvmRouteprotected java.lang.String getLocalJvmRoute(Request request) get jvmroute from engine- Parameters:
- request- current request
- Returns:
- return jvmRoute from ManagerBase or null
 
 - 
getManagerprotected Manager getManager(Request request) get ClusterManager- Parameters:
- request- current request
- Returns:
- manager or null
 
 - 
getClusterpublic CatalinaCluster getCluster() Description copied from interface:ClusterValveReturns the cluster the cluster deployer is associated with- Specified by:
- getClusterin interface- ClusterValve
- Returns:
- Returns the cluster.
 
 - 
setClusterpublic void setCluster(CatalinaCluster cluster) Description copied from interface:ClusterValveAssociates the cluster deployer with a cluster- Specified by:
- setClusterin interface- ClusterValve
- Parameters:
- cluster- The cluster to set.
 
 - 
handleJvmRouteprotected void handleJvmRoute(Request request, java.lang.String sessionId, java.lang.String localJvmRoute) Handle jvmRoute stickiness after tomcat instance failed. After this correction a new Cookie send to client with new jvmRoute and the SessionID change propagate to the other cluster nodes.- Parameters:
- request- current request
- sessionId- request SessionID from Cookie
- localJvmRoute- local jvmRoute
 
 - 
changeSessionIDprotected void changeSessionID(Request request, java.lang.String sessionId, java.lang.String newSessionID, Session catalinaSession) change session id and send to all cluster nodes- Parameters:
- request- current request
- sessionId- original session id
- newSessionID- new session id for node migration
- catalinaSession- current session with original session id
 
 - 
changeRequestSessionIDprotected void changeRequestSessionID(Request request, java.lang.String sessionId, java.lang.String newSessionID) Change Request Session id- Parameters:
- request- current request
- sessionId- original session id
- newSessionID- new session id for node migration
 
 - 
changeSessionAuthenticationNoteprotected void changeSessionAuthenticationNote(java.lang.String sessionId, java.lang.String newSessionID, Session catalinaSession)Change the current session ID that is stored in a session note during authentication. It is part of the CSRF protection.- Parameters:
- sessionId- The original session ID
- newSessionID- The new session ID for node migration
- catalinaSession- The session object (that will be using the new session ID at the point this method is called)
 
 - 
startInternalprotected void startInternal() throws LifecycleExceptionStart this component and implement the requirements ofLifecycleBase.startInternal().- Overrides:
- startInternalin class- ValveBase
- Throws:
- LifecycleException- if this component detects a fatal error that prevents this component from being used
 
 - 
stopInternalprotected void stopInternal() throws LifecycleExceptionStop this component and implement the requirements ofLifecycleBase.stopInternal().- Overrides:
- stopInternalin class- ValveBase
- Throws:
- LifecycleException- if this component detects a fatal error that prevents this component from being used
 
 
- 
 
-