JBossWeb源代码分析系列:Session定时失效分析
一、 Session失效的检查流程
JBoss AS在启动时会调用StandardEngine的start方法,在Start方法里会启动一个ContainerBackgroundProcessor的后台线程,该后台线程会定期地调用StandardEngine下的所有StandardContext的backgroundProcess方法。StandardContext的backgroundProcess将Session的失效处理委托给StandardManager的ProcessExpires完成。ProcessExpires方法会取出StandardConetext中的所有StandardSession,逐个调用StandardSession的isValid方法。IsValid方法负责判断Session是否失效,如果失效则调用StandardSession的Expire方法,发送Session失效事件并清除保存在Session中的其它信息,之后再调用StandardManager的Remove方法将该Session从StandardManager保存Session的HashMap中清除,至此整个Session的失效处理过程结束。
二、 Session失效的检查间隔
检查Session失效的时间间隔由两个参数确定,一个是后台线程ContainerBackgroundProcessor的轮询时间间隔,一个是ProcessExpires方法中检查Session失效的频率。检查失效的时间间隔 = 轮询的时间间隔 * 检查频率。涉及的关键代码如下:
ContainerBase.java
protected class ContainerBackgroundProcessor implements Runnable {
public void run() {
while (!threadDone) {
try {
Thread.sleep(backgroundProcessorDelay * 1000L);
} catch (InterruptedException e) {
;
}
ManagerBase.java
public void backgroundProcess() {
count = (count + 1) % processExpiresFrequency;
if (count == 0)
processExpires();
}
其中:
backgroundProcessDelay:在Tomcat配置文件的Engine元素中设置,缺省为10,也就是每隔10秒钟轮询一次。
processExpiresFrequency:在Tomcat配置文件的Manager元素中设置,缺省为6,也就是后台线程每轮询6次才进行1次Session是否失效的检查。
由此可以得出,缺省情况下Tomcat每分钟进行1次Session是否失效的检查。
三、 Session失效的检查算法
前面已经提到Session是否失效的判断在StandardSession的isValid方法中进行,其关键代码如下:
StandardSession.java
if (maxInactiveInterval >= 0) {
long timeNow = System.currentTimeMillis();
int timeIdle = (int) ((timeNow - thisAccessedTime) / 1000L);
if (timeIdle >= maxInactiveInterval) {
expire(true);
}
}
从上面的代码中可以看出,Session是否失效的判断条件为:
最大的不活动时间 <= 当前时间 — 最近的访问时间
由此可以得出确定Session是否失效取决于最大的不活动时间和最近的访问时间。
1. 最大不活动时间的确定
通常在web应用的web.xml中的session-config元素中设置:
<session-config>
<session-timeout>15</session-timeout>
</session-config>
缺省的最大不活动时间为30分钟。
2. 最近访问时间的确定
由上面的流程图可以看出,Http11Processor在处理每次请求时都会调用SecurityAssociationValve,然后由它调用Request的getSession方法,再调用StandardSession的access方法,access方法负责记录最近的访问时间thisAccessdTime,从而确保能够准确的计算客户端的最大不活动时间。






1条评论 关于 “JBossWeb源代码分析系列:Session定时失效分析”
由 vieri122 发表于2008-10-29
我又来了 嘿嘿 不错不错