Erlang ejabberd如何将脱机聊天保存到spool表中

Erlang ejabberd如何将脱机聊天保存到spool表中,erlang,xmpp,ejabberd,smack,asmack,Erlang,Xmpp,Ejabberd,Smack,Asmack,我使用ejabberd开源服务器来实现我的聊天应用程序。它成功地传递和接收消息,但有时传递确认和读取确认会丢失 如果客户端将连接关闭会话节发送到ejabberd服务器,则进一步的消息肯定存储在spool表中。考虑客户端网络中存在问题的情况,客户端断开连接而不向服务器发送关闭会话节。服务器假定客户端仍然在线,并且不将消息存储到假脱机表中 但当客户端联机时,所有挂起的消息都会传递给客户端(spool加上服务器认为客户端联机时的一些消息) ejabberd在哪里存储脱机消息而不是假脱机表?如果您没有正

我使用ejabberd开源服务器来实现我的聊天应用程序。它成功地传递和接收消息,但有时传递确认和读取确认会丢失

如果客户端将连接关闭会话节发送到ejabberd服务器,则进一步的消息肯定存储在spool表中。考虑客户端网络中存在问题的情况,客户端断开连接而不向服务器发送关闭会话节。服务器假定客户端仍然在线,并且不将消息存储到假脱机表中

但当客户端联机时,所有挂起的消息都会传递给客户端(spool加上服务器认为客户端联机时的一些消息)


ejabberd在哪里存储脱机消息而不是假脱机表?

如果您没有正确关闭会话,则根据您的服务器内核TCP/IP配置,服务器可能会检测到连接已丢失。在这种情况下,不会通知ejabberd TCP连接无效,并在该TCP连接上发送消息。服务器在TCP堆栈中缓冲它们。从ejabberd的角度来看,这些消息已经发送,因此它们不需要存储在脱机存储中。当给定用户没有打开会话时,ejabberd将消息存储在脱机存储中,但在这种情况下,存在打开的会话


要为ejabberd社区版本的消息添加更高级别的可靠性,您需要实现确认,可能还需要ping。您可以研究实现并可能从服务器启用以检测连接丢失。

考虑流意外关闭且从未恢复的情况(发生超时)。建立新连接后,服务器上存储的缓冲区数据会发生什么变化。然后它是否也传输到客户端,或者我是否必须实现一些ejabberd模块来克服这一问题。如果流管理/ping用于消息可靠性,那么当会话结束时,消息将被放置在脱机存储中。流管理恢复的理想超时值应该是什么?目前,我们已经将其保留了120秒,但客户端上的一些小节正在丢失。在ejabberd日志中,它显示9节(仅举个例子)未被客户端确认。我应该增加到24*60*60吗?