Развертывание канала движка приложения - PullRequest
0 голосов
/ 20 декабря 2011

Я создал приложение, в котором ~ 50 пользователей.Я пытаюсь использовать канал API, но у меня возникла проблема при тестировании с отправкой сообщения.Я сохраняю токен в базе данных, чтобы я мог использовать тот же токен, если пользователь открывает несколько вкладок с одним и тем же интерфейсом, и у меня есть сервлет, который сбрасывает мой токен по истечении срока действия.

Он работает нормально, пока я не переустановлюмое приложение или измените версию моего приложения.Я прекращаю получать сообщения.Если я пытаюсь открыть канал со старым токеном версии приложения, он не выдает ошибку или что-то еще, он открывает его, но я все равно не получаю сообщения на этом канале.
Если я сбрасываю свой токен, он снова работает нормально.

Кто-нибудь знает решение этой ошибки, или кто-то имел его раньше?Я часто развертываюсь, когда люди работают, поэтому я не могу игнорировать это.

Я думаю, что ChannelServiceFactory.getChannelService() возвращает другой экземпляр ChannelService, поэтому, когда я вызываю channelService.sendMessage("id","message");, он отправляет его другомуканал.

1 Ответ

1 голос
/ 20 декабря 2011

Я не могу объяснить, почему сохраненные токены не будут работать при повторном развертывании вашего приложения (они должны это делать), но я могу объяснить, почему они не работают, когда вы меняете версии.Вкратце, токены зависят от версии приложения.

Во-первых, причина этого: мы хотим, чтобы приложения, отправляющие разные данные или изменяющие форматы сообщений или что-либо другое в разных версиях, не отправляли сообщения через границы версий.,Точно так же, как вы не хотите, чтобы ваш пакет 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.

В результате токены действительны только для сообщений, отправленных из той же версии приложения,создал их.

...