当多个客户端查看相同数据时,如何使有状态Web客户端保持同步?

时间:2010-05-19 08:44:55

标签: java gwt webclient stateful

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

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

由于客户端中可能存在大量状态,因此保持客户端状态同步的最佳方法是什么?是否有任何Java框架可以解决这个问题?

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

  

StreamHub是一种高度可扩展的HTTP   Comet和Reverse Ajax服务器允许   您将实时数据推送到Web浏览器   不需要任何插件或   安全政策的变化。它使用了   称为Comet或Reverse的技术   Ajax保持持久连接   打开浏览器。

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

答案 2 :(得分:0)

使用rocket-gwt项目(也提供了一系列其他很酷的功能,如轻量级集合,拖放等),GWT中也提供Comet支持 - Comet由{提供{3}}包。

答案 3 :(得分:0)

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

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

我已经采取了以下方法,请注意,这并没有解决不同步的情况,它只是显着减少了可能发生的情况。

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

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

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

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

两个实例都会不时地轮询服务器,例如10秒的更改间隔。 (如果服务器端缓存遭受更改,它将在下一个间隔调用时将新信息带到所有客户端。)

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

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

存在延迟,但它确实有助于将更改传播给客户端。

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

我是在 每个屏幕 的情况下执行此操作,一旦该屏幕不在视图中 客户端缓存已为空 再次调用该屏幕 创建本地缓存并启动计时器并开始轮询。 < /强>

希望有所帮助,

Ernani