我正在iOS上构建一个使用ejabberd的即时消息应用程序。我目前正在测试流管理功能,特别是在大多数情况下似乎有效的恢复。但是有一个我不明白的情况,我可以通过以下步骤进行复制,考虑到以下设置:resume_timeout:30,resend_on_timeout:if_offline
<message xmlns="jabber:client" from="clientB@mydomain" to="clientA@mydomain/resourceID" type="error" id="CFBF4583-209A-4453-2567-CCCC7894827E">
<body>test</body>
<active xmlns="http://jabber.org/protocol/chatstates" />
<request xmlns="urn:xmpp:receipts" />
<error code="503" type="cancel">
<service-unavailable xmlns="urn:ietf:params:xml:ns:xmpp-stanzas" />
</error>
</message>
我尝试使用ejabberd 16.01。
80%的时间都会发生这种情况;有时,A发送的消息会在30秒内重新连接时正确传送给B.
我的问题是:
resend_on_timeout
设置为if_offline
且未连接其他资源,因此我预计不会出现任何错误。我是对的吗?答案 0 :(得分:2)
这真的只是在黑暗中刺伤,但在浏览了ejabberd代码后,可能会发生这样的事情:
clientB@mydomain/ResourceB
删除了他们的连接,现在正在等待使用ResourceB
恢复的会话。ResourceB
。if_offline
。所以我的理论是if_offline
只检查是否有其他会话需要处理未确认消息的队列,而不是在最初收到消息时。
答案 1 :(得分:1)
@xnyhps'的回答是正确的,我fixed这个特殊的角落案例用于下一个ejabberd版本。但是,@ xnyhps也是正确的,有其他极端情况,所以如果你想要可靠的消息传递,你应该使用XEP-0313。 XEP-0198的主要特征是会话恢复。