JBossWeb 的 Session 定时失效分析

绿悠悠 发布于 2010/06/08 06:57
阅读 1K+
收藏 1

一、 Session失效的检查流程

image

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次才进行1Session是否失效的检查。

由此可以得出,缺省情况下Tomcat每分钟进行1Session是否失效的检查。

 

三、 Session失效的检查算法

前面已经提到Session是否失效的判断在StandardSessionisValid方法中进行,其关键代码如下:

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. 最近访问时间的确定

image


由上面的流程图可以看出,Http11Processor在处理每次请求时都会调用SecurityAssociationValve,然后由它调用RequestgetSession方法,再调用StandardSessionaccess方法,access方法负责记录最近的访问时间thisAccessdTime,从而确保能够准确的计算客户端的最大不活动时间。

加载中
返回顶部
顶部