Исключение API канала GAE / J, хотя сообщения проходят?

Я открываю канал во время инициализации приложения с помощью серии вызовов 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: канал для нулевого ключа приложения не найден.

Часть создания канала очень проста, поэтому я не понимаю, в чем проблема. System.out.println (channelToken); возвращает что-то вроде

канал - rrmk8i-100002139544068

(100002139544068 - это идентификатор пользователя, который я использовал для создания канала), поэтому кажется, что он возвращает настоящий токен. Более того, channelService.sendMessage(msg); (используя тот же uid, что и раньше) отправляет сообщение без каких-либо проблем.

Кто-нибудь знает, почему это происходит? Я использую eclipse 3.5.2, GAE / J 1.4.2 и ubuntu 10.10

Поискав в Google для этого исключения, я нашел здесь только одно обсуждение: 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); ничего не решило (и, насколько я понимаю, не должно)


person Aleadam    schedule 20.03.2011    source источник
comment
Извините, я должен добавить, что я запускаю его на localhost и что socket.onError не вызывается.   -  person Aleadam    schedule 20.03.2011


Ответы (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

Часть channel-1503856530-alpha-token этого URL-адреса - это токен, переданный "new goog.appengine.Channel()".

person Moishe Lettvin    schedule 21.03.2011
comment
Действительно, я перезагружал сервер как часть отладки сервлета Java. Я протестирую это сегодня вечером, но я почти уверен, что это так. Я всегда обновлял страницу клиента, прежде чем продолжить, и, вероятно, поэтому все остальное работало нормально. - person Aleadam; 21.03.2011
comment
Я также хотел поблагодарить вас за быстрый ответ. Приятно пользоваться платформой, зная, что разработчики готовы помочь. - person Aleadam; 21.03.2011
comment
Отвечать на вопросы - одна из моих любимых частей моей работы! Рад помочь. - person Moishe Lettvin; 22.03.2011