Google App Engine 中渠道 API 的渠道断开通知
我在手机上使用我的GAE应用程序。遇到一个问题,就是在使用通道API时,即使我手动调用socket.close()来关闭连接,还是收不到/_ah/channel/disconnected的断开通知。这个通知大约会延迟一分钟才发出。有没有人知道怎么加快这个过程?在我的情况下,socket.close()并没有在手机上产生通道断开通知(在笔记本上是正常的)!
1 个回答
前端服务器需要一些时间才能“意识到”一个频道已经断开,这个时间取决于浏览器的表现。
在表现良好的浏览器中,我们会捕捉到一个叫做beforeunload的事件,并向前端发送一条消息,告诉它“这个客户端要离开了”。但在其他浏览器中,我们可能收不到这个事件(或者因为各种原因无法监听,比如某些浏览器发送这个事件的频率太高(真是让人无奈的IE)),或者即使收到了这个事件,我们发送的请求可能会被吞掉。在这种情况下,前端服务器会因为收不到心跳信号而意识到客户端已经不在了——这就是你手机上发生的情况。(顺便问一下,你用的是什么手机?)
你的情况很有趣,因为你明确调用了onclose。这个操作只是关闭了包含频道前端代码的iframe——换句话说,onclose的效果就像是整个浏览器窗口被关闭了一样;它没有利用浏览器仍然处于良好状态的事实,能够等到发送消息后再关闭。
所以我建议你做两件事:在你的代码中添加一个自定义处理程序(和你的/_ah/disconnect处理程序做一样的事情),这样在你手动关闭频道时就可以发送一个请求。这虽然有点麻烦,但可以正常工作。需要注意的是,你需要在你的JavaScript代码中明确知道你的客户端ID。
第二,向我们的问题追踪系统添加一个问题(http://code.google.com/p/googleappengine/issues/list),请求在明确调用onclose时提供更好的断开通知。
希望这些对你有帮助;很抱歉现在没有简单的答案。