Мертвое сообщение о соединении и получение полученной задержки в управлении потоком - сервер 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}]},
Для получения более подробной информации, пожалуйста, перейдите по этой ссылке.