在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是怎么写的吗?