Развертывание канала движка приложений

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

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

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

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


person Bogdan.Nourescu    schedule 20.12.2011    source источник
comment
Использование одного и того же канала на нескольких вкладках не сработает - к каждому каналу одновременно должен быть подключен только один клиент.   -  person Nick Johnson    schedule 21.12.2011


Ответы (1)


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

Во-первых, причина этого: мы хотим убедиться, что приложения, которые отправляют разные данные или изменяют форматы сообщений или что-то еще в разных версиях, не отправляют сообщения через границы версий. Точно так же, как вы не хотите, чтобы ваш пакет javascript из v1 отображался против сервлетов на v2, вы не хотели бы, чтобы v1 ваши обработчики сообщений javascript получали сообщения от сервлетов v2 (или наоборот).

Итак, чтобы прояснить, что происходит:

Канал идентифицируется комбинацией вашего appid, версии вашего приложения и клиента, который вы предоставляете при вызове createChannel или sendMessage. Реализация 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));
}

а на стороне клиента сервлет, ответственный за канал, расшифровывает токен и связывается с конечной точкой, идентифицированной JID, созданным тем же методом, что и функция sendMessage.

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

person Moishe Lettvin    schedule 20.12.2011