小编Kal*_*hov的帖子

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

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

我已经从以下答案中实施/破解了解决方案,但它需要重新实现我认为我不应该担心的事情.

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

一点背景:

我需要做以下事情:

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

到目前为止我尝试过的是:

  1. 使用javax.websocket,我可以在一个单独的实例上处理每个请求.但是,我需要遍历打开的会话并重新传输连接到正确端点的会话.另外,我不能使用Spring注入我的持久性提供程序.这是我到目前为止使用的东西,看起来太hacky.

即(伪代码)

@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
  }
 }
}
Run Code Online (Sandbox Code Playgroud)
  1. 使用@MessageMapping("/trade")和使用Spring websocket实现@SendTo("/queue/position-updates").这要求我至少使用STOMP.这意味着要破坏流程中的其他应用程序,这是我目前无法做到的.此外,还有我需要实施的专有协议的问题.

即(伪代码)

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

即(处理程序的伪代码:)

@Override
public void afterConnectionEstablished(WebSocketSession …
Run Code Online (Sandbox Code Playgroud)

java spring spring-websocket java-websocket

6
推荐指数
0
解决办法
1162
查看次数

标签 统计

java ×1

java-websocket ×1

spring ×1

spring-websocket ×1