【发布时间】:2014-02-12 05:42:54
【问题描述】:
我想将状态同步到对特定实体更改感兴趣的所有客户端。所以我想实现这样的目标:
- 在实体上公开 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:Websocket API从REST/HTTP API调用
规则:
- 客户端请求总是
REST/HTTP API - 所有操作的回复是
REST/HTTP API - 此外,对于修改操作,
websocket消息也会出现
从技术上讲,可以通过以下方式实现:
- 从spring-rest-data events调用
websocket控制器(即在AfterCreateEvent、AfterSaveEvent、AfterLinkSaveEvent、AfterDeleteEvent)
仍然解决方案对我来说似乎很糟糕,因为我需要去:
- client A --
HTTPrequest--> 服务器(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消息仅发送给客户端进行所有修改操作
好吧,如果没有其他想法出现,我会选择后一个想法,但是,如果我能以某种方式生成通过 websockets 公开的 C(R)UD 方法,那就太好了,比如 spring- data-websockets 并仅处理我的实现中的路由。
我觉得我必须手动公开(通过*WebSocketControllers)我所有实体的所有CUD 方法。我可能太懒了。
想法?
【问题讨论】:
-
有趣!鉴于 Spring 4.0 对 websockets 有很好的支持,Spring Data REST 应该能够向端点发送消息。为什么不针对 SDR 打开 JIRA (jira.springsource.org/browse/DATAREST)?
-
@saintbands 感谢您的提示!我之前也考虑过。然而,Stackoverflow 方式赢了。尽管如此,我还是提出了这个问题:jira.springsource.org/browse/DATAREST-232 无论如何,这似乎是从 spring-data-rest 团队本身获得一些想法的最佳方式。
-
我也将在春季刊中对此投一票。这正是我想要做的。如果我必须为所有真正带走一些好处的 SDR 方法编写相应的控制器方法。您最终选择了一种解决方案还是另一种解决方案?
-
@BrandonV 不。我没有时间在这里继续前进。
-
天哪,我需要这个!
标签: java spring spring-mvc websocket spring-data-rest