2011-12-20 74 views
0

我創建了一個擁有約50個用戶的應用程序。 我正在嘗試使用通道API,但在使用消息發送進行測試時遇到了問題。 我將令牌保存到數據庫中,因此如果用戶使用相同的界面打開多個選項卡,並且我有一個在過期時重置我的令牌的servlet,則可以使用相同的令牌。應用引擎通道部署

它工作正常,直到我重新部署我的應用程序或更改我的應用程序的版本。我停止接收消息。如果我嘗試使用舊的應用程序版本令牌打開一個頻道,它不會拋出錯誤或任何內容,但會打開它,但我仍然不會在該頻道上收到消息。
如果我重置我的令牌,它再次工作正常。

有沒有人知道這個錯誤的解決方案,或有人有過它?我經常在人們工作時部署,所以我不能忽視它。

我最好的猜測是,ChannelServiceFactory.getChannelService()返回ChannelService的不同實例,所以當我打電話channelService.sendMessage("id","message");將其發送到不同的頻道。

+1

在多個選項卡中使用相同的頻道將不起作用 - 一次只能將一個客戶端連接到每個頻道。 – 2011-12-21 02:08:23

回答

1

我無法解釋爲什麼存儲的令牌無法用於重新部署應用程序(他們應該),但我可以解釋爲什麼當您更改版本時它們不起作用。簡而言之,令牌特定於應用程序版本。

首先,原因是:我們希望確保發送不同數據或更改消息格式或不同版本的應用程序不會跨越版本邊界發送消息。同樣,您不希望從v1渲染對v2上的servlet進行JavaScript渲染,您不希望v1您的JavaScript消息處理程序從v2 servlet接收消息(反之亦然)。

所以,希望弄清楚是怎麼回事:

一個通道是由您的appid,您的應用程序版本和客戶端ID的組合,你當你調用createChannel或提供的sendMessage鑑定。 Channel API的實現不存儲任何appid/clientid - >令牌的映射。爲了極大地簡化了,你能想到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)); 
} 

,並在客戶端,負責渠道的servlet解密令牌並綁定到通過與sendMessage函數相同的方法創建的JID所標識的端點。

結果是令牌只對從創建它們的應用程序的相同版本發送的消息有效。