Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当多个客户端查看同一数据时,如何保持有状态web客户端的同步?_Java_Gwt_Webclient_Stateful - Fatal编程技术网

Java 当多个客户端查看同一数据时,如何保持有状态web客户端的同步?

Java 当多个客户端查看同一数据时,如何保持有状态web客户端的同步?,java,gwt,webclient,stateful,Java,Gwt,Webclient,Stateful,在使用GWT创建的RIA web客户端中,状态在web客户端中维护,而服务器(几乎)是无状态的(这是保持站点可伸缩性的首选技术) 但是,如果多个用户在其浏览器中查看相同的数据,并且一个用户更改了某些内容,这些内容将发送到服务器并存储在数据库中,则其他用户的浏览器状态中仍保留旧数据。例如,显示一个树,其中一个用户从树中添加/删除一个项目 既然客户机中可能有很多状态,那么保持客户机状态同步的最佳技术是什么?是否有java框架可以解决这个问题?仅推送更改(增量),如果不适用,则完全重新同步客户端。这就

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

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


既然客户机中可能有很多状态,那么保持客户机状态同步的最佳技术是什么?是否有java框架可以解决这个问题?

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

到目前为止,我尝试过的最有前途的HTTP推送(Comet)库是:

StreamHub是一种高度可扩展的HTTP Comet和ReverseAjax服务器允许 您可以将实时数据推送到web浏览器 不需要任何插件或 安全策略更改。它使用一个 被称为彗星或反转的技术 保持持久连接的Ajax 打开浏览器


这可能就是你想要让你的客户保持最新状态的原因。他们也有一个项目。

使用该项目,GWT中也提供了Comet支持(它还提供了一系列其他很酷的功能,如轻量级集合、拖放等)——Comet由软件包提供。

我的flex应用程序也面临同样的困境

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

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

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

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

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

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

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

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

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

虽然有延迟,但它肯定有助于将更改传播到客户端

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

我是在每个屏幕的情况下这样做的,一旦该屏幕不可见,客户端缓存为空,一旦再次调用该屏幕,本地缓存被创建,计时器启动,轮询开始。

希望有帮助


Ernani

StreamHub是部分商业产品(免费基本版),他们的网站上没有定价,这总是让我感觉不好,读起来很昂贵。Comet只是客户端和服务器之间“实时”通信的技术,但无助于保持多个客户端的同步。或者我错过了什么?如果服务器和客户端彼此有“实时”视图,当服务器收到一个客户端的更改通知时,它可以立即将该更改发布到所有其他客户端。至于具体推送什么的技术,我可能会将增量更改推送到每个客户机,并定期进行工作以确保所有内容都同步,比如每10分钟向每个客户机推送一张更完整的状态图,以确保所有内容都正常。并确保您的服务器能够注意到两个客户端对某个对象所做的更改,并且能够适应这些更改,以防出现不同步的情况。请在OT上签出此演示文稿,并阅读更多关于-