Xmpp 如何在DB中存储pubsub有效负载

Xmpp 如何在DB中存储pubsub有效负载,xmpp,openfire,publish-subscribe,Xmpp,Openfire,Publish Subscribe,我正在使用XMPP pubsub。一切正常。用户可以创建节点,感兴趣的用户可以订阅该节点。但我想将发布操作存储到数据库中。因为在我的应用程序中,许多事情都是由pubsub处理的,比如聊天,在页面刷新时,我想继续聊天。所以我正在寻找任何openfire插件,它可以在后台保存到DB中。就像openfire在MUC(多用户聊天)的情况下保存聊天一样。我不想手动发送ajax请求。那么有没有办法记录发布项目呢 更新: 我的表单配置中存在一个问题,默认情况下,持久化项设置为false。因此,我按照您的建议配

我正在使用XMPP pubsub。一切正常。用户可以创建节点,感兴趣的用户可以订阅该节点。但我想将发布操作存储到数据库中。因为在我的应用程序中,许多事情都是由pubsub处理的,比如聊天,在页面刷新时,我想继续聊天。所以我正在寻找任何openfire插件,它可以在后台保存到DB中。就像openfire在MUC(多用户聊天)的情况下保存聊天一样。我不想手动发送ajax请求。那么有没有办法记录发布项目呢

更新: 我的表单配置中存在一个问题,默认情况下,持久化项设置为false。因此,我按照您的建议配置了节点。但是,我在页面刷新方面再次遇到一些问题。我将用一个示例向您解释。在我的应用程序中,用户A登录并创建一个节点,成功创建后,它会向用户B发送请求,现在用户B订阅用户A创建的节点。现在,如果任何用户进行页面刷新,我会发送一个get类型的IQ节,以获取所有错过的事件,如您上面提到的事件。但我需要错误400子ID

<body rid='430432056' xmlns='http://jabber.org/protocol/httpbind' sid='dca8aafc'><iq to='pubsub.abc' type='get' xmlns='jabber:client' id='3408:sendIQ'><pubsub xmlns='http://jabber.org/protocol/pubsub'><items node='3821poU5zq7nhn1'/></pubsub></iq></body>

作为回应,我得到:

  <body xmlns='http://jabber.org/protocol/httpbind'><iq type="error" id="3408:sendIQ" from="pubsub.abc" to="test@abc/dca8aafc"><pubsub xmlns="http://jabber.org/protocol/pubsub"><items node="3821poU5zq7nhn1"/></pubsub><error code="400" type="modify"><bad-request xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/><subid-required xmlns="http://jabber.org/protocol/pubsub#errors"/></error></iq></body>

所以你可以帮我找到错误的地方。我还阅读了链接点:6.5.9.1,上面说 如果请求实体对节点有多个订阅,但未指定订阅ID,则服务必须向订阅方返回错误。那么这是否意味着我再次订阅同一节点?
我检查了是否存在这种情况,但我只订阅了一次。因此,我只是想知道哪里出了问题。

根据XMPP的XEP-0060,PubSub节点的所有者有可能使节点上的项目在很遥远的将来过期

创建节点时,可能需要设置以下属性,以使节点上的项目永不过期

<field var='pubsub#persist_items' type='boolean' label='Persist items to storage'>
  <value>1</value>
</field>
<field var='pubsub#max_items' type='text-single' label='Max # of items to persist'>
  <value>999999</value>
</field>
<field var='pubsub#item_expire' type='text-single' label='Time after which to automatically purge items'>
  <value>999999999999</value>
</field>

1.
999999
999999999999
资料来源:

然后,当您想要检索所有项目时,您可能可以执行以下操作来检索数据:

<iq type='get'
    from='francisco@denmark.lit/barracks'
    to='pubsub.shakespeare.lit'
    id='items1'>
  <pubsub xmlns='http://jabber.org/protocol/pubsub'>
    <items node='princely_musings'/>
  </pubsub>
</iq>

资料来源:


这能解决您的问题吗?

如果您的目的是持久化所有项,那么请完全忽略max_items属性,而不是将其设置为任意大的值。对于项目_,此项将过期。当然,这还假设服务器已经实现了具有expire属性的规范的最新版本。您使用的是OpenFire吗?这是一个已知的错误。这只意味着您必须在请求中包含subid。