java 统计在线人数问题
以前没做过这种功能,现在遇到了,有些地方不明白,所以问下大家,该需求我相信大家都比较熟悉吧,所以需求我不作过多解释,我想讨论的是如果解决:用户断网,用户直接关闭浏览器(当然可以使用浏览器关闭事件),用户结束任务管理器,用户直接关闭电脑等。在这种情况大家是怎么处理的?
平台(登录后才能访问页面,没登录前访问项目处于登录页面,就是登录后才算真正在线)在线统计的时候同一个账号可以多处登录,我的思路是:登录后,把用户的id和登录时间作为key,最后访问时间作为value放入一个map对像(对象名暂时定为UserMapSession)。另外在用户访问的页面定时向服务器请求一次表示在线(定时时间为一分钟, 这样就可以解决用户非正常退出造成统计数量不准的问题),服务端对定时访问的信自进行相关处理(主要是更新最后访问时间)。然后开一个线程来定时迭代这个map,把最后访问时间大于10分钟(时间自己定)的用户对像作为退出对像进行清理。这种思路可行不,大家发表意见,谢谢
------解决方案--------------------一分钟一次统计的话 如果在线100万人的话 每一分钟就要处理100万数据 你自己看着办
------解决方案--------------------还是要有一个预判,就是最大有可能会有多少人同时在线。像这种的话一般都是很难精确统计的,而且1分钟一次负载太大了,轮询时间有点短吧,还要考虑网络的延迟等
------解决方案--------------------http://blog.sina.com.cn/s/blog_40e2140e01000a9y.html
不知能不能帮到你,另外有好的方法希望可以分享下
------解决方案--------------------
用户正常登录,退出登录,要更新在线人数;
用户关闭浏览器,会触发一个事件,可以通过Ajax告知服务器,及时要更新在线人数;
开一个session监听器,当客户端出现意外情况,比如断电了,断网了,电脑重启了,结束浏览器进程了等等,session都会被销毁,你就赶紧更新在线人数;
在服务器启动时,开一个线程,专门用来清理已经登录超时的用户;
以上4点都能做到的话,统计在线人数的准确率可达98%
------解决方案--------------------Java code
public class UserHttpSessionEventPublisher implements HttpSessionListener
{
private static final String LOGGER_NAME = UserHttpSessionEventPublisher.class.getName();
//~ Methods ========================================================================================================
/* ApplicationContext getContext(ServletContext servletContext)
{
return WebApplicationContextUtils.getWebApplicationContext(servletContext);
}*/
/**
* Handles the HttpSessionEvent by publishing a {@link HttpSessionCreatedEvent} to the application
* appContext.
*
* @param event HttpSessionEvent passed in by the container
*/
public void sessionCreated(HttpSessionEvent event) {
在这里累加,(可通过保存在session里的登录用户信息,判断是不是同一人,)
}
@Override
public void sessionDestroyed(HttpSessionEvent event){
在这里-1;
}