【问题标题】:Retrieving last items from XMPP PubSub Node with Smack always returns only a single item使用 Smack 从 XMPP PubSub 节点检索最后一个项目总是只返回一个项目
【发布时间】:2015-07-12 09:10:28
【问题描述】:

我正在为我的 Android 应用程序使用最新的 Smack (4.1)。

从节点检索持久性项目时,它是否只返回每个用户最新发布的项目?现在,当我尝试调用 getItems 时,我似乎只能从每个用户那里获得最新发布的事件。我想从节点中检索 所有 项,即使每个用户有多个项目。

这是我目前用于检索的代码:

PubSubManager manager = new PubSubManager(connectionManager.getConnection());  
node = manager.getNode(nodeList);  
Collection<PayloadItem<EventItem>> eventItems = node.getItems(25);  
Log.e(TAG, "Collection size: " + eventItems.size());  
List<PayloadItem<EventItem>> payloadList = new ArrayList<>();  

for(PayloadItem<EventItem> payload : eventItems) {  
     eventItemList.add(payload.getPayload());  
}

这是我的节点配置表单:

ConfigureForm configureForm = new ConfigureForm(DataForm.Type.submit);  
        configureForm.setAccessModel(AccessModel.open);  
        configureForm.setDeliverPayloads(true);  
        configureForm.setNotifyRetract(true);  
        configureForm.setPersistentItems(true);  
        configureForm.setPublishModel(PublishModel.open);  

如您所知,setPersistentItems 是真的。如果一个用户将两个项目提交到一个节点,然后调用 getItems,则只会收到他们最新发布的项目。调试显示我只收到以下内容:

<?xml version="1.0" encoding="UTF-8"?>  
<iq to="pubsub.example.com" id="4cw4Z-27" type="get">  
   <pubsub xmlns="http://jabber.org/protocol/pubsub">  
   <items node="TESTNODE" max_items="25" />  
   </pubsub>  
</iq>  


<?xml version="1.0" encoding="UTF-8"?>  
<iq from="pubsub.example.com" to="afa@example.com/Smack" id="4cw4Z-27" type="result">  
   <pubsub xmlns="http://jabber.org/protocol/pubsub">  
      <items node="TESTNODE">  
         <item id="bool@example.com/Smack">  
            <newevent xmlns="http://jabber.org/protocol/newevent" xml:lang="en">  
               <sender>bool@example.com</sender>  
               <title>Test Title 2</title>  
               <description>Test description</description>  
            </newevent>  
         </item>  
      </items>  
   </pubsub>  
</iq>  

这是我在调试中收到的唯一内容。除了该特定用户和其他用户的最新发布的项目外,不存在其他项目。

很明显,我正在接收存储在节点中的项目,但是服务器只返回每个用户最新发布的项目。我想检索发布到节点的所有项目,无论它是否是该用户的最新项目。

这是服务器设置问题吗? 我感谢任何意见或建议。 谢谢!

【问题讨论】:

    标签: java xmpp publish-subscribe smack


    【解决方案1】:

    这可能是服务器限制。 XEP-60 6.5.7 使max_items 成为可选功能。

    【讨论】:

    • 感谢流的回复。我目前正在使用 eJabberd 并将 max_items 设置为 100。但是,不幸的是,这并没有解决问题。您对如何克服限制有什么建议吗?或者也许是另一种方法?不幸的是,我正在考虑切换到 MUC。
    • 是的,我在创建新节点时将其添加到配置表单中。我还为 eJabberd 配置服务器端启用了两个选项:{max_items_node, 1000}, {max_items, 100}。它仍然只获取该特定用户的最新项目
    • 那么,不用我仔细看xep60,我建议你看一下提供PubSub的组件。
    • Hey Flow,我实际上最终找出了问题所在。仔细查看文档后,我意识到我通过不让服务器生成它们来覆盖 ID。所以我将有效负载项目的 ItemID 设置为 null,现在它可以工作了!以前,我将 ID 设置为用户的 JID,这就是它被覆盖的原因。谢谢!!
    【解决方案2】:

    我将有效负载项的 JID 设置为用户的 JID。结果,我覆盖了以前的 ID,并且用户以前提交的内容也被覆盖了。我将 PayLoadItem 的 ItemID 设置为 null,让服务器每次都生成一个唯一的 ID,这样之前的项目就不会被覆盖。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-20
      • 2021-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多