Browse Source

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

mxd 3 years ago
parent
commit
310df93499

+ 6 - 4
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*/
 	/* 获取当前在线用户 */

+ 7 - 2
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<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 -> {

+ 3 - 1
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

+ 3 - 5
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<Map<String, Object>> getOnlineUsers(){