应用引擎通道API未返回消息

2 投票
1 回答
900 浏览
提问于 2025-04-16 22:48

问题描述:频道消息没有返回到ajax脚本。最开始,消息是可以送到客户端的,但当我在js中设置了更长的超时时间后,就出现了问题:

goog.appengine.Socket.POLLING_TIMEOUT_MS = 5000; //每5秒轮询一次

我添加了一段非常简单的Python代码来测试我的Google App Engine应用中的频道API是否正常工作。

index:
token = channel.create_channel(CHANNEL_NAME)
channel.send_message(CHANNEL_NAME, message)
#token is passed to template

additional_view:
#is another view, trigger manually from browser after index
from django.utils import simplejson
channel.send_message(CHANNEL_NAME, simplejson.dumps(data))

在客户端,我有一段普通的js代码,里面有onMessage的处理逻辑。

问题是,没有消息返回到客户端的请求。所有请求在轮询的ajax中都是空的(在Firebug中可以看到)。在应用日志中,我可以看到频道是被创建的:

"创建频道令牌 channel-2382918168-broadcast,客户端ID为 broadcast",然后消息被发送,但有个注释:

中间出现了这些请求:

INFO     2011-08-03 14:33:32,000 dev_appserver.py:4248] "POST /_ah/channel/connected/ HTTP/1.1" 404 -
INFO     2011-08-03 14:33:33,780 dev_appserver.py:4248] "POST /_ah/channel/disconnected/ HTTP/1.1" 404 -

** ....消息文本...到频道,键为 (broadcast):没有客户端连接***

频道/消息的功能在更深层次上是怎样的?如果没有客户端连接,消息会丢失吗?还是会被新连接的客户端获取到?如果我出于某种原因创建一个同名的频道,会不会销毁里面未送达的消息?

1 个回答

6

尽量不要把 POLLING_TIMEOUT_MS 设置得超过1.5秒,否则开发服务器会认为你已经断开连接了。

在生产环境中,这种轮询方式是行不通的,所以你其实不用太担心超时的问题。

编辑:刚看到罗伯特的评论;我个人的经验是,如果在Chrome、Safari或Firefox中把轮询设置为3秒,反而会出现问题。现在我在我的应用里加上 ?disable_channel=true 的查询字符串,这样就可以在不让我的笔记本电脑过热的情况下运行它们了。

撰写回答