Я не могу объяснить, почему сохраненные токены не будут работать при повторном развертывании вашего приложения (они должны это делать), но я могу объяснить, почему они не работают, когда вы меняете версии.Вкратце, токены зависят от версии приложения.
Во-первых, причина этого: мы хотим, чтобы приложения, отправляющие разные данные или изменяющие форматы сообщений или что-либо другое в разных версиях, не отправляли сообщения через границы версий.,Точно так же, как вы не хотите, чтобы ваш пакет javascript от рендеринга v1 против сервлетов на v2, вы не хотели бы, чтобы v1 ваши обработчики сообщений javascript получали сообщения от сервлетов v2 (или наоборот).
Итак,чтобы, надеюсь, прояснить, что происходит:
Канал определяется по комбинации вашего appid, версии приложения и клиентской базы, которую вы указываете при вызове createChannel или sendMessage.Реализация 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));
}
и на стороне клиента сервлет, отвечающий заканал расшифровывает токен и привязывается к конечной точке, идентифицируемой JID, созданным тем же методом, что и функция sendMessage
.
В результате токены действительны только для сообщений, отправленных из той же версии приложения,создал их.