GWT RequestFactory并将服务器端的更改传播到客户端

时间:2013-03-29 09:19:53

标签: gwt server-push

我需要一些建议,说明如何使用GWT的RequestFactory最好地处理服务器端实体向客户端的传播。

让我们假设我们有两个EntityProxies,一个PersonProxy和一个PersonListProxy(它有一个List的getter)。假设客户端从服务器获取了PersonList和Person。

如果客户端正在编辑其中一个代理并触发请求,则RequestFactory的机制(如果我已正确理解原则)将触发EntityProxyChange事件,如果它检测到服务器代码所做的更改(以便客户端可以例如,更新其实体的显示。

现在假设服务器正在更改其客户端请求之外的实体(例如,由于另一个客户端调用服务器),因此如果客户端再次获取Person或PersonList,则会看到另一个版本。

我的问题是RequestFactory框架内部告诉客户端更改(以及尽可能多地重用机器)的最佳方法是什么?我们可以假设我有办法从服务器向客户端发送简单的消息(例如Google App Engine的渠道API或服务器发送的事件)。

一个想法可能是服务器通过此通道发送一条消息,告知具有特定ID的Person或PersonList已更改。然后,处理这些消息的接收的客户端代码可以使用RequestFactory来重新获取(例如,查找)该实体。然后,应通过EntityProxyChange事件将此更改传播到客户端的其他部分。

这是要走的路吗? (如果客户端已经拥有当前版本的实体,例如因为服务器很笨并且通知客户端客户端自己做出的更改,那么触发的重新获取只会传输一些元数据,而不是整个实体再次?)

增加:

想一想,我想知道如何为服务器发送的事件通道生成EntityProxyId。当服务器上的实体发生更改时,服务器仅具有服务器标识。然后它可以将它发送给客户端,但客户端只知道EntityProxyId。当然,我可以为每个EntityProxy添加一个getId()(除了getStableId()),但看起来好像这会为每个服务器响应添加冗余数据。

1 个答案:

答案 0 :(得分:2)

嗯,我意识到我的帖子不是你问题的准确答案,但这只是我的经验。 实际上,如何将数据从服务器传递到客户端只是一个问题。 几年前我遇到了一些任务,为自己找到了让生活更轻松的方法。为了解释它,我想说明我的理由:

  • 您必须通过从客户端请求完整的数据传输 - 这是直接,自然的方式来请求数据;
  • 您不想创建和支持2种不同的完整数据传输模型:一种是通过客户端请求,另一种是通过从服务器推送;
  • 但是您需要告知客户端服务器端的一些更改;

所以,现在我正在使用以下方法构建我的架构:

  1. 构建完整的经典客户端 - 服务器API以进行数据传输 - 因此即使您的推送功能被阻止或损坏,您也可以自然地加载和刷新应用程序。
  2. 定义可在服务器端更改的密钥信息,并应通过推送机制传送给客户端。
  3. 创建小型推送消息构造,它将向客户端提供有关更改的通知 - 不应以这种方式传递任何有价值的数据 - 只需将数据键传递给客户改变了。
  4. 客户端收到此类通知时需要做的就是以已支持的自然客户端 - 服务器方式从服务器获取/刷新数据。
  5. 服务器逻辑不应该通过大量通知来打扰客户端 - 有时更有效的是不提供更改,而只是刷新所有内容。
  6. 希望这有帮助。