我已在客户端或服务器端启用流管理。我有两个用户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服务器上无效。
先谢谢你。
答案 0 :(得分:2)
答案 1 :(得分:2)
我假设在用户A之下,当他们重新连接时,没有使用流恢复(由XEP-0198: Stream Management定义)并且只是开始新会话。
这意味着在服务器端仍然存在等待流恢复发生的悬空过程。当用户A已经重新连接到服务器时,悬空过程超时(需要resume_timeout
秒)并将其存储的消息发送到传出消息缓冲区中。
如果您不喜欢这种行为,可以执行以下操作之一:
a)(不建议)禁用流管理并发送Message Archive Management查询(即使用mod_mam
)以在每次与服务器建立新连接时拥有最新的会话状态
b)启用流管理,但如果可能,则使用流恢复;也就是说,除非您没有先前的会话ID或服务器拒绝恢复请求,否则您总是尝试恢复上一个会话;理想情况下,您还将使用邮件存档管理
c)使用Delayed Delivery又名mod_offline,但在某些极少数情况下,如果您使用多个设备,则可能会将消息发送到错误的设备;例如,如果你有一部手机和一台笔记本电脑,你的消息可能会到达笔记本电脑,但永远不会到达手机