我正在使用 ejabberd 的 iOS 上构建即时通讯应用程序。我目前正在测试流管理功能,特别是在大多数情况下似乎有效的恢复。但是有一个我不明白的情况,我可以通过以下步骤复制,考虑到设置:resume_timeout:30,resend_on_timeout:if_offline
- 一开始客户端A和客户端B是连接的,没有连接其他资源
- 客户端 B 以不干净的方式崩溃或断开连接
- 客户端 A 开始非常快速地发送一堆消息(10+)
- ejabberd 为每个发送的消息向 A 发送一个 ack,以确认消息已到达服务器
- 崩溃后大约 20 秒,B 重新连接。此时 A 收到之前发送的每条消息的错误
<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。
我的问题是:
- 这种行为正确吗?如果已经收到消息的确认,我希望不会向客户端 A 退回任何错误。
- 由于
resend_on_timeout
设置为if_offline
并且没有连接其他资源,我希望完全没有错误。我对么?