Есть ли способ использовать средства, предоставляемые Spring, для подключения к веб-сокету без использования SockJS и STOMP? Мне нужно реализовать проприетарный протокол webSocket, поэтому в данный момент я не могу использовать ни один из них.
Я реализовал/взломал решение из следующего ответа , но это требует от меня повторной реализации вещей, о которых, по моему мнению, мне не следует беспокоиться.
Я предполагаю, что мой вопрос сводится к следующему: есть ли способ использовать приятные функции 2.
(ниже), в частности MessageBroker, без использования STOMP?
Немного предыстории:
Мне нужно сделать следующее:
- Иметь возможность вводить ссылку на моего поставщика постоянства в каждом экземпляре обработчика веб-сокетов.
- Обрабатывать каждый сеанс webSocket в отдельном экземпляре моего объекта-обработчика
- Повторно передавать сообщения, которые я получаю на одной конечной точке, нескольким клиентам на другой конечной точке.
- Реализовать свой собственный протокол через стандартное соединение Text WebSocket.
Что я пробовал до сих пор:
- Используйте 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
}
}
}
- Используйте реализацию веб-сокета Spring с
@MessageMapping("/trade")
и@SendTo("/queue/position-updates")
. Это требует, чтобы я использовал, как минимум, STOMP. Это означало бы поломку других приложений в процессе, чего я не могу сделать в данный момент. Кроме того, есть вопрос о проприетарном протоколе, который мне нужно реализовать.
т.е. (псевдокод)
@MessageMapping("/trade/{id}")
@SendTo("/trades/all")
public Greeting greeting(String message){
//do things, return message
}
- 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 theregistry.addHandler(WebsocketHandlerPool(), "/trade/{id}")
into theWebsocketHandlerPool()
, so I have to parse the path when I create each individualWebsocketHandler
. Ideally, I would like to not have to do this. - Я должен реализовать свой собственный брокер сообщений, если я не хочу перебирать все сеансы внутри кода обработчика сообщений веб-сокета. Нет поддержки (насколько я могу судить) для
@MessageMapping
и@SendTo
.
- I cannot get the parameter
т.е. (псевдокод для обработчика:)
@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);
}