我想将状态同步到对特定实体更改感兴趣的所有客户。所以我想实现类似的目标:
- 在实体上公开 CRUD API(通过
HTTP/REST和websockets) - 并将(修改调用的)响应路由到
websockets主题
所以从技术上讲,我会对将spring-data-rest与spring 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;
}
}
场景一:Websocket API调用自REST/HTTP API
规则:
- 客户请求总是
REST/HTTP API - 响应
REST/HTTP API适用于所有操作 - 此外,对于修改操作,
websocket消息也会出现
从技术上讲,可以通过以下方式实现:
- 从spring-rest-data 事件中调用
websocket控制器(即在, , , 中)AfterCreateEventAfterSaveEventAfterLinkSaveEventAfterDeleteEvent
解决方案对我来说似乎还是很恶心,因为我需要这样做:
- 客户端 A --
HTTP请求 --> 服务器(spring-data-rest 控制器) - 服务器(spring-data-rest 控制器中的AfterXXXEvent)--
websocket消息--> Springwebsocket控制器 - Spring websocket 控制器——
websocket通过主题发送消息——>所有对主题感兴趣的客户端 - 服务器(spring-data-rest 控制器)--
HTTP响应--> 客户端 A
场景2:Websocket API独立于REST API
规则:
- 客户端请求仅
REST/HTTP API用于非修改操作 - 响应仅
REST/HTTP API用于非修改操作 websocket客户端为所有修改操作发送消息websocket仅针对所有修改操作向客户端发送消息
好吧,如果没有其他想法出现,我会选择后一个,但是,如果我也能以某种方式生成C(R)UD通过websockets类似 spring-data-websockets 的方法公开并且只处理我的实现。
因为我觉得我必须手动公开(通过*WebSocketControllers)CUD我所有实体的所有方法。我可能太懒了。
想法?