提交 310df934 编写于 作者: M mxd

修复用户在线状态会自动掉线的问题。

上级 39b4a178
......@@ -23,8 +23,9 @@ public enum MessageType {
ONLINE_USERS,
/* 通知客户端,他人进入文件*/
INTO_FILE_ID,
/* PONG */
PONG,
/* ping */
PING,
/* C -> S message */
/* 设置断点 */
......@@ -35,8 +36,9 @@ public enum MessageType {
LOGIN,
/* 设置当前所在文件 */
SET_FILE_ID,
/* ping */
PING,
/* PONG */
PONG,
/* S <-> S -> C message*/
/* 获取当前在线用户 */
......
......@@ -29,6 +29,10 @@ public class WebSocketSessionManager {
private static String instanceId;
private static final int CHECK_INTERVAL = 20;
private static final int KEEPALIVE_TIMEOUT = 60 * 1000;
private static final List<Pair<String, String>> MESSAGE_CACHE = new ArrayList<>(200);
public static void add(MagicConsoleSession session) {
......@@ -43,7 +47,7 @@ public class WebSocketSessionManager {
// 1秒1次发送日志
new ScheduledThreadPoolExecutor(1, r -> new Thread(r, "magic-api-send-log-task")).scheduleAtFixedRate(WebSocketSessionManager::flushLog, 1, 1, TimeUnit.SECONDS);
// 60秒检测一次是否在线
new ScheduledThreadPoolExecutor(1, r -> new Thread(r, "magic-api-websocket-clean-task")).scheduleAtFixedRate(WebSocketSessionManager::checkSession, 60, 60, TimeUnit.SECONDS);
new ScheduledThreadPoolExecutor(1, r -> new Thread(r, "magic-api-websocket-clean-task")).scheduleAtFixedRate(WebSocketSessionManager::checkSession, CHECK_INTERVAL, CHECK_INTERVAL, TimeUnit.SECONDS);
}
public static Collection<MagicConsoleSession> getSessions() {
......@@ -193,8 +197,9 @@ public class WebSocketSessionManager {
private static void checkSession() {
try {
long activateTime = System.currentTimeMillis() - 20 * 1000;
long activateTime = System.currentTimeMillis() - KEEPALIVE_TIMEOUT;
SESSIONS.entrySet().stream()
.peek(it -> WebSocketSessionManager.sendBySession(it.getValue(), WebSocketSessionManager.buildMessage(MessageType.PING)))
.filter(it -> it.getValue().getActivateTime() < activateTime)
.collect(Collectors.toList())
.forEach(entry -> {
......
......@@ -104,7 +104,9 @@ public class MagicWebSocketDispatcher extends TextWebSocketHandler {
MagicConsoleSession mcsession = MagicConsoleSession.from(session);
WebSocketSessionManager.remove(mcsession);
MagicConsoleSession.remove(session);
WebSocketSessionManager.sendToAll(MessageType.USER_LOGOUT, mcsession.getAttributes());
if(mcsession.getClientId() != null && mcsession.getAttributes() != null && !mcsession.getAttributes().isEmpty()){
WebSocketSessionManager.sendToAll(MessageType.USER_LOGOUT, mcsession.getAttributes());
}
}
@Override
......
......@@ -75,11 +75,9 @@ public class MagicWorkbenchHandler {
}
}
@Message(MessageType.PING)
public void ping(MagicConsoleSession session){
long activateTime = System.currentTimeMillis();
session.setActivateTime(activateTime);
WebSocketSessionManager.sendBySession(session, WebSocketSessionManager.buildMessage(MessageType.PONG, activateTime));
@Message(MessageType.PONG)
public void pong(MagicConsoleSession session){
session.setActivateTime(System.currentTimeMillis());
}
private List<Map<String, Object>> getOnlineUsers(){
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册