2011-12-20 4 views
0

〜50人のユーザーを持つアプリケーションを作成しました。 チャネルAPIを使用しようとしていますが、メッセージの送信をテストする際に問題が発生しました。 トークンをデータベースに保存しているので、ユーザーが同じインターフェイスで複数のタブを開き、期限が切れたときにトークンをリセットするサーブレットがある場合、同じトークンを使用できます。アプリケーションエンジンチャネルのデプロイ

アプリケーションを再デプロイするか、アプリケーションのバージョンを変更するまで問題なく動作します。メッセージの受信を停止します。古いアプリバージョントークンでチャンネルを開こうとすると、エラーや何もスローされませんが、それを開きますが、まだそのチャンネルでメッセージを受信しません。
私のトークンをリセットすると、再び正常に動作します。

このバグの解決策を知っている人はいますか?私はしばしば人々が働いている間に展開するので、私はそれを無視できません。

ChannelServiceFactory.getChannelService()ChannelServiceの別のインスタンスを返すので、channelService.sendMessage("id","message");と呼び出すと、別のチャネルに送信されます。

+1

複数のタブで同じチャンネルを使用することはできません。一度に1つのクライアントだけを各チャンネルに接続する必要があります。 –

答えて

1

ストアドトークンがアプリの再デプロイ時に機能しない理由を説明することはできませんが、バージョンを変更したときに機能しない理由を説明できます。簡単に言うと、トークンはアプリ版に固有のものです。

最初は、異なるデータを送信したり、メッセージフォーマットを変更したり、バージョンが異なるアプリケーションがバージョン境界を超えてメッセージを送信しないようにするためです。あなたのjavascriptバンドルをv2のサーブレットからv1レンダリングしたくないのと同じ方法で、v1のjavascriptメッセージハンドラがv2サーブレットからのメッセージを受け取ることは望ましくありません。うまくいけば、何が起こっているのか、それを明確にするので

、:

チャンネルはあなたのAPPIDの組み合わせ、アプリのバージョン、およびあなたがcreateChannelかのsendMessageを呼び出すときに提供したClientIDによって識別されます。 Channel APIの実装では、appid/clientid - > tokenのマッピングは保存されません。大幅に簡素化するために、あなたはこのような何かやってcreateChannelと考えることができます:

public String createChannel(clientid) { 
    // obviously we don't really just append strings to each other for actual implementation. 
    return encryptStringSomehow(clientid + globalAppInfo.version + globalAppInfo.appid); 
} 

をとのsendMessageは、このようなものです:

public void sendMessage(clientid, message) { 
    // identify the JID used for this channel. 
    JID xmppJid = new JID(mutateString(clientid + globalAppInfo.version + globalAppInfo.appid), 
         CHANNEL_XMPP_DOMAIN); // some domain used for channel messages 
    // send the <message> stanza to that jid with the application message as the body 
    xmppService.sendMessage(xmppJid, encodeSomehow(message)); 
} 

と、クライアント側で、チャンネルを担当するサーブレットはトークンを復号化sendMessage関数と同じ方法で作成されたJIDによって識別されるエンドポイントにバインドします。

トークンは、トークンが作成されたアプリケーションの同じバージョンから送信されたメッセージに対してのみ有効です。