android - 流管理中的死连接消息和送达回执接收延迟 - MongooseIM server 2.0.0

标签 android xmpp smack mongoose-im stream-management

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

我在我的 Android 应用程序上使用 smack-4.2 库,并使用以下代码在 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 服务器。

先谢谢你。

最佳答案

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

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

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

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

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

关于android - 流管理中的死连接消息和送达回执接收延迟 - MongooseIM server 2.0.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47571796/

相关文章:

java - 房间数据库强制 OnCreate 回调

java - Strope 能否用于在 java(jvm) 上与 Bosh Manager 建立 Bosh 连接?

android - 如何将用户添加到 xmpp 中的名册?

java - 无法向 openfire 服务器发送消息

java - 使用 Openfire、Smack 和 Play 的聊天网站架构!框架

android - 使用 gluon-mobile API 以编程方式打开/关闭 Android 中的 Wifi

java - 解析后应使用哪种数据结构来存储 XML 的不同标记值

java - 关于安卓权限的问题

xmpp - jabber 服务器的其他潜在用途

android - XMPP Smack - 如何检查连接是否处于 Activity 状态或已断开?