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:
- MBeanRegistration,- Contained,- ClusterValve,- JmxEnabled,- Lifecycle,- Valve
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!
 
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.
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 SummaryNested classes/interfaces inherited from interface org.apache.catalina.LifecycleLifecycle.SingleUse
- 
Field SummaryFieldsModifier and TypeFieldDescriptionprotected CatalinaClusterthe clusterprotected booleanenabled this componentstatic final Logprotected longnumber of session that no at this tomcat instance hostedprotected Stringprotected static final StringManagerThe string manager for this package.Fields inherited from class org.apache.catalina.valves.ValveBaseasyncSupported, container, containerLog, nextFields 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
- 
Method SummaryModifier and TypeMethodDescriptionprotected voidchangeRequestSessionID(Request request, String sessionId, String newSessionID) Change Request Session idprotected voidchangeSessionAuthenticationNote(String sessionId, String newSessionID, Session catalinaSession) Change the current session ID that is stored in a session note during authentication.protected voidchangeSessionID(Request request, String sessionId, String newSessionID, Session catalinaSession) change session id and send to all cluster nodesReturns the cluster the cluster deployer is associated withbooleanprotected StringgetLocalJvmRoute(Request request) get jvmroute from engineprotected ManagergetManager(Request request) get ClusterManagerlongset session id attribute to failed node for request.protected voidhandleJvmRoute(Request request, String sessionId, String localJvmRoute) Handle jvmRoute stickiness after tomcat instance failed.protected voidhandlePossibleTurnover(Request request) handle possible session turn over.voidDetect possible the JVMRoute change at cluster backup node..voidsetCluster(CatalinaCluster cluster) Associates the cluster deployer with a clustervoidsetEnabled(boolean enabled) voidsetSessionIdAttribute(String sessionIdAttribute) get name of failed request session attributeprotected voidStart this component and implement the requirements ofLifecycleBase.startInternal().protected voidStop 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, toStringMethods inherited from class org.apache.catalina.util.LifecycleMBeanBasedestroyInternal, getDomain, getObjectName, postDeregister, postRegister, preDeregister, preRegister, register, setDomain, unregister, unregisterMethods inherited from class org.apache.catalina.util.LifecycleBaseaddLifecycleListener, destroy, findLifecycleListeners, fireLifecycleEvent, getState, getStateName, getThrowOnFailure, init, removeLifecycleListener, setState, setState, setThrowOnFailure, start, stopMethods inherited from class java.lang.Objectclone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitMethods inherited from interface org.apache.catalina.ValvebackgroundProcess, getNext, isAsyncSupported, setNext
- 
Field Details- 
log
- 
clusterthe cluster
- 
smThe string manager for this package.
- 
enabledprotected boolean enabledenabled this component
- 
numberOfSessionsprotected long numberOfSessionsnumber of session that no at this tomcat instance hosted
- 
sessionIdAttribute
 
- 
- 
Constructor Details- 
JvmRouteBinderValvepublic JvmRouteBinderValve()
 
- 
- 
Method Details- 
getSessionIdAttributeset session id attribute to failed node for request.- Returns:
- Returns the sessionIdAttribute.
 
- 
setSessionIdAttributeget 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.
 
- 
invokeDetect 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:
- IOException- if an input/output error has occurred
- ServletException- if a servlet error has occurred
 
- 
handlePossibleTurnoverhandle possible session turn over.- Parameters:
- request- current request
- See Also:
 
- 
getLocalJvmRouteget jvmroute from engine- Parameters:
- request- current request
- Returns:
- return jvmRoute from ManagerBase or null
 
- 
getManagerget ClusterManager- Parameters:
- request- current request
- Returns:
- manager or null
 
- 
getClusterDescription copied from interface:ClusterValveReturns the cluster the cluster deployer is associated with- Specified by:
- getClusterin interface- ClusterValve
- Returns:
- Returns the cluster.
 
- 
setClusterDescription copied from interface:ClusterValveAssociates the cluster deployer with a cluster- Specified by:
- setClusterin interface- ClusterValve
- Parameters:
- cluster- The cluster to set.
 
- 
handleJvmRouteHandle 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, String sessionId, 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
 
- 
changeRequestSessionIDChange Request Session id- Parameters:
- request- current request
- sessionId- original session id
- newSessionID- new session id for node migration
 
- 
changeSessionAuthenticationNoteprotected void changeSessionAuthenticationNote(String sessionId, 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)
 
- 
startInternalStart 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
 
- 
stopInternalStop 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
 
 
-