在weblogic集群环境下,如何统计在线人数?

在weblogic集群环境下,如何统计在线人数?
统计在线人数,单机情况是存一个application变量,可在集群环境下,每个节点都是相对独立的,不能通过变量存取.
如果放到数据库的话,如果服务器宕机,或数据库的问题,有可能导致一些垃圾数据,如用户已下线,但数据库中的数据还是标识在线.

有什么好的解决方案?

你们的SESSION是怎么放的

取服务器的所有用户 SESSION,SESSION的数量就是当前在线的用户数,为了防止同一个用户 多次登录,你可以对SESSION值进行判断,如果用户名相同,就当作一条数据处理

因为集群环境下不同结点下的SESSION是同步的,所以不用担心这个结点有SESSION,另一个结点就没有SESSION了

可以考虑使用HttpSessionListener进行统计

可以用spring的

<listener-class>
  org.springframework.security.web.session.HttpSessionEventPublisher
</listener-class>

然后 像这样子用

[code="java"]
List _dwrVOOnlineUsers = new ArrayList();
List _principals = sessionRegistry.getAllPrincipals();
for (Object _principal : _principals) {

            List<SessionInformation> _sessionInformations = sessionRegistry
                    .getAllSessions(_principal, false);
            for (SessionInformation _sessionInformation : _sessionInformations) {
                DwrVOOnlineUser _dwrVOOnlineUser = new DwrVOOnlineUser();
                String _sessionId = _sessionInformation.getSessionId();
                Date _lastrequest = _sessionInformation.getLastRequest();
                String _account = "-1";
                if(_principal instanceof String) {
                _account = (String) _sessionInformation
                        .getPrincipal(); } else  if( _principal instanceof User) {
                            _account = ((User)_principal).getUsername();
                        }

                VOUser _voUser = userManagerService
                        .getUserByAccount(_account);
                _dwrVOOnlineUser.setSessionId(_sessionId);
                _dwrVOOnlineUser.setLastRequest(_lastrequest);
                try {
                    PropertyUtils.copyProperties(_dwrVOOnlineUser, _voUser);
                } catch (IllegalAccessException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (NoSuchMethodException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                _dwrVOOnlineUsers.add(_dwrVOOnlineUser);
            }

    }

[/code]

主要还是自己实现个listeners

只是个参考

能看看你单机统计SESSION是怎么写的吗?