Мертвое сообщение о соединении и получение полученной задержки в управлении потоком - сервер MongooseIM 2.0.0

Я включил управление потоком на стороне клиента или на сервере. У меня есть два пользователя A и B. Оба пользователя онлайн. Затем пользователь A внезапно теряет соединение. но пользователь по-прежнему отображается в сети как на пользователе B, так и на сервере. В течение этого времени пользователь B отправляет сообщение пользователю A. Эти сообщения не теряются, но когда пользователь A снова появится в сети, он получит это сообщение через 2-3 минуты. И я получу раздел сообщения в автономном хранилище и квитанцию ​​о доставке, которую я получу. на SM-хранилище. Эта же проблема возникает в чате один на один и mucLight. Мне нужно настроить любые модули mongooseIM. Пожалуйста, объясните мне, почему пользователи получили сообщение о задержке, когда они потеряли свое соединение. Можно ли сменить хранилище SM на автономное хранилище (MAM). Вот ссылка для той же проблемы. Я нашел ту же проблему по этой ссылке ( https://www.ejabberd.im/faq/tcp), но не потерял свои сообщения, а только получил задержку.

Я пользуюсь smack-4.2 lib на моем Android-приложении и следующий код, используемый для включения управления потоками в XMPPTCPConnection,

  static{
        XMPPTCPConnection.setUseStreamManagementDefault(true);
        XMPPTCPConnection.setUseStreamManagementResumptionDefault(true);
   }

Вот мой ejabbered.cfg файл для mod_stream_management модуль

      {mod_stream_management, [
                       % default 100
                       % size of a buffer of unacked messages
                       % {buffer_max, 100}

                       % default 1 - server sends the ack request after each stanza
                       % {ack_freq, 1}

                       % default: 600 seconds
                       % {resume_timeout, 600}
                      ]},

Я также включил следующий модуль в моем конфигурационном файле

   %% Only archives for c2c messages, good performance.
  {mod_mam_odbc_user, [pm]},
  {mod_mam_cache_user, [pm]},
% {mod_mam_mnesia_dirty_prefs, [pm]},
% {mod_mam_odbc_arch, [pm, no_writer]},
  {mod_mam_odbc_async_pool_writer, [pm]},
  {mod_mam, []}

Я нашел небольшое решение здесь smack подключиться к серверу xmpp с предыдущим идентификатором потока, но это не работает на сервере mongooseIM-2.0.

Заранее благодарю.

2 ответа

Ниже я предполагаю, что пользователь А при повторном подключении не использует возобновление потока (как определено в XEP-0198: Управление потоком) и просто начинает новый сеанс. Это означает, что на стороне сервера по-прежнему висит процесс, ожидающий возобновления потока. Когда пользователь A уже повторно подключен к серверу, время ожидания зависает (что занимает resume_timeout секунд) и отправляет сохраненные сообщения для доставки в буфер исходящих сообщений.

Если вам не нравится это поведение, вы можете сделать одно из следующих:

а) (не рекомендуется) отключить управление потоком и отправить запрос управления архивом сообщений (который используется mod_mam) иметь самое актуальное состояние разговора каждый раз, когда вы устанавливаете новое соединение с сервером

b) оставить управление потоком включенным, но использовать возобновление потока, если это возможно; то есть вы всегда пытаетесь возобновить предыдущий сеанс, если у вас нет идентификатора предыдущего сеанса или сервер не отклонил запрос на возобновление; в идеале вы также должны использовать управление архивами сообщений

c) использовать отложенную доставку, известную как mod_offline, но есть риск, что в некоторых редких случаях, если вы используете несколько устройств, сообщения могут быть отправлены не на то устройство; Например, если у вас есть телефон и ноутбук, ваши сообщения могут дойти до ноутбука, но никогда не дойдут до телефона.

Вы пытались использовать mod_ping и настроить на ejabbered.cfg файл.

{mod_ping, [{send_pings, true}]},

Для получения более подробной информации, пожалуйста, перейдите по этой ссылке.

Другие вопросы по тегам