没有STOMP和SockJs但带有消息代理和路由支持的Spring websockets

时间:2017-03-20 10:21:37

标签: java spring spring-websocket java-websocket

有没有办法在不使用SockJS和STOMP的情况下使用Spring提供的工具来建立webSocket连接?我需要实现一个专有的webSocket协议,所以我现在不能使用任何一个协议。

我已经实施/黑客攻击了following answer的解决方案,但它要求我重新实现我认为不应该担心的事情。

我想我的问题归结为:我有没有办法使用2.(下面)的优点,特别是MessageBroker,而不使用STOMP?

一些背景知识:

我需要做以下事情:

  • 能够在websocket处理程序的每个实例中为我的持久性提供程序注入引用
  • 在我的处理程序对象的单独实例中处理每个webSocket会话
  • 将我在一个端点上收到的消息重新传输到另一个端点上的多个客户端。
  • 通过标准的Text WebSocket连接实现我自己的协议。

到目前为止我尝试的是:

  1. 使用javax.websocket,我可以在一个单独的实例上处理每个请求。但是,我需要遍历打开的会话并重新传输连接到正确端点的会话。此外,我无法使用Spring注入我的持久性提供程序。这就是我到目前为止所使用的东西,看起来太黑了。
  2. 即。 (伪代码)

    @ServerEndpoint("/trade/{id}")
    public String handleMessage(@PathParam(id) String id, webSocketSession session){
     if(id.equalsIgnoreCase("foo"){
          for(Session s: session.getOpenSessions(){
          //do things}
      } else if(id.equalsIgnoreCase("bar")){
          //do other things
      }
     }
    }
    
    1. 将Spring websocket实现与@MessageMapping("/trade")@SendTo("/queue/position-updates")一起使用。这要求我至少使用STOMP。这意味着要破坏流程中的其他应用程序,我现在无法做到这一点。此外,还有我需要实施的专有协议的问题。
    2. 即。 (伪代码)

      @MessageMapping("/trade/{id}")
      @SendTo("/trades/all")
      public Greeting greeting(String message){
          //do things, return message
      }
      
      1. 目前,我通过实现WebSocketConfigurer类并注册端点来使用Spring websocket实现。这允许我将每个会话放在一个单独的处理程序类中并注入持久性提供程序。但是,我似乎无法获得有关Spring工作的一些好处:
        • 我无法将{id}中的参数registry.addHandler(WebsocketHandlerPool(), "/trade/{id}")导入WebsocketHandlerPool(),因此我必须在创建每个WebsocketHandler时解析路径。理想情况下,我不想这样做。
        • 如果我不想迭代websocket消息处理程序代码中的所有会话,我必须实现自己的消息代理。我@MessageMapping@SendTo没有支持(据我所知)。
      2. 即。 (处理程序的伪代码:)

        @Override
        public void afterConnectionEstablished(WebSocketSession s){
            //parses the String of the Path URL and sets it as a field
            idFromSessionPath = getIdFromSessionPath(s);
        }
        @Override
        public String handleTextMessage(WebSocketSession session, TextMessage message
        {
            If(idFromSessionPath.equals("foo"){
             //do things
            } else {
             //do other things
            }
        }
        

        (配置的伪代码)

        @Override
        public void registerWebSocketHandlers(WebSocketHandlerRegistry  registry){
            registry.addHandler(threadPool(), "/trade/{id}");
        }
        
        @Bean
        public WebSocketHandler threadPool(){
            return new PerConnectionWebSocketHandler(TradeStreamingHandler.class);
        
        }
        

0 个答案:

没有答案