在 Spring-boot 中路由 websocket 目标

Posted

技术标签:

【中文标题】在 Spring-boot 中路由 websocket 目标【英文标题】:Routing websocket destination in Spring-boot 【发布时间】:2018-08-25 12:34:10 【问题描述】:

拥有原始的 websocket 实现:

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer 
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) 
        registry.addHandler(new MessageHandler(), "/websocket")
                .setAllowedOrigins("*")
                .addInterceptors();;
    

处理程序:

public class MessageHandler extends TextWebSocketHandler 
    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception 
        // The WebSocket has been closed
    
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception 
        String auth = (String) session.getAttributes().get("auth");
        System.out.println(auth);

        session.sendMessage(new TextMessage("You are now connected to the server. This is the first message."));
    
    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage textMessage) throws Exception 
        // A message has been received

    

websocket 客户端使用/websocket url 例如ws://localhost:8080/websocket 连接到服务器(握手等)

但是,既然已经建立了连接,有没有办法路由消息?假设我有一个提供聊天和一些弹出功能的应用程序(为简单起见,假设用户向应用程序中的所有朋友发送弹出消息和一些弹出窗口)。

当然我想将聊天消息路由到/chat 并弹出到/popup

实现此目的的一种方法是将 json 消息发送到服务器并在那里解析它,例如:

    protected void handleTextMessage(WebSocketSession session, TextMessage textMessage) throws Exception 
        String path = getRouteFromJsonMessage(textMessage);
        if( ! "".equals(path) && path.equals("chat")
           ....
        if( ! "".equals(path) && path.equals("popup")
          ....

    

但这似乎太慢了,每条消息都解析 json。还有其他更好的方法来实现路由吗?

感谢您的帮助!

【问题讨论】:

顺便说一句,阅读更短更快捷:if ("chat".equals(path)) 而不是 if( ! "".equals(path) && path.equals("chat") @MarkusPscheidt 谢谢,我只是将代码添加到问题中只是为了演示,没有考虑。 【参考方案1】:

你为什么不注册两个不同的 MessageHandlers

public class WebSocketConfig implements WebSocketConfigurer 
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) 
        registry.addHandler(new ChatMessageHandler(), "/chat")
                    .setAllowedOrigins("*")
                    .addInterceptors()
                .addHandler(new PopUpHandler(), "/popup") //etc;

    

【讨论】:

在这种情况下不会创建 2 个 Web 套接字连接吗?假设该应用程序有百万用户已连接,在这种情况下,您必须保存 2 百万 Web 套接字连接而不是 1 百万。还是我错了?

以上是关于在 Spring-boot 中路由 websocket 目标的主要内容,如果未能解决你的问题,请参考以下文章

websocke

websocke前世今生

Camel:使用 spring-boot 配置的数据源

websock第一次连不上window

spring-boot主要注解

webSock 重连机构 简略版