Ember.js 从Spring后端向web应用程序提供域实体的实时更新

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

在服务器端,我使用Spring4。在浏览器端,我使用Ember.js

我的应用程序有一些实体类,如
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