首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GWT / Comet:有经验吗?

GWT / Comet:有经验吗?
EN

Stack Overflow用户
提问于 2009-03-06 12:18:31
回答 8查看 7.9K关注 0票数 6

有没有办法从GWT“订阅”到JSON对象流,并监听keep-alive连接上的传入事件,而不是试图一次获取所有事件?我相信这项技术的流行语是“彗星”。

假设我有一个HTTP服务,它打开keep-alive连接,并将JSON对象与传入的股票行情实时放在那里:

{"symbol": "AAPL", "bid": "88.84", "ask":"88.86"}

{"symbol": "AAPL", "bid": "88.85", "ask":"88.87"}

{"symbol": "IBM", "bid": "87.48", "ask":"87.49"}

{"symbol": "GOOG", "bid": "305.64", "ask":"305.67"}

...

我需要监听此事件并实时更新GWT组件(表、标签)。你知道该怎么做吗?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-07-22 21:19:22

有一个用于StreamHub的GWT Comet模块:

http://code.google.com/p/gwt-comet-streamhub/

StreamHub是一个带有免费社区版的Comet服务器。在action here中有一个这样的例子。

您需要下载StreamHub Comet服务器并创建一个新的SubscriptionListener,使用StockDemo示例作为起点,然后创建一个新的JsonPayload来流式传输数据:

代码语言:javascript
复制
Payload payload = new JsonPayload("AAPL");
payload.addField("bid", "88.84");
payload.addField("ask", "88.86");
server.publish("AAPL", payload);
...

从google代码站点下载JAR,将其添加到GWT项目类路径中,并将include添加到GWT模块中:

代码语言:javascript
复制
<inherits name="com.google.gwt.json.JSON" />
<inherits name="com.streamhub.StreamHubGWTAdapter" />

从您的GWT代码连接和订阅:

代码语言:javascript
复制
StreamHubGWTAdapter streamhub = new StreamHubGWTAdapter();
streamhub.connect("http://localhost:7979/");
StreamHubGWTUpdateListener listener = new StockListener();
streamhub.subscribe("AAPL", listener);
streamhub.subscribe("IBM", listener);
streamhub.subscribe("GOOG", listener);
...

然后在更新侦听器(也是在GWT代码中)中以您喜欢的方式处理更新:

代码语言:javascript
复制
public class StockListener implements StreamHubGWTUpdateListener {
      public void onUpdate(String topic, JSONObject update) {
          String bid = ((JSONString)update.get("bid")).stringValue();
          String ask = ((JSONString)update.get("ask")).stringValue();
          String symbol = topic;
          ...
      }
}

不要忘记在GWT项目的HTML主页面中包含streamhub-min.js。

票数 6
EN

Stack Overflow用户

发布于 2009-03-08 05:27:28

我已经在几个项目中使用了这种技术,尽管它确实存在问题。我应该注意到,我只通过GWT-RPC专门完成了这项工作,但是无论您使用哪种机制来处理数据,原理都是相同的。根据你到底在做什么,可能没有太多需要把事情复杂化。

首先,在客户端,我不相信GWT能够正确地支持任何类型的流数据。在客户端可以实际处理数据之前,连接必须关闭。从服务器推送的角度来看,这意味着您的客户端将连接到服务器并阻塞,直到数据可用,此时将返回数据。无论在已完成的连接上执行什么代码,都应该立即重新打开与服务器的新连接,以等待更多数据。

在服务器端,您只需进入等待周期( java并发包在块和超时方面特别方便),直到有新数据可用。在该时间点,服务器可以向下返回数据包到客户端,客户端将相应地更新。根据数据流的不同,有很多考虑因素,但这里有一些需要考虑的:

  • 是一个获取每一次更新的客户端吗?如果是这样,那么服务器需要缓存任何潜在的事件之间的时间,客户端获得一些数据,然后reconnects.
  • Are将有大量的更新?如果是这种情况,可能更明智的做法是打包多个更新并每隔几秒钟向下推送块,而不是让客户端一次获取一个更新。
  • 服务器可能需要一种方法来检测客户端是否已经离开,以避免为该客户端堆积大量缓存的包。

我发现服务器推送方法有两个问题。对于大量的客户端,这意味着web服务器上有大量的开放连接。根据所讨论的web服务器,这可能意味着创建并保持打开的线程很多。第二个问题与典型的浏览器每个域2个请求的限制有关。如果您能够为您的图像,css和其他静态内容的二级域名,这个问题可以减轻。

票数 5
EN

Stack Overflow用户

发布于 2009-03-08 04:56:44

gwt - http://code.google.com/p/gwteventservice/确实有一个类似cometd的库

但是我个人并没有用过它,所以不能保证它是好的还是不好的,但是文档看起来很不错。值得一试。

我还见过一些其他的库,比如gwt-rocket's cometd库。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/618656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档