CometD v3.0.9 - отключение на стороне сервера не устанавливает флаг успешного сообщения (канал /meta/disconnect)

Мы обновляем cometd с версии 2.5 до 3.0.9, но с отключенными веб-сокетами. Одно из изменений, которые мы заметили, это: метод org.cometd.server.ServerSessionImpl disconnect() больше не устанавливает флаг успешного сообщения перед его публикацией в канале «/meta/disconnect». Замечено в репозитории GitHub cometd, что он был удален как часть фиксации 14 октября 2015 г. — Улучшена обработка отключений на стороне сервера (пользователь sbordet).

public void disconnect()
{
    boolean connected = _bayeux.removeServerSession(this, false);
    if (connected)
    {
        ServerMessage.Mutable message = _bayeux.newMessage();
        message.setChannel(Channel.META_DISCONNECT);
        // message.setSuccessful(true);
        deliver(this, message);
        flush();
    }
}

Теперь на стороне клиента мы используем jquery для взаимодействия с cometd (jquery.cometd.js). Мы запускаем переподключение всякий раз, когда получаем сообщение об отключении от кометда со стороны сервера. Мы проверяем следующее условие перед попыткой повторного подключения.

$.cometd.isDisconnected() && (message.channel == "/meta/disconnect" && message.successful)

Проверка message.successful завершается ошибкой, так как она никогда не устанавливается на стороне сервера из-за изменения API отключения. Следовательно, сеанс никогда не переподключается/не восстанавливается, что приводит к тому, что сервер вообще не знает об этом сеансе, и, следовательно, серверная сторона не отправляет какие-либо служебные сообщения сервера на клиентскую сторону.

Мы хотим сохранить эту проверку, так как во время выхода из системы этот флаг успешно установлен. Во время выхода из системы мы вызываем приведенный ниже метод на стороне клиента, который, в свою очередь, вызывает вызов DisconnectHandler на стороне сервера (под BayeuxServerImpl). Событие сообщения DisconnectHandler устанавливает этот флаг в значение true в ответном сообщении.

$.cometd.disconnect()

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


person crathour    schedule 29.09.2016    source источник


Ответы (1)


Флаг successful был удален из сообщения об отключении на стороне сервера, поскольку это незапрашиваемое сообщение, а не ответ на инициированное клиентом отключение, и необходимо было различать их.

Незапрашиваемые сообщения не имеют полей сообщений id и successful.

Если сервер отключил клиента, и вы хотите повторно подключить этого клиента, достаточно зарегистрировать прослушиватель для канала /meta/disconnect. Как для незапрашиваемых отключений, так и для ответов на разъединение будет вызываться прослушиватель, и вы можете повторно handshake(), если хотите.

person sbordet    schedule 30.09.2016
comment
Спасибо, Симона, за ваш ответ. Насколько я понимаю, у нас может быть необязательное сообщение об успешной проверке. То есть в /meta/disconnect listener проверяйте наличие этого флага, только если он доступен. Следовательно, проверка будет продолжаться, как и для отключений, инициированных клиентом, и не будет выполняться для отключений, инициированных сервером (т. е. незапрошенных сообщений) из-за отсутствия этого флага. - person crathour; 30.09.2016
comment
В отдельном примечании мы всегда наблюдаем указанное ниже информационное исключение, регистрируемое в консоли браузера после обновления с помощью javascript cometd, хотя это не влияет на какую-либо функциональность. Это то, о чем мы должны беспокоиться? Exception during execution of extension reload Abstract Наше первоначальное наблюдение заключается в том, что это обычно происходит, когда сообщение принадлежит каналу /meta/connect, а идентификатор равен 402:Неизвестный клиент. Вполне возможно, что это происходит в других случаях, но не уверен. В конце концов, логика повторного подключения приводит к тому, что сообщение имеет действительный идентификатор и, следовательно, не видит никакого влияния. - person crathour; 30.09.2016
comment
Exception during execution of extension reload Abstract связано с тем, что у вас нет библиотеки файлов cookie, которая переопределяет эти абстрактные методы. Что вы используете, jQuery или Dojo? - person sbordet; 30.09.2016
comment
Привет, Симоне, мы используем jQuery. Есть ли библиотека файлов cookie, которую рекомендуется использовать? Обратите внимание на приведенный ниже дистрибутив tar кометд 3.0.9. один?? Как повлияет на приложение, если мы начнем его использовать, помимо избавления от исключения? Спасибо.. - person crathour; 03.10.2016
comment
jquery.cookie.js — это одна из библиотек, которую вы можете использовать, да. Если вы его не используете, расширение перезагрузки не будет работать - и да, вы используете расширение перезагрузки, иначе это исключение не было бы вызвано. - person sbordet; 03.10.2016
comment
Спасибо, Симона. Я пытался использовать последнюю версию jquery.cookie (v2.1.3), но похоже, что поддержка jQuery сейчас прекращена. См. следующую ссылку: - [github.com/js-cookie/js-cookie/релизы]. Следовательно, я использовал v1.4.1, последнюю версию с поддержкой jQuery. Тот, что находится внутри дистрибутива tar cometd, был примерно на пару лет старше этого. Я больше не получаю исключение перезагрузки расширения. Так что спасибо за это ... Есть ли у вас какая-либо документация, на которую я могу ссылаться, чтобы изучить значение каждого файла javascript в библиотеке cometd, то есть для чего они используются? - person crathour; 13.10.2016
comment
Спасибо, Симона. Я пытался использовать последнюю версию jquery.cookie (v2.1.3), но похоже, что поддержка jQuery сейчас прекращена. См. следующую ссылку: - ссылка. Следовательно, я использовал v1.4.1, последнюю версию с поддержкой jQuery. Тот, что находится внутри дистрибутива tar cometd, был примерно на пару лет старше этого. Я больше не получаю исключение перезагрузки расширения. Так что спасибо за это ... Есть ли у вас какая-либо документация, на которую я могу ссылаться, чтобы изучить значение каждого файла javascript в библиотеке cometd, то есть для чего они используются? - person crathour; 13.10.2016
comment
В документации о расширении перезагрузки упоминается необходимость поддержки файлов cookie, а для jQuery — потребность в подключаемом модуле, который это делает. В CometD 3.1.x этого не требуется, потому что расширение перезагрузки теперь будет использовать средство sessionStorage. - person sbordet; 14.10.2016