流连接消息和传递收据在流管理中收到延迟 - MongooseIM服务器2.0.0

时间:2017-11-30 10:58:44

标签: android xmpp smack mongoose-im stream-management

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

我在我的Android应用上使用了smack-4.2 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服务器上无效。

先谢谢你。

2 个答案:

答案 0 :(得分:2)

您是否尝试使用mod_ping并在ejabbered.cfg文件上进行配置。

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

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

答案 1 :(得分:2)

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

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

a)(不建议)禁用流管理并发送Message Archive Management查询(即使用mod_mam)以在每次与服务器建立新连接时拥有最新的会话状态

b)启用流管理,但如果可能,则使用流恢复;也就是说,除非您没有先前的会话ID或服务器拒绝恢复请求,否则您总是尝试恢复上一个会话;理想情况下,您还将使用邮件存档管理

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