用session监听器简单实现统计在线用户数

项目目录结构以下,为一普通的javaweb项目,不须要添加任何jar包 输入图片说明css

原项目各文件代码以下:html

package com.my.count;

import javax.servlet.http.*;

public class SessionCounter implements HttpSessionListener {

    private static int activeSessions = 0;
    //session建立时执行
    public void sessionCreated(HttpSessionEvent se) {
        activeSessions++;
    }
    //session销毁时执行
    public void sessionDestroyed(HttpSessionEvent se) {
        if (activeSessions > 0)
            activeSessions--;
    }
    //获取活动的session个数(在线人数)
    public static int getActiveSessions() {
        return activeSessions;
    }

}

配置web.xml,注意去掉 //及后面的注释内容,不然web.xml 会有错误java

<listener>
      <listener-class>
          com.my.count.SessionCounter  //这里是包名加类名
      </listener-class>
  </listener>

接下来index.jsp页面web

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page import="com.my.count.SessionCounter"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'ApplicationTest.jsp' starting page</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>
  
  <body>
        在线人数为:<%=SessionCounter.getActiveSessions() %>
  </body>
</html>

原文提供内容很详细,把这些配置到项目访问一下,页面结果以下图 输入图片说明浏览器

看似是正常的,但仍是怀疑统计不许确,用jemeter软件模拟访问测试一下,测试前先修改SessionCounter类为以下内容, 输入图片说明session

代码以下:并发

package com.my.count;


import javax.servlet.http.*;

public class SessionCounter implements HttpSessionListener {

    private static int activeSessions = 0;
    //session建立时执行
    public void sessionCreated(HttpSessionEvent se) {
        activeSessions++;
        System.out.println("增长1个同时在线数="+activeSessions);
    }
    //session销毁时执行
    public void sessionDestroyed(HttpSessionEvent se) {
        //if (activeSessions > 0)
            activeSessions--;
        System.out.println("减小1个同时在线数="+activeSessions);
    }
    //获取活动的session个数(在线人数)
    public static int getActiveSessions() {
        return activeSessions;
    }

}

为了使session时间短一点,这里设置项目的session过时时间为1分钟,在web.xml里添加以下内容jsp

<!-- 设置项目session过时时间为1分钟 -->
  <session-config>    
  	<session-timeout>1</session-timeout>    
  </session-config>

web.xml完整内容以下 输入图片说明测试

启动项目并用多个浏览器访问结果,以下 输入图片说明 两个浏览器访问,显示数据为2.正常。如今用jemeter测试 输入图片说明 输入图片说明ui

启动测试 控制台输出到5000多,中止jemeter,而后等1分钟看控制台输出,结果分别以下图 输入图片说明 建立5000多个session。 等1分钟session过时后销毁,看控制台输出结果以下: 输入图片说明

看来监听session建立销毁来统计访问用户数并不许确。怀疑是并发致使的增长1个和减小1个不许确。 修改SessionCounter类以下 输入图片说明

代码:

package com.my.count;


import javax.servlet.http.*;

import sun.misc.Lock;

public class SessionCounter implements HttpSessionListener {

    private static volatile int activeSessions = 0;
    private static Lock l=new Lock();
    //session建立时执行
    public void sessionCreated(HttpSessionEvent se) {
    	getCount("+");
    }
    //session销毁时执行
    public void sessionDestroyed(HttpSessionEvent se) {
    	getCount("-");
    }
    //获取活动的session个数(在线人数)
    public static int getActiveSessions() {
        return activeSessions;
    }
    
    public  static void getCount(String regex) {
    	
    	try {
			l.lock();
	    	if(regex.equals("+")){
	    		activeSessions++;
	    		 System.out.println("++1个同时在线数="+activeSessions);
	    	}else if(regex.equals("-")){
	    		activeSessions--;
	    		 System.out.println("--1个同时在线数="+activeSessions);
	    	}
    	} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			l.unlock();
		}
    }

}

而后重启项目,用jemeter测试,查看控制台输出: 输入图片说明 建立5000多个session后中止jemeter,等1分钟看session销毁状况。 输入图片说明

此次准确了,问题就在于并发问题没妥善处理。

附上原做者博客地址,感谢做者提供的源码。 参考网址:输入图片说明 http://blog.csdn.net/u014756827/article/details/70169628

相关文章
相关标签/搜索