有没有办法在不使用SockJS和STOMP的情况下使用Spring提供的工具来建立webSocket连接?我需要实现一个专有的webSocket协议,所以我现在不能使用任何一个协议。
我已经实施/黑客攻击了following answer的解决方案,但它要求我重新实现我认为不应该担心的事情。
我想我的问题归结为:我有没有办法使用2.
(下面)的优点,特别是MessageBroker,而不使用STOMP?
一些背景知识:
我需要做以下事情:
到目前为止我尝试的是:
即。 (伪代码)
@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
}
}
}
@MessageMapping("/trade")
和@SendTo("/queue/position-updates")
一起使用。这要求我至少使用STOMP。这意味着要破坏流程中的其他应用程序,我现在无法做到这一点。此外,还有我需要实施的专有协议的问题。即。 (伪代码)
@MessageMapping("/trade/{id}")
@SendTo("/trades/all")
public Greeting greeting(String message){
//do things, return message
}
{id}
中的参数registry.addHandler(WebsocketHandlerPool(), "/trade/{id}")
导入WebsocketHandlerPool()
,因此我必须在创建每个WebsocketHandler
时解析路径。理想情况下,我不想这样做。@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);
}