websocket广播

3 阅读1分钟

 1、配置websocket

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        // 使用单例实例而非Spring容器管理
        registry.addHandler(NativeWebSocketClient.getInstance(), "/ws")
                .setAllowedOriginPatterns("*");
    }
}

2、实现广播工具类

@Slf4j
public class WebSocketClient extends TextWebSocketHandler {

    private final static ConcurrentHashMap<String, WebSocketSession> sessions = new ConcurrentHashMap<>();

    private static volatile WebSocketClient instance;

    private WebSocketClient() {
    }

    public static WebSocketClient getInstance() {
        if (instance == null) {
            synchronized (WebSocketClient.class) {
                if (instance == null) {
                    instance = new WebSocketClient();
                }
            }
        }
        return instance;
}

    private static void send(String message) {
        log.info("会话发布剩余会话数: {}", sessions.size());
        sessions.forEach((id, session) -> {
        try {
            if (session.isOpen()) {
                    synchronized (session.getId()){
                        session.sendMessage(new TextMessage(message));
                    }
                }
            }
            catch (IOException e) {
                // 清理无效会话
                sessions.remove(id); 
            }
        });
    }

    @Override
    public void afterConnectionEstablished(@NotNull WebSocketSession session) {
        sessions.put(session.getId(), session);
        log.info("会话添加: {} | 当前会话数: {}", session.getId(), sessions.size());
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, @NotNull CloseStatus status) {
        sessions.remove(session.getId());
        log.info("会话移除: {} | 剩余会话数: {}", session.getId(), sessions.size());
    }

}

每次调用send方法都会清理无效会话,适用于工业系统场景,低连接数并需要实时推送特定消息给每一个用户,如仓库实时看板,在每一次入库出库等相关操作后广播消息