项目目录结构以下,为一普通的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