Ember.js 从Spring后端向web应用程序提供域实体的实时更新
在服务器端,我使用Spring4。在浏览器端,我使用Ember.js 我的应用程序有一些实体类,如Ember.js 从Spring后端向web应用程序提供域实体的实时更新,ember.js,websocket,data-synchronization,real-time-updates,spring-websocket,Ember.js,Websocket,Data Synchronization,Real Time Updates,Spring Websocket,在服务器端,我使用Spring4。在浏览器端,我使用Ember.js 我的应用程序有一些实体类,如Person和Product。这些实体在服务器和浏览器上都在使用,并且建模方式相同。例如: //这是在服务器端 公共接口人员{ 字符串getId(); 字符串getFirstName(); void setFirstName(字符串firstName); 字符串getLastName(); void setLastName(字符串lastName); } //这是在浏览器端,使用余烬数据建模 Ap
Person
和Product
。这些实体在服务器和浏览器上都在使用,并且建模方式相同。例如:
//这是在服务器端
公共接口人员{
字符串getId();
字符串getFirstName();
void setFirstName(字符串firstName);
字符串getLastName();
void setLastName(字符串lastName);
}
//这是在浏览器端,使用余烬数据建模
App.Person=DS.Model.extend({
//id:DS.attr(“string”),//属性“id”将由Ember自动提供
名字:DS.attr(“字符串”),
lastName:DS.attr(“字符串”)
});
我需要在服务器和浏览器之间保持实体同步。因此,例如,当服务器端的个人
的名字
属性发生更改时,该更改将实时推送到所有感兴趣的浏览器
我进行了调查,在熟悉之后,我确信使用这种技术是满足我需求的正确方法
由于WebSocket/STOMP的级别相当低,我正在寻找一种基于此技术的解决方案,并在浏览器(此处实体的角色为观察者)和服务器(此处实体的角色为主体/可观察者)之间提供类似观察者模式的行为
由于我找不到解决“保持实体同步”难题的现有解决方案(既不是Spring中的解决方案,也不是某个第三方库),我想构建自己的解决方案,但设计已经提出了一些有趣的问题,例如:
- 协议应该是什么样的?一旦发生更改,服务器是否应该发送一个最小的帧,只包括实体类型及其ID?(例如,ID为“3”的
人员的任何财产发生变化后,向所有感兴趣的客户发送
){“type”:“Person”,“ID”:“3”}
- 可订阅的实体数量是否存在实际限制?在会话期间,单个浏览器可能会接触数百种
产品
我感兴趣的是,哪些解决方案已被证明能够成功地使基于Spring的服务器的实体与JavaScript客户端的代理实体(不一定是Ember.js)保持同步。我将向您提供一个高层次的概述,因为提供所有细节都需要一篇博客文章 你需要什么
- 服务器
- Socket.io客户端或其将事件推送到Redis的新库之一李>
- 钩住所有服务器端数据隔离器以获得更新通知
- 观察所有余烬数据模型
{
meta: {
type: 'NAME_OF_YOUR_MODEL'
id: 'ID_OF_UPDATED_MODEL'
}
}
{
"meta": {
"type": "person"
"id": "18"
},
"persons": [
{"id": "18", "firstName": "Yahuda", "lastName": "Katz"}
]
}
代码:
选项二:模型的JSON表示,带有事件
有效载荷:
{
meta: {
type: 'NAME_OF_YOUR_MODEL'
id: 'ID_OF_UPDATED_MODEL'
}
}
{
"meta": {
"type": "person"
"id": "18"
},
"persons": [
{"id": "18", "firstName": "Yahuda", "lastName": "Katz"}
]
}
代码:
笔记
可以使用以更好地观察所有属性。这也消除了调用“另存为lastUpdate属性的一部分”的需要。我将为您提供一个高级概述,因为提供所有详细信息需要一篇博客文章 你需要什么
- 服务器
- Socket.io客户端或其将事件推送到Redis的新库之一李>
- 钩住所有服务器端数据隔离器以获得更新通知
- 观察所有余烬数据模型
{
meta: {
type: 'NAME_OF_YOUR_MODEL'
id: 'ID_OF_UPDATED_MODEL'
}
}
{
"meta": {
"type": "person"
"id": "18"
},
"persons": [
{"id": "18", "firstName": "Yahuda", "lastName": "Katz"}
]
}
代码:
选项二:模型的JSON表示,带有事件
有效载荷:
{
meta: {
type: 'NAME_OF_YOUR_MODEL'
id: 'ID_OF_UPDATED_MODEL'
}
}
{
"meta": {
"type": "person"
"id": "18"
},
"persons": [
{"id": "18", "firstName": "Yahuda", "lastName": "Katz"}
]
}
代码:
笔记
可以使用以更好地观察所有属性。这也消除了调用“另存为lastUpdate属性的一部分”的需要。我将为您提供一个高级概述,因为提供所有详细信息需要一篇博客文章 你需要什么
- 服务器
- Socket.io客户端或其将事件推送到Redis的新库之一李>
- 钩住所有服务器端数据隔离器以获得更新通知
- 观察所有余烬数据模型
{
meta: {
type: 'NAME_OF_YOUR_MODEL'
id: 'ID_OF_UPDATED_MODEL'
}
}
{
"meta": {
"type": "person"
"id": "18"
},
"persons": [
{"id": "18", "firstName": "Yahuda", "lastName": "Katz"}
]
}
代码:
选项二:模型的JSON表示,带有事件
有效载荷:
{
meta: {
type: 'NAME_OF_YOUR_MODEL'
id: 'ID_OF_UPDATED_MODEL'
}
}
{
"meta": {
"type": "person"
"id": "18"
},
"persons": [
{"id": "18", "firstName": "Yahuda", "lastName": "Katz"}
]
}
代码:
笔记
可以使用以更好地观察所有属性。这也消除了调用“另存为lastUpdate属性的一部分”的需要。我将为您提供一个高级概述,因为提供所有详细信息需要一篇博客文章 你需要什么
- 服务器
- Socket.io客户端或其将事件推送到Redis的新库之一李>
- 钩住所有服务器端数据隔离器以获得更新通知
- 观察所有余烬数据模型
{
meta: {
type: 'NAME_OF_YOUR_MODEL'
id: 'ID_OF_UPDATED_MODEL'
}
}
{
"meta": {
"type": "person"
"id": "18"
},
"persons": [
{"id": "18", "firstName": "Yahuda", "lastName": "Katz"}
]
}
代码:
选项二:模型的JSON表示,带有事件
有效载荷:
{
meta: {
type: 'NAME_OF_YOUR_MODEL'
id: 'ID_OF_UPDATED_MODEL'
}
}
{
"meta": {
"type": "person"
"id": "18"
},
"persons": [
{"id": "18", "firstName": "Yahuda", "lastName": "Katz"}
]
}
代码:
笔记
可以使用以更好地观察所有属性。这也消除了调用“另存为lastUpdate属性的一部分”的需要。op不想切换到socket.io,而是使用基于spring和WebSocket的现有基础结构。查看stompjsop不想切换到socket.io,而是使用基于spring和WebSocket的现有基础结构。查看stompjsop不想切换到socket.io,而是使用基于spring和WebSocket的现有基础结构。查看stompjsop不想切换到socket.io,而是使用基于spring和WebSocket的现有基础结构。查看stompjs