Опишите ошибку
По какой-то причине при использовании функции «UserAgent.stop ()» требуется около 30 секунд, чтобы остановить все, пока оно не ответит соответствующим обещанием.
То, что я пытаюсь достичь, - это команда полной отмены регистрации, при которой она не только отменяет регистрацию, но также:
Насколько я понимаю, именно это и делает функция stop (). Только на это уходит слишком много времени.
Журналы
Вот логи из консоли: логи
Наблюдаемое поведение
Только примерно через ~ 32 секунды мы можем увидеть: 15: 14: 05.797
Следующий журнал:
sip.subscribe-dialog | Timer N expired for SUBSCRIBE dialog. Timed out waiting for NOTIFY.
Только после указанного выше журнала удаляются издатели и транспортный уровень (WS).
Что заставляет меня думать, что это может произойти в результате этого сообщения SUBSCRIBE, что его таймер истек, но не совсем уверен.
Информация об окружающей среде
Подтверждено в коде ...
@ john-e-riordan, похоже, это проблема порядка действий.
Вверху user-agent.stop()
мы переходим в состояние Stopped
.
Затем мы перебираем registerers
, sessions
, затем subscriptions
.
Функция subscription.dispose()
праву отправляет SUBSCRIBE
с заголовком Expires=0
. В результате в SIP.js отправляется сообщение NOTIFY
указывающее, что подписка закрыта. Однако есть проверка в user-agent.onTransportMessage()
которая проверяет, остановлен ли user-agent
. А затем отбрасываем NOTIFY
из-за состояния пользовательского агента. Заставить подписчика ждать тайм-аута.
Мы будем работать над исправлением этого. Спасибо.
в связи с тем, что подписка закрыта. Однако есть проверка в
user-agent.onTransportMessage()
которая проверяет, остановлен лиuser-agent
. А затем отказавшись от сообщения "УКАЗАТЬ" из-за
Большое спасибо за быстрый ответ и за обнаружение первопричины проблемы! Надеюсь, это скоро исправят :)
Между прочим, я тестировал функцию stop()
когда я не выполняю свою первоначальную SIP SUBSCRIBE, что я также делаю при создании REGISTER, и все работает быстро. Но, конечно, мне понадобится ПОДПИСАТЬСЯ.
Еще раз спасибо!
Чтобы обойти это, вы можете избавиться от своих подписок вручную перед вызовом stop()
в пользовательском агенте.
Чтобы обойти это, вы можете избавиться от своих подписок вручную перед вызовом
stop()
в пользовательском агенте.
Спасибо! Уже сделано, но, как мне кажется, неэффективно. Если вы можете предложить мне лучший способ, это будет очень полезно.
У меня есть несколько подписок, которые я делаю, пока пользователь зарегистрирован (например, присутствие, конференция и некоторые другие события).
Есть ли способ перебрать все активные подписки и вызвать метод dispose
или unsubscribe
?
Я увидел, что могу получить список подписок, выполнив: userAgentObject._subscriptions
и он получает некоторый массив подписчиков, и по какой-то причине я не могу взять его и сделать с ним что-либо, например, повторение или что-то еще.
То, как я это делал сейчас, но опять же, мне это не нравится, для каждого типа события подписки я сохранил подписчика в другой глобальной переменной в классе и для каждой переменной подписчика я вызываю unsubscribe
method.
Кстати, а в чем разница между dispose
и unsubscribe
? Я предполагаю, что dispose
не откажется от подписки в АТС. Правильно? Если так, я думаю, что это менее рекомендуется, потому что в моем случае, если я не откажусь от подписки полностью, УАТС будет продолжать отправлять нерелевантные сообщения NOTIFY на мой Kamailio (что может привести к полной блокировке, потому что Kamailio заблокирует мою АТС, если она перегрузить его).
Чтобы обойти это, вы можете избавиться от своих подписок вручную перед вызовом
stop()
в пользовательском агенте.
Есть прогресс😊? Как это сделать до исправления ошибки?
У меня нет подписки, но UA.stop()
тоже очень медленный. Почти 1мин ...
Спасибо.
Чтобы обойти это, вы можете избавиться от своих подписок вручную перед вызовом
stop()
в пользовательском агенте.Есть прогресс😊? Как это сделать до исправления ошибки?
У меня нет подписки, но
UA.stop()
тоже очень медленный. Почти 1мин ...Спасибо.
Нет, эта проблема еще не решена.
Но вы можете сделать то, что сделал я ... вы можете просто уничтожить свои объекты вручную один за другим в следующем логическом порядке:
Желательно, чтобы каждое действие выполнялось с обещаниями. Я имею в виду, используйте then
чтобы вы могли дождаться каждого обещания действия, чтобы вернуться и действовать соответственно, чтобы выполнить следующий шаг.
У меня такая же проблема. У меня нет подписок. Для меня закрытие WebSocket занимает слишком много времени (20-50 секунд)
Я старался:
userAgent.transport.ws.close()
чтобы убедиться, что моя проблема связана с WebSocket.У меня нет конкретных конфигураций, просто следовал руководству SIP.js. по воспроизведению. Я не знаю, помогает ли это или связано с моей проблемой, но я попытался открыть WebSocket с протоколом sip без какой-либо библиотеки и закрыл его. Оба они длились менее 1 секунды.
Самый полезный комментарий
У меня такая же проблема. У меня нет подписок. Для меня закрытие WebSocket занимает слишком много времени (20-50 секунд)
Я старался:
userAgent.transport.ws.close()
чтобы убедиться, что моя проблема связана с WebSocket.У меня нет конкретных конфигураций, просто следовал руководству SIP.js. по воспроизведению. Я не знаю, помогает ли это или связано с моей проблемой, но я попытался открыть WebSocket с протоколом sip без какой-либо библиотеки и закрыл его. Оба они длились менее 1 секунды.