如何恢复Ejabberd / MongooseIM中与XEP-0022相关的丢失的<message>事件

时间:2018-11-16 16:29:59

标签: erlang xmpp chat ejabberd mongoose-im

我正在将MongooseIM用于XEP-0022 <消息>事件,例如<脱机>,<传递>,<显示>,<编写>等,以确认消息传递等。我对<脱机>和<组成>,但在另两个方面有困难。

如果两个用户(聊天)都在线,则一切正常。但是,如果考虑以下用例:

  1. 假设第二个用户处于脱机状态,并且第一个用户处于脱机状态,并发送所有4个事件的,然后脱机。
  2. 然后第二个用户上线(请记住,第一个用户现在处于脱机状态),并且该用户收到了<消息>,并作为回报,他发送了事件,现在第二个用户进入了脱机阶段。
  3. li>
  4. 在第一个用户再次上线后的某个时间里,他没有收到任何事件。

简而言之,两个都必须同时在线才能使其正常工作。所以,我的担心是:

  1. 如何确保将消息传递并显示给第二个用户,而又不会同时使它们同时联机。
  2. 我是否缺少某些东西,或者可以通过一些配置更改来解决?
  3. 我需要在这里使用FCM吗?

1 个答案:

答案 0 :(得分:2)

首先,XEP-0022被淘汰。最好遵循XSF的建议-这是标准化XMPP的基础-并使用更现代的XEP解决此问题。话虽如此,我将XEP-0085: Chat State Notifications用于<composing/>,如通知,将XEP-0333: Chat Markers用于<received/><displayed/>收据。

  

如何确保将消息传递并显示给第二个用户,而又不会同时使它们同时联机。

您应使用由MongooseIM(或ejabberd)的XEP-313: Message Archive Management实现的mod_mam。它将聊天历史记录保存在服务器的数据库中,使您可以随时获取过去的对话,而聊天伙伴不再在线。

默认情况下,mod_mam不存储不携带文本的消息(准确地说,没有<body/>子元素或为空),但是它是可配置的,并且为了存储XEP-333聊天标记,您必须重新配置它。存储XEP-85通知可能没有意义,因为它们仅在两个用户都在线时才有意义。

一旦您能够获取聊天标记,则客户端应用将必须查询消息存档,处理结果并查找与来自当前离线用户的消息相对应的任何聊天标记。请记住,虽然从在线用户发送的常规标记看起来像这样(XEP-333的示例4):

<message from='kingrichard@royalty.england.lit/throne'
         id='message-2'
         to='northumberland@shakespeare.lit/westminster'>
  <thread>sleeping</thread>
  <received xmlns='urn:xmpp:chat-markers:0' id='message-1'/>
</message>

从存档中返回给用户northumberland@shakespeare.lit的聊天标记看起来像这样-它将被包裹在“信封”中,表示它是存档查询结果:

<message id='aeb213'
    from='northumberland@shakespeare.lit'
    to='northumberland@shakespeare.lit/westminster'>
    <result xmlns='urn:xmpp:mam:2' queryid='f27' id='28482-98726-73623'>
        <forwarded xmlns='urn:xmpp:forward:0'>
            <delay xmlns='urn:xmpp:delay' stamp='2010-07-10T23:08:25Z'/>
            <message from='kingrichard@royalty.england.lit/throne'
                id='message-2'
                to='northumberland@shakespeare.lit/westminster'>
                <thread>sleeping</thread>
                <received xmlns='urn:xmpp:chat-markers:0' id='message-1'/>
            </message>
        </forwarded>
    </result>
</message>

通过这种方式northumberland@shakespeare.lit知道kingrichard@royalty.england.lit已收到<message id='message-1'/>,即使kingrichard@royalty.england.lit当前离线。