有没有办法从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组件(表、标签)。你知道该怎么做吗?
发布于 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来流式传输数据:
Payload payload = new JsonPayload("AAPL");
payload.addField("bid", "88.84");
payload.addField("ask", "88.86");
server.publish("AAPL", payload);
...从google代码站点下载JAR,将其添加到GWT项目类路径中,并将include添加到GWT模块中:
<inherits name="com.google.gwt.json.JSON" />
<inherits name="com.streamhub.StreamHubGWTAdapter" />从您的GWT代码连接和订阅:
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代码中)中以您喜欢的方式处理更新:
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。
发布于 2009-03-08 05:27:28
我已经在几个项目中使用了这种技术,尽管它确实存在问题。我应该注意到,我只通过GWT-RPC专门完成了这项工作,但是无论您使用哪种机制来处理数据,原理都是相同的。根据你到底在做什么,可能没有太多需要把事情复杂化。
首先,在客户端,我不相信GWT能够正确地支持任何类型的流数据。在客户端可以实际处理数据之前,连接必须关闭。从服务器推送的角度来看,这意味着您的客户端将连接到服务器并阻塞,直到数据可用,此时将返回数据。无论在已完成的连接上执行什么代码,都应该立即重新打开与服务器的新连接,以等待更多数据。
在服务器端,您只需进入等待周期( java并发包在块和超时方面特别方便),直到有新数据可用。在该时间点,服务器可以向下返回数据包到客户端,客户端将相应地更新。根据数据流的不同,有很多考虑因素,但这里有一些需要考虑的:
我发现服务器推送方法有两个问题。对于大量的客户端,这意味着web服务器上有大量的开放连接。根据所讨论的web服务器,这可能意味着创建并保持打开的线程很多。第二个问题与典型的浏览器每个域2个请求的限制有关。如果您能够为您的图像,css和其他静态内容的二级域名,这个问题可以减轻。
发布于 2009-03-08 04:56:44
gwt - http://code.google.com/p/gwteventservice/确实有一个类似cometd的库
但是我个人并没有用过它,所以不能保证它是好的还是不好的,但是文档看起来很不错。值得一试。
我还见过一些其他的库,比如gwt-rocket's cometd库。
https://stackoverflow.com/questions/618656
复制相似问题