我想将状态同步到对特定实体更改感兴趣的所有客户。所以我想实现类似的目标:
- 在实体上公开 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
控制器(即在, , , 中)AfterCreateEvent
AfterSaveEvent
AfterLinkSaveEvent
AfterDeleteEvent
解决方案对我来说似乎还是很恶心,因为我需要这样做:
- 客户端 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 的方法公开并且只处理我的实现。
因为我觉得我必须手动公开(通过*WebSocketController
s)CUD
我所有实体的所有方法。我可能太懒了。
想法?