Tomcat的Session管理(二) - Session后台处理

Tomcat会开启一个后台线程每隔一段时间检查Session的有效性,这个线程是在Tomcat启动的时候当StardardEngine启动时随之启动的。可以参看StardardEngine的基类ContainerBase的#threadStart()方法:
	protected void threadStart() {
		if (thread != null)
			return;
		if (backgroundProcessorDelay <= 0)
			return;
		
		threadDone = false;
		String threadName = "ContainerBackgroundProcessor[" + toString() + "]";
		// 开启后台的监控线程
		thread = new Thread(new ContainerBackgroundProcessor(), threadName);
		thread.setDaemon(true);
		thread.start();

	}


这个方法启动了一个ContainerBackgroundProcessor类的线程,这个类重写的#run()方法中包括了对Session的有效性监控。具体的细节就不详细陈述了。每隔一段时间,此线程就会启动一次并调用了ManageBase的#backgroundProcess()方法。其源代码如下:
	public void backgroundProcess() {
		count = (count + 1) % processExpiresFrequency;
		if (count == 0)
			processExpires();
	}


每隔一段时间就会调用processExpires()方法去判断Session的有效性。
	public void processExpires() {
		// 现在的时间
		long timeNow = System.currentTimeMillis();
		// 所有的Session对象
		Session sessions[] = findSessions();
		int expireHere = 0;

		if (log.isDebugEnabled())
			log.debug("Start expire sessions " + getName() + " at " + timeNow + " sessioncount "
					+ sessions.length);
		for (int i = 0; i < sessions.length; i++) {
			// 判断并设定Session是否失效
			if (sessions[i] != null && !sessions[i].isValid()) {
				expireHere++;
			}
		}
		long timeEnd = System.currentTimeMillis();
		if (log.isDebugEnabled())
			log.debug("End expire sessions " + getName() + " processingTime " + (timeEnd - timeNow)
					+ " expired sessions: " + expireHere);
		processingTime += (timeEnd - timeNow);

	}


此方法最终调用了isValid()去判断和设定Session是否失效,源代码如下所示:
	public boolean isValid() {
		// 是否过期
		if (this.expiring) {
			return true;
		}
		// 是否有效
		if (!this.isValid) {
			return false;
		}
		// 正在使用中并且访问数大于0
		if (ACTIVITY_CHECK && accessCount.get() > 0) {
			return true;
		}

		if (maxInactiveInterval >= 0) {
			// 判断Session是否过期
			long timeNow = System.currentTimeMillis();
			int timeIdle = (int) ((timeNow - thisAccessedTime) / 1000L);
			if (timeIdle >= maxInactiveInterval) {
				// 设定Session过期
				expire(true);
			}
		}

		return (this.isValid);
	}

你可能感兴趣的:(thread,tomcat)