如何将spring-data-rest与spring websocket混合到一个实现中

Pet*_*vic 32 java spring spring-mvc websocket spring-data-rest

我想将状态与所有对特定实体更改感兴趣的客户端同步.所以我想实现以下目标:

  • 在实体上公开CRUD API(通过HTTP/RESTwebsockets)
  • 并将(修改调用的)响应路由到websockets主题

从技术上讲,我对将spring-data-restspring websockets实现混合以实现类似spring-data-websocket的想法感兴趣.

我想到了两种解决方案,实际上两者都是:

  • spring-data-rest通过公开我的实体 REST/HTTP API
  • websocket 控制器(用于对实体的修改调用)

websocket控制器是这样的:

@Controller
public class EntityAWebSocketController {
      @MessageMapping("/EntityA/update")
      @SendTo("/topic/EntityA/update")
      public EntityA update(EntityA entityA) throws Exception {
           // persist,....
           return entityA;
     }
}
Run Code Online (Sandbox Code Playgroud)

场景1:Websocket API来自REST/HTTP API

规则:

  • 客户请求始终是 REST/HTTP API
  • 响应是REST/HTTP API针对所有操作的
  • 此外,对于修改操作,websocket消息也会出现

从技术上讲,可以通过以下方式实现:

仍然解决方案对我来说似乎很难过,因为我需要去:

  1. 客户端A - HTTP请求 - >服务器(弹簧数据休息控制器)
  2. 服务器(Spring-data-rest控制器中的AfterXXXEvent) - websocket消息 - > Spring websocket控制器
  3. Spring websocket控制器 - websocket通过主题消息 - >所有对该主题感兴趣的客户端
  4. 服务器(spring-data-rest controller) - HTTP响应 - >客户端A.

场景2:Websocket API独立于REST API

规则:

  • 客户端请求仅REST/HTTP API用于非修改操作
  • 响应仅REST/HTTP API适用于非修改操作
  • 客户端websocket为所有修改操作发送消息
  • websocket 消息仅发送到客户端以进行所有修改操作

好吧,如果没有其他的想法出现,我会选择后一个,但是,如果我能以某种方式生成C(R)UD通过暴露的方法websockets,就像spring-data-websockets一样,只处理中的路径,那将会很棒.我的实施.

因为我觉得我必须为我的所有实体手动公开(通过*WebSocketControllers)所有CUD方法.而我可能太懒了.

想法?

小智 1

场景 2 在最后一步中讨论了单个客户端。但我认为您的要求是针对一个主题,因为您想要多个客户端。如果我想完成 2 来满足您所声明的要求,那么您可能需要维护一个客户端列表并实现您自己的队列,或者使用 ForkJoinPool 向侦听 WebSocket 的所有客户端发送消息。话虽如此,A topic在这里肯定更优雅,但整体看起来太复杂了不同的接口

对于从客户端到服务器的所有消息,只需使用简单的有线协议并使用集合来参数化,它可以是 RParam1.......

在服务器上,您需要一个控制器将这些映射到不同的请求(和操作)。不知怎的,看起来并没有太多的工作。希望这可以帮助。