我在应用初始化期间通过一系列ajax调用打开了一个频道:
getToken = function () {
xhr = new XMLHttpRequest();
xhr.open("GET", "/game?action=getChannelToken", true);
xhr.send(null);
xhr.onreadystatechange = function() {
if (this.readyState == 4 && this.status==200) {
connect(xhr.responseText);
}
};
};
的Servlet
ChannelService channelService = ChannelServiceFactory.getChannelService();
channelToken = channelService.createChannel(uid);
然后将令牌返回到javascript:
connect = function (token) {
// alert ("connect");
var channel = new goog.appengine.Channel(token);
var socket = channel.open();
socket.onopen = onOpened;
socket.onmessage = onMessage;
socket.onerror = onError;
socket.onclose = onClose;
};
我收到了这个错误:
警告:/ _ah / channel / dev com.google.appengine.api.channel.dev.LocalChannelFailureException: 应用程序密钥的通道不为null 找到。
频道创建部分非常简单,所以我不明白问题出在哪里。
System.out.println (channelToken);
返回类似
信道 - rrmk8i-100002139544068
(100002139544068是我用来创建频道的uid),所以它似乎返回一个真正的令牌。此外,channelService.sendMessage(msg);
(使用与以前相同的uid)发送消息没有任何问题。
有谁知道为什么会这样? 我正在使用eclipse 3.5.2,GAE / J 1.4.2和ubuntu 10.10
谷歌搜索该例外我在这里只找到一个讨论: http://groups.google.com/group/google-appengine-java/browse_thread/thread/19f250b1ff0e4342
但是将var channel = new goog.appengine.Channel(token);
更改为var channel = new goog.appengine.Channel(uid);
并没有解决任何问题(根据我的理解,它不应该解决)
答案 0 :(得分:4)
我可以想到可能发生的两个原因:
当您的客户端仍在运行时,您正在重新启动dev_appserver.py。因为客户端将使用dev_appserver不知道的“旧”标记进行轮询,所以它将抛出此错误。如果是这种情况,只需在重新启动dev_appserver后刷新客户端页面(否则强制它请求新令牌)。
使用无效令牌调用connect()。听起来你已经排除了这一点,但如果上述情况不正确,可能值得仔细检查。
您可以查看客户端轮询的令牌,您可以打开Firebug或Chrome开发者控制台,并查找对此路径的请求:
http://localhost:8080/_ah/channel/dev?command=poll&channel=channel-1503856530-alpha-token&client=1
该网址的channel-1503856530-alpha-token
部分是传递给“new goog.appengine.Channel()
”的令牌。