我希望将状态同步到所有对特定实体更改感兴趣的客户端,因此我想要实现以下内容:
- 在实体上公开CRUD API(通过
HTTP / REST
和websockets
) - 并将修改调用的响应路由到
websockets
主题
因此从技术上讲,我对将spring-data-rest 与spring websockets implementation 结合实现类似于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;
}
}
场景1: REST/HTTP API 调用 Websocket 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
消息通过 topic --> 所有感兴趣的客户端 - 服务器(spring-data-rest控制器)--
HTTP
响应--> 客户端A
场景2: Websocket API 与 REST API 独立
规则:
- 对于非修改操作,客户端请求为
REST/HTTP API
- 对于非修改操作,响应也是
REST/HTTP API
- 对于所有修改操作,客户端发送
websocket
消息 - 只有对于所有修改操作,才会将
websocket
消息发送到客户端
如果没有其他想法,我会选择后者,但是,如果可以通过类似 spring-data-websockets 的方式生成暴露在 websockets
中的 C(R)UD
方法,并且仅在我的实现中处理路由,那就太好了。
因为我觉得必须手动公开(通过 *WebSocketController
)所有实体的 CUD
方法。而且我可能太懒了。
有什么想法吗?