feat: 添加 SSE 测试接口(在线人数查询 + 手动广播事件)
This commit is contained in:
@@ -1,15 +1,21 @@
|
|||||||
package com.webgame.webgamebackend.sse;
|
package com.webgame.webgamebackend.sse;
|
||||||
|
|
||||||
import cn.dev33.satoken.stp.StpUtil;
|
import cn.dev33.satoken.stp.StpUtil;
|
||||||
|
import com.alibaba.fastjson2.JSON;
|
||||||
|
import com.webgame.webgamebackend.common.event.SseEvent;
|
||||||
|
import com.webgame.webgamebackend.common.event.SseEventType;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.http.MediaType;
|
import org.springframework.http.MediaType;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
|
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
import java.util.concurrent.ScheduledExecutorService;
|
import java.util.concurrent.ScheduledExecutorService;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
@@ -76,4 +82,44 @@ public class SseController {
|
|||||||
log.info("[SSE] 新连接建立, userId={}, 当前在线={}", userId, connectionManager.getOnlineCount());
|
log.info("[SSE] 新连接建立, userId={}, 当前在线={}", userId, connectionManager.getOnlineCount());
|
||||||
return emitter;
|
return emitter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ==================== 测试接口 ====================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查看当前 SSE 在线连接数
|
||||||
|
*
|
||||||
|
* GET /sse/test/online
|
||||||
|
*/
|
||||||
|
@GetMapping("/test/online")
|
||||||
|
public Map<String, Object> onlineCount() {
|
||||||
|
return Map.of("onlineCount", connectionManager.getOnlineCount());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 手动发送广播事件(测试用)
|
||||||
|
*
|
||||||
|
* POST /sse/test/broadcast
|
||||||
|
* Body: { "event": "room_created", "data": { "roomId": "test", ... } }
|
||||||
|
*
|
||||||
|
* event 可选值: room_created / room_updated / room_removed / kicked / game_started / balance_chg
|
||||||
|
*/
|
||||||
|
@PostMapping("/test/broadcast")
|
||||||
|
public Map<String, Object> testBroadcast(@RequestBody Map<String, Object> body) {
|
||||||
|
String eventType = (String) body.get("event");
|
||||||
|
Object data = body.get("data");
|
||||||
|
|
||||||
|
if (eventType == null || data == null) {
|
||||||
|
return Map.of("success", false, "error", "event 和 data 字段为必填");
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
SseEventType type = SseEventType.valueOf(eventType.toUpperCase());
|
||||||
|
SseEvent event = SseEvent.broadcast(type, JSON.toJSONString(data));
|
||||||
|
connectionManager.broadcast(event);
|
||||||
|
log.info("[SSE] 测试广播, type={}, data={}", eventType, JSON.toJSONString(data));
|
||||||
|
return Map.of("success", true, "eventType", eventType, "onlineCount", connectionManager.getOnlineCount());
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
return Map.of("success", false, "error", "无效的事件类型: " + eventType);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user