diff --git a/magic-api/src/main/java/org/ssssssss/magicapi/core/config/MessageType.java b/magic-api/src/main/java/org/ssssssss/magicapi/core/config/MessageType.java index 4cfd75a7b6132e0a8f38c776d21aa38a13151b9b..c4939bc7b35b9bc302b0d8772aede446d537ef81 100644 --- a/magic-api/src/main/java/org/ssssssss/magicapi/core/config/MessageType.java +++ b/magic-api/src/main/java/org/ssssssss/magicapi/core/config/MessageType.java @@ -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*/ /* 获取当前在线用户 */ diff --git a/magic-api/src/main/java/org/ssssssss/magicapi/core/config/WebSocketSessionManager.java b/magic-api/src/main/java/org/ssssssss/magicapi/core/config/WebSocketSessionManager.java index b5667a4d1398bdaae36be7249e72ae60020a2c8a..1e6d5b58efc1cd1e58af00866fef9e0db4277ed2 100644 --- a/magic-api/src/main/java/org/ssssssss/magicapi/core/config/WebSocketSessionManager.java +++ b/magic-api/src/main/java/org/ssssssss/magicapi/core/config/WebSocketSessionManager.java @@ -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> 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 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 -> { diff --git a/magic-api/src/main/java/org/ssssssss/magicapi/core/handler/MagicWebSocketDispatcher.java b/magic-api/src/main/java/org/ssssssss/magicapi/core/handler/MagicWebSocketDispatcher.java index b67cfd192ef23362cd58fbf987090bc6fb7907e6..befedee8fa49480f0923c451daecd41ed53fc45b 100644 --- a/magic-api/src/main/java/org/ssssssss/magicapi/core/handler/MagicWebSocketDispatcher.java +++ b/magic-api/src/main/java/org/ssssssss/magicapi/core/handler/MagicWebSocketDispatcher.java @@ -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 diff --git a/magic-api/src/main/java/org/ssssssss/magicapi/core/handler/MagicWorkbenchHandler.java b/magic-api/src/main/java/org/ssssssss/magicapi/core/handler/MagicWorkbenchHandler.java index 787dca784b42c3a8494dc0cca62897547c9e2108..575479656fde049d28c00d137dfb44259c1a5fd9 100644 --- a/magic-api/src/main/java/org/ssssssss/magicapi/core/handler/MagicWorkbenchHandler.java +++ b/magic-api/src/main/java/org/ssssssss/magicapi/core/handler/MagicWorkbenchHandler.java @@ -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> getOnlineUsers(){