package com.ruoyi.device.websocket; import com.alibaba.fastjson2.JSON; import com.ruoyi.device.service.impl.DefaultBufferDeviceImpl; import com.ruoyi.device.service.dto.DockDetailDTO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import jakarta.websocket.*; import jakarta.websocket.server.ServerEndpoint; import java.util.concurrent.CopyOnWriteArraySet; @Component @ServerEndpoint("/websocket/statistics") public class StatisticsWebSocket { private static final Logger log = LoggerFactory.getLogger(StatisticsWebSocket.class); private Session session; private static final CopyOnWriteArraySet sessions = new CopyOnWriteArraySet<>(); @OnOpen public void onOpen(Session session) { this.session = session; sessions.add(this); log.info("WebSocket连接建立: sessionId={}", session.getId()); } @OnClose public void onClose() { sessions.remove(this); if (session != null) { log.info("WebSocket连接关闭: sessionId={}", session.getId()); } else { log.info("WebSocket连接关闭: session为null"); } } @OnMessage public void onMessage(String message) { log.info("收到WebSocket消息: sessionId={}, message={}", session.getId(), message); } @OnError public void onError(Session session, Throwable error) { log.error("WebSocket错误: sessionId={}, error={}", session.getId(), error.getMessage(), error); } private void sendMessage(String message) { try { if (session != null && session.isOpen()) { session.getBasicRemote().sendText(message); } } catch (Exception e) { log.error("发送WebSocket消息失败: error={}", e.getMessage(), e); } } @Autowired private DefaultBufferDeviceImpl bufferDeviceService; public void broadcast(String dockerId) { for (StatisticsWebSocket ws : sessions) { DockDetailDTO dockDetailDTO = bufferDeviceService.getDockDetailById(Long.valueOf(dockerId)); ws.sendMessage(JSON.toJSONString(dockDetailDTO)); } } }