Веб-сокеты Spring без STOMP и SockJ, но с брокером сообщений и поддержкой маршрутизации

Есть ли способ использовать средства, предоставляемые Spring, для подключения к веб-сокету без использования SockJS и STOMP? Мне нужно реализовать проприетарный протокол webSocket, поэтому в данный момент я не могу использовать ни один из них.

Я реализовал/взломал решение из следующего ответа , но это требует от меня повторной реализации вещей, о которых, по моему мнению, мне не следует беспокоиться.

Я предполагаю, что мой вопрос сводится к следующему: есть ли способ использовать приятные функции 2. (ниже), в частности MessageBroker, без использования STOMP?

Немного предыстории:

Мне нужно сделать следующее:

  • Иметь возможность вводить ссылку на моего поставщика постоянства в каждом экземпляре обработчика веб-сокетов.
  • Обрабатывать каждый сеанс webSocket в отдельном экземпляре моего объекта-обработчика
  • Повторно передавать сообщения, которые я получаю на одной конечной точке, нескольким клиентам на другой конечной точке.
  • Реализовать свой собственный протокол через стандартное соединение Text WebSocket.

Что я пробовал до сих пор:

  1. Используйте javax.websocket, где я могу обрабатывать каждый запрос в отдельном экземпляре. Однако мне нужно перебрать открытые сеансы и повторно передать те, которые подключены к правильной конечной точке. Кроме того, я не могу использовать Spring для внедрения моего поставщика постоянства. Это было то, что я использовал до сих пор, и это кажется слишком хакерским.

т.е. (псевдокод)

@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 с @MessageMapping("/trade") и @SendTo("/queue/position-updates"). Это требует, чтобы я использовал, как минимум, STOMP. Это означало бы поломку других приложений в процессе, чего я не могу сделать в данный момент. Кроме того, есть вопрос о проприетарном протоколе, который мне нужно реализовать.

т.е. (псевдокод)

@MessageMapping("/trade/{id}")
@SendTo("/trades/all")
public Greeting greeting(String message){
    //do things, return message
}
  1. A the moment, I am using the Spring websocket implementation by implementing the WebSocketConfigurer class and registering endpoints. This allows me to have each session in a separate handler class and inject the persistence provider. However, I can't seem to get some of the nice things about Spring working:
    • I cannot get the parameter {id} from the registry.addHandler(WebsocketHandlerPool(), "/trade/{id}") into the WebsocketHandlerPool(), so I have to parse the path when I create each individual WebsocketHandler. Ideally, I would like to not have to do this.
    • Я должен реализовать свой собственный брокер сообщений, если я не хочу перебирать все сеансы внутри кода обработчика сообщений веб-сокета. Нет поддержки (насколько я могу судить) для @MessageMapping и @SendTo.

т.е. (псевдокод для обработчика:)

@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);

}

person Kaloyan Pashov    schedule 20.03.2017    source источник
comment
В настоящее время я нахожусь в очень похожей ситуации, как и вы, когда вы написали это, и мне грустно видеть, что ответа нет. Удалось ли вам придумать решение или у вас было то, что вы показали в своем псевдокоде для обработчика? Мне определенно интересно, как вы решили эту проблему, поскольку сейчас я делаю то, что вы показываете в своем обработчике псевдокода.   -  person Flippi    schedule 23.09.2019