3

我在双方客户端或服务器中都启用了流管理。我有两个用户 A 和 B。两个用户都在线。然后用户 A 突然失去连接。但是 A 用户仍然在线出现在用户 B 和服务器上。在此期间,用户 B 在用户 A 上发送消息。这些消息不会丢失,但是当用户 A 再次出现在线时,它将在 2-3 分钟后收到这些消息。我将在离线存储和交付收据上收到消息节在 SM 存储上。此问题同样发生在一对一聊天和 mucLight 上。我需要定制任何 mongooseIM 模块吗?请指导我为什么用户在失去连接时会收到延迟消息。是否可以将 SM 存储更改为离线存储 (MAM)。这是相同问题的链接我在此链接上发现了相同的问题(https://www.ejabberd.im/faq/tcp) 但没有丢失我的消息,只是收到延迟。

smack-4.2在我的 Android 应用程序上使用 lib。下面的代码用于在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 connect to xmpp server with previous stream id但它不适用于 mongooseIM-2.0 服务器。

提前谢谢你。

4

2 回答 2

3

我假设用户 A 在重新连接时没有使用 Stream Resumption(由XEP-0198: Stream Management定义),而只是开始一个新会话。这意味着在服务器端仍有一个悬空进程等待流恢复发生。当用户 A 已经重新连接到服务器时,悬空进程会超时(需要resume_timeout几秒钟)并将其存储的消息发送到传出消息缓冲区中以进行传递。

如果您不喜欢这种行为,可以执行以下操作之一:

a)(不建议)禁用流管理并发送消息存档管理查询(即使用mod_mam)以在每次建立与服务器的新连接时获得最新的对话状态

b) 启用流管理,但尽可能使用流恢复;也就是说,你总是尝试恢复之前的会话,除非你没有之前的会话 ID 或者服务器拒绝了恢复请求;理想情况下,您还可以使用 Message Archive Management

c) 使用延迟交付又名 mod_offline,但在极少数情况下,如果您使用多个设备,则可能会将消息发送到错误的设备;例如,如果您有一部手机和一台笔记本电脑,您的消息可能会到达笔记本电脑,但永远不会到达手机

于 2017-12-04T09:40:11.140 回答
2

您是否尝试过使用mod_ping和配置ejabbered.cfg文件。

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

有关更多详细信息,请点击此链接mod_ping

于 2017-11-30T11:11:02.143 回答