package org.hsweb.web.socket.cmd.support;
import org.hsweb.web.bean.po.user.User;
import org.hsweb.web.core.session.HttpSessionManagerListener;
import org.hsweb.web.socket.cmd.CMD;
import org.hsweb.web.socket.message.WebSocketMessage;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketSession;
import javax.servlet.http.HttpSession;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
/**
* 通过websocket推送 在线人数
* Created by zhouhao on 16-6-2.
*/
@Component
public class OnlineUserProcess extends AbstractCmdProcessor implements HttpSessionManagerListener {
private Set<String> userList = Collections.synchronizedSet(new HashSet<>());
@Override
public String getName() {
return "online";
}
@Override
public void exec(CMD cmd) throws Exception {
String type = (String) cmd.getParams().get("type");
if (type == null) return;
User user = getUser(cmd.getSession());
if (user != null) {
String callback = (String) cmd.getParams().getOrDefault("callback", "onlineUserTotal");
webSocketMessageManager.subscribe(getName(), user.getId(), cmd.getSession());
pushOnlineTotalToUser(user.getId(), callback);
userList.add(user.getId());
}
}
protected void pushOnlineTotalToUser(String userId, String callback) {
int total = httpSessionManager.getUserTotal();
WebSocketMessage message = new WebSocketMessage();
message.setTo(userId);
message.setFrom("system");
message.setCallBack(callback);
message.setContent(total);
message.setType(getName());
try {
webSocketMessageManager.publish(message);
} catch (Exception e) {
logger.error("推送在线人数失败", e);
}
}
protected void pushOnlineTotalToAllUser(String callback) {
userList.forEach(userId -> pushOnlineTotalToUser(userId, callback));
}
@Override
public void init() throws Exception {
}
@Override
public void onSessionConnect(WebSocketSession session) throws Exception {
}
@Override
public void onSessionClose(WebSocketSession session) throws Exception {
User user = getUser(session);
if (user != null) {
webSocketMessageManager.deSubscribe(getName(), user.getId(), session);
}
}
@Override
public void onUserLogin(User user, HttpSession session) {
pushOnlineTotalToAllUser("onlineUserTotal");
}
@Override
public void onUserLoginOut(String userId, HttpSession session) {
userList.remove(userId);
pushOnlineTotalToAllUser("onlineUserTotal");
}
}