我创建了一个拥有约50个用户的应用程序。 我正在尝试使用通道API但我在使用消息发送进行测试时遇到了问题。 我将令牌保存到数据库中,因此如果用户打开具有相同接口的多个选项卡,并且我有一个servlet在其到期时重置我的令牌,我可以使用相同的令牌。
在我重新部署应用程序或更改应用程序版本之前,它一切正常。我停止接收消息。如果我尝试使用旧的应用程序版本令牌打开一个频道,它不会抛出错误或任何内容,它会打开它,但我仍然没有收到该频道上的消息。
如果我重置我的令牌,它再次正常工作。
有没有人知道这个bug的解决方案,或者之前有人拥有它?我经常在人们工作的时候进行部署,所以我不能忽视它。
我最好的猜测是,ChannelServiceFactory.getChannelService()
会返回ChannelService
的其他实例,因此当我致电channelService.sendMessage("id","message");
时,会将其发送到其他渠道。
答案 0 :(得分:1)
我无法解释为什么存储的令牌无法重新部署您的应用程序(他们应该),但我可以解释为什么它们在您更改版本时不起作用。简而言之,令牌特定于应用程序版本。
首先,原因是:我们希望确保发送不同数据或更改消息格式的应用程序或不同版本中的任何内容不会跨版本边界发送消息。就像你不希望v1渲染中的javascript包对v2上的servlet一样,你不希望v1你的javascript消息处理程序从v2 servlet接收消息(反之亦然)。
所以,希望明确发生了什么:
通过appid,应用版本以及调用createChannel或sendMessage时提供的clientid的组合来标识频道。 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标识的端点。
结果是令牌仅对从创建它们的相同版本的应用程序发送的邮件有效。