通道 API 通道在没有 onclose 或 onerror 调用的情况下断开连接。 JavaScript 控制台包含对talkgadget.google.com 的HTTP 调用失败的日志
Posted
技术标签:
【中文标题】通道 API 通道在没有 onclose 或 onerror 调用的情况下断开连接。 JavaScript 控制台包含对talkgadget.google.com 的HTTP 调用失败的日志【英文标题】:Channel API channel gets disconnected without onclose or onerror calls. JavaScript console has logs of failed HTTP calls to talkgadget.google.com 【发布时间】:2013-12-06 16:55:22 【问题描述】:我在我的应用程序中实现了 Google App Engine 的 Channel API 功能。一切运行顺利。我每隔一小时为每个用户创建新频道。我设法为每个会话维护一个频道(浏览器中不同选项卡的相同频道)。我已经实现了 onerror 和 onclose 方法,每次调用它们时,都会调用服务器请求有效令牌。
有时,在频道运行一段时间后,它会断开连接。我可以在 javascript 控制台上看到对 talkgadget.google.com 的 HTTP 调用失败。 URL 是这样的:
https://129.talkgadget.google.com/talkgadget/dch/bind?VER=8&clid=.....
这些调用的响应类似于“401(令牌超时)”或“401(令牌无效)”。 确实如此,客户端使用的令牌无效。它应该使用新令牌进行更新,但不会调用 onerror 或 onclose 方法。我应该如何确定何时会发生这种情况或如何处理?除了 onerror 或 onclose 方法外,没有真正的方法可以判断客户端是否断开连接。如果我刷新页面,这个问题就解决了(每次用户刷新时我都会从数据库中获取有效的令牌)。
我检查了套接字对象的“readyState”属性,它的值为 1。有很多人面临这个问题,到目前为止,GAE 的人们似乎没有提供有效的解决方案。
编辑:我是高级帐户持有人,这个问题阻碍了我们的部署。
编辑 2:每个标签有一个频道可以减少这种情况发生的频率。但这并不能完全解决问题。
【问题讨论】:
这是一个很棒的问题!它只需要来自 Google App Engine 工程师的惊人答案。 【参考方案1】:我发布问题已经六天了,AppEngine 团队或任何其他用户都没有回复。
我应用的解决方法是在站点上设置一个按钮,该按钮将从数据库中获取(有效)令牌,关闭通道,然后使用收到的令牌再次打开它。 有时它是一个以前应该收到的新令牌,有时它是一直有效的同一个令牌。
我同意这个问题不能经常被复制,但是一旦发生,就会造成很大的损失。我希望我能尽快找到解决方案。
编辑:每个标签有一个频道可以减少这种情况发生的频率。但这并不能完全解决问题。
【讨论】:
以上是关于通道 API 通道在没有 onclose 或 onerror 调用的情况下断开连接。 JavaScript 控制台包含对talkgadget.google.com 的HTTP 调用失败的日志的主要内容,如果未能解决你的问题,请参考以下文章
Spring Integration 没有输出通道或回复通道
是否可以使用 Signaling API 获取先前的通道或点对点消息?