XMPP查询存档(按最新消息)

XMPP查询存档(按最新消息),xmpp,ejabberd,Xmpp,Ejabberd,我正在阅读以查询Ejabberd,查找与某个用户存档的邮件 这是我要发送的xml: <iq type='get' id='get_archive_user1'> <query xmlns='urn:xmpp:mam:tmp'> <with>user1@localhost</with> <set xmlns='http://jabber.org/protocol/rsm'> <max>20</max>

我正在阅读以查询Ejabberd,查找与某个用户存档的邮件

这是我要发送的xml:

<iq type='get' id='get_archive_user1'>
 <query xmlns='urn:xmpp:mam:tmp'>
  <with>user1@localhost</with>
  <set xmlns='http://jabber.org/protocol/rsm'>
   <max>20</max>
  </set>
 </query>
</iq>

user1@localhost
20
我正确地收到了前20条消息。要再次请求,我将添加标记:

<after>(id in element "Last" from last request)</after>
(上次请求中元素“Last”中的id)

这也很有效。我需要的是接收最后20条消息,而不是前20条消息。如何实现此目的?

您应该添加一个空的
元素:


user1@localhost
20
请参阅。

依靠进行分页

RSM规范说明:

请求实体可以通过在其请求中包含一个空的
元素和要返回的最大项数来请求结果集中的最后一页

这意味着您需要在结果集查询中添加一个空的
元素

下面是一个基于XEP-0313版本0.4的示例,介绍如何在与给定用户的对话中获取最后20条消息。查询限制由参数
max
定义(它定义了页面的大小)


  
    
      
urn:xmpp:mam:0
      
      
        juliet@capulet.lit
      
    
    
20
    
  

想要使用Smack获取此信息的人可以使用以下代码

 public MamManager.MamQueryResult getArchivedMessages(String jid, int maxResults) {

        MamManager mamManager = MamManager.getInstanceFor(connection);
        try {
            DataForm form = new DataForm(DataForm.Type.submit);
            FormField field = new FormField(FormField.FORM_TYPE);
            field.setType(FormField.Type.hidden);
            field.addValue(MamElements.NAMESPACE);
            form.addField(field);

            FormField formField = new FormField("with");
            formField.addValue(jid);
            form.addField(formField);

            // "" empty string for before
            RSMSet rsmSet = new RSMSet(maxResults, "", RSMSet.PageDirection.before);
            MamManager.MamQueryResult mamQueryResult = mamManager.page(form, rsmSet);

            return mamQueryResult;

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

非常感谢你。这完全符合我的预期。为了加载接下来的20条消息,我添加了(最后一个请求的第一个消息ID),它也工作得很好!Mickeel您知道这个xml是否应该以完全相同的方式来请求MUC消息吗?我只是使用了相同的xml,并将用户jid替换为房间jid。它返回0,但我可以看到ejabberd数据库表archivei收到的消息无法解析symbol MamManager,如何解决它?@gaurang,我想你需要添加smack作为依赖性。
 public MamManager.MamQueryResult getArchivedMessages(String jid, int maxResults) {

        MamManager mamManager = MamManager.getInstanceFor(connection);
        try {
            DataForm form = new DataForm(DataForm.Type.submit);
            FormField field = new FormField(FormField.FORM_TYPE);
            field.setType(FormField.Type.hidden);
            field.addValue(MamElements.NAMESPACE);
            form.addField(field);

            FormField formField = new FormField("with");
            formField.addValue(jid);
            form.addField(formField);

            // "" empty string for before
            RSMSet rsmSet = new RSMSet(maxResults, "", RSMSet.PageDirection.before);
            MamManager.MamQueryResult mamQueryResult = mamManager.page(form, rsmSet);

            return mamQueryResult;

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }