2

アプリの初期化中に一連の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、ubuntu10.10を使用しています

その例外をグーグルで検索すると、ここで1つのディスカッションしか見つかりませんでした: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);も何も解決しませんでした(そして、私が理解していることから、それは解決すべきではありません)

4

1 に答える 1

4

これが発生する可能性がある理由は2つ考えられます。

  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-tokenURLの一部は、「」に渡されるトークンnew goog.appengine.Channel()です。

于 2011-03-21T14:21:02.127 に答える