Methods Summary |
---|
private org.apache.catalina.Session | getSession(javax.servlet.ServletRequest request)
javax.servlet.http.HttpServletRequest httpReq =
(javax.servlet.http.HttpServletRequest) request;
javax.servlet.http.HttpSession httpSess = httpReq.getSession(false);
if(httpSess == null) {
return null;
}
String id = httpSess.getId();
Manager mgr = _context.getManager();
Session sess = null;
try {
sess = mgr.findSession(id);
} catch (java.io.IOException ex) {}
return sess;
|
public boolean | lockSession(javax.servlet.ServletRequest request)lock the session associated with this request
this will be a foreground lock
checks for background lock to clear
and does a decay poll loop to wait until
it is clear; after 5 times it takes control for
the foreground
boolean result = false;
Session sess = this.getSession(request);
//now lock the session
if(sess != null) {
long pollTime = 200L;
int maxNumberOfRetries = 7;
int tryNumber = 0;
boolean keepTrying = true;
boolean lockResult = false;
StandardSession stdSess = (StandardSession) sess;
//try to lock up to maxNumberOfRetries times
//poll and wait starting with 200 ms
while(keepTrying) {
lockResult = stdSess.lockForeground();
if(lockResult) {
keepTrying = false;
result = true;
break;
}
tryNumber++;
if(tryNumber < maxNumberOfRetries) {
pollTime = pollTime * 2L;
threadSleep(pollTime);
} else {
//tried to wait and lock maxNumberOfRetries times; throw an exception
//throw new ServletException("unable to acquire session lock");
//instead of above; unlock the background so we can take over
stdSess.unlockBackground();
}
}
}
return result;
|
protected void | threadSleep(long sleepTime)
try {
Thread.sleep(sleepTime);
} catch (InterruptedException e) {
;
}
|
public void | unlockSession(javax.servlet.ServletRequest request)unlock the session associated with this request
Session sess = this.getSession(request);
//now unlock the session
if(sess != null) {
StandardSession stdSess = (StandardSession) sess;
stdSess.unlockForeground();
}
|