6

在使用 GWT 创建的 RIA Web 客户端中,状态在 Web 客户端中维护,而服务器(几乎)是无状态的(这是保持站点可扩展性的首选技术)。

但是,如果多个用户在他们的浏览器中查看相同的数据并且一个用户更改了某些内容,这些内容被发送到服务器并存储在数据库中,其他用户仍然在他们的浏览器状态下拥有旧数据。例如,显示了一棵树,其中一个用户从树中添加/删除了一个项目。

由于客户端中可能有很多状态,那么使客户端中的状态保持同步的最佳技术是什么?有没有解决这个问题的java框架?

4

4 回答 4

1

仅推送更改(增量),它适用,如果不适用,则完全重新同步客户端。这就是我们对远程客户端所做的事情(不仅是 GWT,还有 Eclipse RCP)。当更改很小且是本地的时,我们发送增量上下文,并且在全局更改时我们重新同步。这将需要设计一个复杂的差异协议,并且通常需要从头开始重新设计远程客户端协议。

于 2010-05-19T09:09:26.677 回答
0

我在我的 flex 应用程序中遇到了同样的困境。

处理这个问题的最好方法似乎是在服务器和客户端之间保持几秒钟的间隔,并强制轮询每个客户端的状态。

我采用了以下方法,请注意,这并不能解决不同步的情况,它只是大大减少了可能发生的情况。

我在服务器端,每个集合调用的一个缓存。我在客户端,每个应用程序实例都有一个相同集合的缓存。

实例一将一些对象数组加载到网格中。(与服务器建立一个集合初始状态)

实例二加载并进行更改,将更改的数据提交到服务器,数据库信息被持久化并重建服务器缓存。 (客户端缓存还维护其本地缓存,无需再次调用服务器集合。)

实例一不同步。(将在下一个轮询间隔同步) 实例二是同步的,因为它是负责更改的应用程序。

两个实例都会不时地轮询服务器,例如每隔 10 秒进行一次更改。 (如果服务器端缓存发生变化,它将在下一次间隔调用时将新信息带给所有客户端。)

如果服务器端级别没有更改,则不会向已注册的客户端发送任何信息。 (这意味着服务器和客户端之间不交换任何信息,从而减少开销。)

如果第三个客户端进来,它的状态是新鲜的,并且会执行必要的调用来构建它的当前缓存。

有一个延迟,但它肯定有助于将更改传播给客户端。

问题是客户端通过保持其缓存状态消耗了一些额外的内存。

我在每个屏幕的情况下这样做,一旦该屏幕不在视野范围内客户端缓存为空一旦再次调用该屏幕就会创建本地缓存并启动计时器并开始轮询。

希望有帮助,

埃尔纳尼

于 2010-05-21T02:58:02.657 回答
0

到目前为止,我尝试过的最有前途的 HTTP Push (Comet) 库是StreamHub 项目

StreamHub 是一个高度可扩展的 HTTP Comet 和 Reverse Ajax 服务器,允许您将实时数据推送到 Web 浏览器,而无需任何插件或安全策略更改。它使用一种称为 Comet 或 Reverse Ajax 的技术来保持对浏览器的持久连接。

这可能是您正在寻找的让您的客户状态保持最新的东西。他们也有一个GWT 适配器项目。

于 2010-05-19T09:10:00.863 回答
0

在 GWT 中,使用Rocket-gwt项目也可以支持 Comet(该项目还提供了许多其他很酷的功能,如轻量级集合、拖放等)—— Comet 由Remoting包提供。

于 2010-05-19T17:25:16.043 回答