【问题标题】:GAE/J Channel API exception even though messages go through?即使消息通过,GAE/J Channel API 异常?
【发布时间】:2011-07-19 00:36:37
【问题描述】:

我在应用初始化期间通过一系列 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);
        }
    };
};

小服务程序:

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); 并没有解决任何问题(据我了解,它不应该)

【问题讨论】:

  • 对不起,我应该补充一点,我在 localhost 上运行它并且未调用 socket.onError。

标签: java javascript google-app-engine channel-api


【解决方案1】:

我能想到这可能发生的两个原因:

  1. 您正在重新启动 dev_appserver.py,而您的客户端仍在运行。因为客户端将使用 dev_appserver 不知道的“旧”令牌进行轮询,所以它会抛出此错误。如果是这种情况,只需在重新启动 dev_appserver 后刷新您的客户端页面(或强制它请求新令牌)。

  2. connect() 正在使用无效令牌调用。听起来您已经排除了这种可能性,但如果上述情况不正确,则可能值得仔细检查。

您可以查看客户端轮询的令牌,您可以打开 Firebug 或 Chrome 开发控制台并查找对如下路径的请求:

http://localhost:8080/_ah/channel/dev?command=poll&channel=channel-1503856530-alpha-token&client=1

该 URL 的 channel-1503856530-alpha-token 部分是传递给“new goog.appengine.Channel()”的令牌。

【讨论】:

  • 确实,作为 java servlet 调试的一部分,我正在重新启动服务器。我今晚会测试它,但我很确定情况就是这样。我总是在继续之前刷新客户端页面,这可能就是其他一切正常的原因。
  • 我还要感谢您的快速回复。很高兴使用一个知道开发人员可以提供帮助的平台。
  • 回答问题是我工作中最喜欢的部分之一!很高兴能提供帮助。
猜你喜欢
  • 1970-01-01
  • 2014-04-16
  • 1970-01-01
  • 2015-10-18
  • 2015-07-13
  • 2015-09-21
  • 1970-01-01
  • 2011-05-07
  • 1970-01-01
相关资源
最近更新 更多