4

我需要一些关于如何最好地使用 GWT 的 RequestFactory 处理将服务器端更改传播到客户端的建议。

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

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

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

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

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

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

添加:

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

4

1 回答 1

2

好吧,我意识到我的帖子并不能准确回答您的问题,但这只是我的经验。实际上,如何将数据从服务器传递到客户端只是一个问题。几年前我面临一些任务,并为自己找到了一种让我的生活更轻松的方法。为了解释它,我想说明我的原因:

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

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

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

希望这可以帮助。

于 2013-06-08T18:01:37.580 回答