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

Posted

技术标签:

【中文标题】GWT RequestFactory 并将服务器端更改传播到客户端【英文标题】:GWT RequestFactory and propagating server-side changes to the client 【发布时间】:2013-03-29 09:19:53 【问题描述】:

我需要一些关于如何最好地使用 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()),但看起来这会给每个服务器响应添加冗余数据。

【问题讨论】:

非常有趣的问题!请注意:RF 中的“差异”始终是从客户端到服务器的(这就是 edit() 在客户端的用途:跟踪更改,以便进行差异) 啊,所以你说find 总是创建一个新的EntityProxy,并且不考虑任何已经存在的具有正确ID 和版本的EntityProxies,对吧?而且我应该小心在我的请求中返回小实体,因为这里没有与客户知识的差异,对吧? 明白了... RequestFactory 无法知道服务器端实体的哪些部分发生了变化,所以它要么全有,要么全无。 @Marc 嗨,我很想知道你最终是如何实现的。我面临同样的挑战,我也在服务器端使用 RF 和 GAE。您可以创建一个详细说明您的实施的答案吗?非常感谢! 【参考方案1】:

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

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

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

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

希望这会有所帮助。

【讨论】:

嗨 domax,你如何构建你的推送消息?我正在调查它,我可以找到 GAE 的 Channel API,但我找不到任何将它映射到客户端的 GWT 库(而且我不擅长编写 JS) 我使用github.com/Atmosphere/atmosphere 也可以在这里查看答案:***.com/questions/9825849/… 自从我上次去那里后它发生了变化。现在 GWT 支持在这里:github.com/Atmosphere/atmosphere-extensions/wiki/…

以上是关于GWT RequestFactory 并将服务器端更改传播到客户端的主要内容,如果未能解决你的问题,请参考以下文章

GWT requestfactory 验证外部服务器上的实体

如何将未更改的值发送到 gwt RequestFactory 中的服务器?

GWT 2.6 - RequestFactory Locator 找不到类似的域方法

GWT 的各种异步设施

什么时候应该使用 RequestFactory 与 GWT-RPC?

如何在小工具中使用 GWT RequestFactory?