| Method from org.apache.catalina.cluster.session.JvmRouteBinderValve Detail: |
public void addLifecycleListener(LifecycleListener listener) {
lifecycle.addLifecycleListener(listener);
}
Add a lifecycle event listener to this component. |
protected void changeSessionID(Request request,
Response response,
String sessionId,
String newSessionID,
Session catalinaSession) {
lifecycle.fireLifecycleEvent("Before session migration",
catalinaSession);
request.setRequestedSessionId(newSessionID);
catalinaSession.setId(newSessionID);
if (catalinaSession instanceof DeltaSession)
((DeltaSession) catalinaSession).resetDeltaRequest();
setNewSessionCookie(request, response,newSessionID);
// set orginal sessionid at request, to allow application detect the
// change
if (sessionIdAttribute != null && !"".equals(sessionIdAttribute)) {
if (log.isDebugEnabled()) {
log.debug(sm.getString("jvmRoute.set.orignalsessionid",sessionIdAttribute,sessionId));
}
request.setAttribute(sessionIdAttribute, sessionId);
}
// now sending the change to all other clusternode!
ClusterManager manager = (ClusterManager)catalinaSession.getManager();
sendSessionIDClusterBackup(manager,request,sessionId, newSessionID);
lifecycle
.fireLifecycleEvent("After session migration", catalinaSession);
if (log.isDebugEnabled()) {
log.debug(sm.getString("jvmRoute.changeSession", sessionId,
newSessionID));
}
}
change session id and send to all cluster nodes |
public LifecycleListener[] findLifecycleListeners() {
return lifecycle.findLifecycleListeners();
}
Get the lifecycle listeners associated with this lifecycle. If this
Lifecycle has no listeners registered, a zero-length array is returned. |
public CatalinaCluster getCluster() {
return cluster;
}
|
public boolean getEnabled() {
return enabled;
}
|
public String getInfo() {
/*--Logic---------------------------------------------------*/
return (info);
}
Return descriptive information about this implementation. |
protected String getLocalJvmRoute(Request request) {
Manager manager = getManager(request);
if(manager instanceof ManagerBase)
return ((ManagerBase) manager).getJvmRoute();
return null ;
}
|
protected Manager getManager(Request request) {
Manager manager = request.getContext().getManager();
if (log.isDebugEnabled()) {
if(manager != null)
log.debug(sm.getString("jvmRoute.foundManager", manager, request.getContext().getName()));
else
log.debug(sm.getString("jvmRoute.notFoundManager", manager, request.getContext().getName()));
}
return manager;
}
|
public long getNumberOfSessions() {
return numberOfSessions;
}
|
public String getSessionIdAttribute() {
return sessionIdAttribute;
}
set session id attribute to failed node for request. |
protected void handleJvmRoute(Request request,
Response response,
String sessionId,
String localJvmRoute) {
// get requested jvmRoute.
String requestJvmRoute = null;
int index = sessionId.indexOf(".");
if (index > 0) {
requestJvmRoute = sessionId
.substring(index + 1, sessionId.length());
}
if (requestJvmRoute != null && !requestJvmRoute.equals(localJvmRoute)) {
if (log.isDebugEnabled()) {
log.debug(sm.getString("jvmRoute.failover", requestJvmRoute,
localJvmRoute, sessionId));
}
// OK - turnover the session ?
String newSessionID = sessionId.substring(0, index) + "."
+ localJvmRoute;
Session catalinaSession = null;
try {
catalinaSession = getManager(request).findSession(sessionId);
} catch (IOException e) {
// Hups!
}
if (catalinaSession != null) {
changeSessionID(request, response, sessionId, newSessionID,
catalinaSession);
numberOfSessions++;
} else {
if (log.isDebugEnabled()) {
log.debug(sm.getString("jvmRoute.cannotFindSession",
sessionId));
}
}
}
}
Handle jvmRoute stickyness after tomcat instance failed. After this
correction a new Cookie send to client with new jvmRoute and the
SessionID change propage to the other cluster nodes. |
protected void handlePossibleTurnover(Request request,
Response response) {
Session session = request.getSessionInternal(false);
if (session != null) {
long t1 = System.currentTimeMillis();
String jvmRoute = getLocalJvmRoute(request);
if (jvmRoute == null) {
if (log.isWarnEnabled())
log.warn(sm.getString("jvmRoute.missingJvmRouteAttribute"));
return;
}
if (request.isRequestedSessionIdFromURL()) {
if (log.isDebugEnabled())
log.debug(sm.getString("jvmRoute.skipURLSessionIDs"));
} else {
handleJvmRoute( request, response,session.getIdInternal(), jvmRoute);
}
if (log.isDebugEnabled()) {
long t2 = System.currentTimeMillis();
long time = t2 - t1;
log.debug(sm.getString("jvmRoute.turnoverInfo", new Long(time)));
}
}
}
handle possible session turn over. |
public void invoke(Request request,
Response response) throws IOException, ServletException {
if (getEnabled()
&& getCluster() != null
&& request.getContext() != null
&& request.getContext().getDistributable() ) {
// valve cluster can access manager - other cluster handle turnover
// at host level - hopefully!
Manager manager = request.getContext().getManager();
if (manager != null && manager instanceof ClusterManager
&& getCluster().getManager(((ClusterManager)manager).getName()) != null)
handlePossibleTurnover(request, response);
}
// Pass this request on to the next valve in our pipeline
getNext().invoke(request, response);
}
Detect possible the JVMRoute change at cluster backup node.. |
public void removeLifecycleListener(LifecycleListener listener) {
lifecycle.removeLifecycleListener(listener);
}
Remove a lifecycle event listener from this component. |
protected void sendSessionIDClusterBackup(ClusterManager manager,
Request request,
String sessionId,
String newSessionID) {
SessionIDMessage msg = new SessionIDMessage();
msg.setOrignalSessionID(sessionId);
msg.setBackupSessionID(newSessionID);
Context context = request.getContext();
msg.setContextPath(context.getPath());
msg.setHost(context.getParent().getName());
if(manager.isSendClusterDomainOnly())
cluster.sendClusterDomain(msg);
else
cluster.send(msg);
}
Send the changed Sessionid to all clusternodes. |
public void setCluster(CatalinaCluster cluster) {
this.cluster = cluster;
}
|
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
|
protected void setNewSessionCookie(Request request,
Response response,
String sessionId) {
if (response != null) {
Context context = request.getContext();
if (context.getCookies()) {
// set a new session cookie
Cookie newCookie = new Cookie(Globals.SESSION_COOKIE_NAME,
sessionId);
newCookie.setMaxAge(-1);
String contextPath = null;
if (!response.getConnector().getEmptySessionPath()
&& (context != null)) {
contextPath = context.getEncodedPath();
}
if ((contextPath != null) && (contextPath.length() > 0)) {
newCookie.setPath(contextPath);
} else {
newCookie.setPath("/");
}
if (request.isSecure()) {
newCookie.setSecure(true);
}
if (log.isDebugEnabled()) {
log.debug(sm.getString("jvmRoute.newSessionCookie",
sessionId, Globals.SESSION_COOKIE_NAME, newCookie
.getPath(), new Boolean(newCookie
.getSecure())));
}
response.addCookie(newCookie);
}
}
}
|
public void setSessionIdAttribute(String sessionIdAttribute) {
this.sessionIdAttribute = sessionIdAttribute;
}
get name of failed reqeust session attribute |
public void start() throws LifecycleException {
// Validate and update our current component state
if (started)
throw new LifecycleException(sm
.getString("jvmRoute.valve.alreadyStarted"));
lifecycle.fireLifecycleEvent(START_EVENT, null);
started = true;
if (cluster == null) {
Container hostContainer = getContainer();
// compatibility with JvmRouteBinderValve version 1.1
// ( setup at context.xml or context.xml.default )
if (!(hostContainer instanceof Host)) {
if (log.isWarnEnabled())
log.warn(sm.getString("jvmRoute.configure.warn"));
hostContainer = hostContainer.getParent();
}
if (hostContainer instanceof Host
&& ((Host) hostContainer).getCluster() != null) {
cluster = (CatalinaCluster) ((Host) hostContainer).getCluster();
} else {
Container engine = hostContainer.getParent() ;
if (engine instanceof Engine
&& ((Engine) engine).getCluster() != null) {
cluster = (CatalinaCluster) ((Engine) engine).getCluster();
}
}
}
if (cluster == null) {
throw new RuntimeException("No clustering support at container "
+ container.getName());
}
if (log.isInfoEnabled())
log.info(sm.getString("jvmRoute.valve.started"));
}
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. |
public void stop() throws LifecycleException {
// Validate and update our current component state
if (!started)
throw new LifecycleException(sm
.getString("jvmRoute.valve.notStarted"));
lifecycle.fireLifecycleEvent(STOP_EVENT, null);
started = false;
cluster = null;
numberOfSessions = 0;
if (log.isInfoEnabled())
log.info(sm.getString("jvmRoute.valve.stopped"));
}
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. |